Mayo 28, 2014, 07:02:44 PM Ultima modificación: Mayo 29, 2014, 09:00:55 PM por djboro88
Hola a todos !!
Tengo una duda sobre como hacer que se compruebe que dos objetos están colisionando a la vez.



La cuestión es:
Quiero que pase de room, solo y únicamente cuando playerRojo esté colisionando con metaRoja y además playerAzul esté colisionando con metaAzul.
¿Cómo se puede conseguir eso?
Saludos !!

Hay muchas maneras de lograrlo, por ejemplo:

if place_meeting( playerRojo.x, playerRojo.y, obj_metaRoja) and place_meeting( playerAzul.x, playerAzul.y, obj_metaAzul)
     //Cambiar de habitación




#2 Mayo 28, 2014, 08:24:57 PM Ultima modificación: Mayo 28, 2014, 08:33:20 PM por djboro88
Pero ese código, lo pongo dentro ¿de que evento?
CREATE, STEP, COLLISION...

Lo he colocado en el collision de obj_metaRoja y obj_metaAzul, pero no funciona.

#3 Mayo 28, 2014, 08:42:52 PM Ultima modificación: Mayo 28, 2014, 08:45:20 PM por penumbra
El código detecta colisiones, si se pone en un evento de colisión, no tiene mucho sentido, el evento de colisión hace la misma labor, por lo que el código entonces se podría desechar. Piensa como pensaría el GM  ;D (Por supuesto que se puede usar el evento de colisión y desechar el código, como dije, hay distintas maneras de hacerlo, pero si se usan los eventos de colisión es necesario crear más variables para comprobar la doble colisión )

He probado en eventos create, step y collision y en ninguno hace nada.
Le he dicho q en vez de que pase de nivel (como son pruebas y no tengo otra room), le he dicho q muestre un mensaje.

if place_meeting(obj_RedPlayer.x, obj_RedPlayer.y, obj_metaRoja) and place_meeting(obj_BluePlayer.x, obj_BluePlayer.y, obj_metaAzul){
    show_message("FIN");
}


Como digo, no sale el mensaje por ningun lado.
No se cual puede ser el problema. ¿Alguna idea?

#5 Mayo 28, 2014, 11:40:42 PM Ultima modificación: Mayo 28, 2014, 11:45:41 PM por Cerez0
Cita de: djboro88 en Mayo 28, 2014, 10:14:12 PM
He probado en eventos create, step y collision y en ninguno hace nada.
Le he dicho q en vez de que pase de nivel (como son pruebas y no tengo otra room), le he dicho q muestre un mensaje.

if place_meeting(obj_RedPlayer.x, obj_RedPlayer.y, obj_metaRoja) and place_meeting(obj_BluePlayer.x, obj_BluePlayer.y, obj_metaAzul){
    show_message("FIN");
}


Como digo, no sale el mensaje por ningun lado.
No se cual puede ser el problema. ¿Alguna idea?

porque no lo haces con variables?

En el create de cualquiera de los 2 jugadores (pero solo en 1 de los 2) pon esto:

global.fin = 0; // creamos la variable global y le damos valor 0


Despues tienes que poner en el  evento colision de cada jugador con su meta  pon esto:

global.fin += 1; // Sumamos 1 a la variable global fin


y en el obj meta pones esto en el  evento step (con que esto lo pongas en 1 de los 2 obj meta sobra):


// aqui decimos que si la variable global.fin es igual a 2 se cumpla la condicion (cuando los 2 llegan a la meta)
if global.fin = 2{
show_message("FIN");
}


prueba eso aver si te sirve ;) Un saludo


Te dejo un ejemplo. Segun entendi tienen que estar ambos jugadores en la meta al mismo tiempo para pasar de nivel, no???

No he visto tu ejemplo, pero lo que he hecho es lo siguiente.

Hacer un objeto y ponerlo al iniciar el room, con evento CREATE
//NIVEL 1
global.finNivel1_rojo = 0;
global.finNivel1_azul = 0;



Despues en las colisiones de los player:
global.finNivel1_rojo = 1;

global.finNivel1_azul = 1;

Y para terminar en una de las metas, en el evento STEP
if global.finNivel1_rojo = 1 and global.finNivel1_azul = 1 {
    show_message("FIN NIVEL 1");
}


Y así funciona perfecto !!

Pero de ese modo si por ejemplo el jugador rojo llega a la meta y se aleja y despues llega el jugador azul, aun asi se activaria el mensaje. No hay necesidad de crear un nuevo objeto, podrias poner ese codigo global.finNivel1_rojo = 0; global.finNivel1_azul = 0; en uno de los objetos meta.

#9 Mayo 29, 2014, 05:54:42 PM Ultima modificación: Mayo 29, 2014, 05:58:59 PM por djboro88
Cierto...  :-[

Entonces, para hacer que se muestre el mensaje solo cuando ambos players estén (tocando o colisionando en ella) en sus metas, ¿cómo se hace?

Ya lo tengo como yo quería !!
mezclando un poco de toda la ayuda recibida.

En un objeto aparte, en CREATE:
//NIVEL 1
global.finNivel1_rojo = 0;
global.finNivel1_verde = 0;

//Configuracion inicial
global.Score = 0;



Y en STEP:
//Están los dos tocando la meta
if global.finNivel1_rojo = 1 and global.finNivel1_azul = 1 { show_message("FIN NIVEL 1"); }

//Si tocan la meta cambiar variable a 1 sino 0
if place_meeting(obj_RedPlayer.x, obj_RedPlayer.y, obj_metaRoja){ global.finNivel1_rojo = 1; }else{ global.finNivel1_rojo = 0; }
if place_meeting(obj_BluePlayer.x, obj_BluePlayer.y, obj_metaAzul){ global.finNivel1_azul = 1; }else{ global.finNivel1_azul = 0 }


Nota: Lo hago en un objeto aparte para tenerlo mas claro si en el futuro me toca modificarlo.

Saludos y Gracias a todos !!