Estoy haciendo un juego para 2 jugadores tipo "Contra" y no he podido lograr que la vista siga a los 2 jugadores, es decir, el juego es de plataformas, y quiero que la vista no siga a los personajes si esta uno fuera de ella, quiero lograr ese efecto que si un personaje esta en un extremo y el otro en el otro extremo de la view, la camara no siga a ninguno hasta que uno de los dos se despegue y se acerque al otro, en pocas palabras que los personajes tienen que estar en la view, como si la condicion fuera que siga a ambos personajes...
He estado intentando con las funciones de la view, pero igual no obtengo un efecto deseado:

if (obj_Perro.x > view_xview[0] && obj_Perro.x < view_wview[0])  //si el perro esta en la view
{
  if (obj_gato.x > view_xview[0] && obj_gato.x < view_wview[0]){  //y el gato también
     view_object[0] = obj_Perro;     //la view seguira al perro
     }
  else
     view_object[0] = noone;   //si el perro esta a la vista y el gato no, entonces la view no seguirá a nadie
}
else
  view_object[0] = noone; //si el perro no esta ala vista, la view no seguirá  nadie
             

la view en room es de 640x480 al igual que el port.
Al ejecutar este código empieza bien, pero cuando el perro se sale del área en que apareció la view  ya no lo sigue, y lo que quiero es que mientras este el gato a la vista lo siga a donde sea.
usando port en lugar de view en el código pasa lo mismo.

¿En que estoy mal o que me hace falta agregar?
¿Hay otra forma de hacerlo mejor?

Gracias

Si la view puede moverse sin restricciones, o sea, puedes regresar por donde ya pasaste, entonces puedes hacer que el centro de la vista se posicione en el punto medio entre los dos personajes. Si el nivel es lineal, entonces la vista debe tomar en cuenta sólo al personaje más avanzado. ¿Qué tipo de juego es?

Concuerdo con lo que dice clamud, debes posicionar la view en un punto intermedio de ambos jugadores. Deberás estar calculando ese punto intermedio a cada paso.
Una forma sería:
Citar
intermedio=(jugador1.x + jugador2.x) / 2

La variable "intermedio" sería la coordenada x en la cual se posicionaría la vista; supongo que la altura del cuarto será el mismo.
También debes de poner la restricción a ambos jugadores de que no se puedan salir de la vista.

#3 Junio 16, 2015, 04:49:26 AM Ultima modificación: Junio 16, 2015, 05:00:03 AM por woolf7
Cita de: knd144 en Junio 15, 2015, 07:21:28 PM
Concuerdo con lo que dice clamud, debes posicionar la view en un punto intermedio de ambos jugadores. Deberás estar calculando ese punto intermedio a cada paso.
Una forma sería:
Citar
intermedio=(jugador1.x + jugador2.x) / 2

La variable "intermedio" sería la coordenada x en la cual se posicionaría la vista; supongo que la altura del cuarto será el mismo.
También debes de poner la restricción a ambos jugadores de que no se puedan salir de la vista.
Ok, este codigo es mucho mejor, ahora la vista se mueve con los dos personajes ya que constantemente cambia la posicion del punto medio, pero tengo un problema al tratar de bloquear el paso al salir de la view...
todo funciona bien al moverse hacia el lado izquierdo pero hacia el lado derecho se bloquea el paso de los personajes en cierto punto y nisiquiera esta ningun personaje fuera de la view, no se porque..
Este es el código que puse en el evento step de un obj_control:
var coordenada;                               //guardara el punto medio
coordenada = (obj_Perro.x + obj_gato.x)/2;   //obtiene el punto medio
coordenada -= 320;                        //como la view mide 640 en x, le resto 320 a la coordenada para que los personajes aparezcan en el centro
view_xview[0]= coordenada;    //view es igual al punto medio menos 320 pixeles
view_yview[0]= 0;


Y en ambos personajes puse en los codigos de movimiento:
if (x+5*argument0 <= (view_xview[0] +32) || x+5*argument0 >= (view_wview[0] -32))    //(argument0 es: 1(derecha) -1(izquierda))
  {;}   //si el personaje esta a 32 pixeles de la view_xview o la view_wview no pasara nada
  else{   //si no, el personaje ejecutara su código de movimiento


No se si se vera pero en la imagen 1, es la imagen principal en la que comienza el juego(los personajes están centrados)
En la imagen 2 la view no se mueve si los personajes toman lados contrarios, y se bloquea su paso al tratar de hacerlo(un punto a favor).
En la imagen 3 esta el error, los personajes se bloquean al moverse a la derecha incluso estando estos cerca uno del otro, (esto no pasa hacia la izquierda)

A ver digo yo porque no hacer una cámara que siga al objeto player
Que siga al player 1 por defecto y si la distancia entre los dos objetos es >300 que la view fuera 400x400 no se moviera la cámara para dos cámaras lacamara la lleva el que este en movimiento si el otro esta quieto así la lleva player 1 si el se mueve primero bueno no se si m explicado lo mismo hago ejemplo solo hay q darle otro enfoque.

Te falta sumar una variable dentro del if:
[gml]
if( x+5*argument0 <= view_xview[0]+32
or  x+5*argument0 >= view_xview[0]+view_wview[0]-32 )
{ /*no se mueve*/ }
else
{ /*ejecuta código de movimiento*/ }
[/gml]