Buenas compañeros de la ComunidadGM. Acabo de empezar con GameMaker y me ha surgido una duda acerca de las colisiones. Tengo 4 personajes controlables y quiero que cuando todos ellos colisionen con un objeto concreto, me lleve a la siguiente pantalla. Es decir, que no me lleve a la siguiente pantalla hasta que todos y cada uno de los personajes hayan colisionado con ese mismo objeto. ¿Sabrían cómo hacerlo? Gracias y saludos :)

#1 Julio 03, 2017, 09:21:59 AM Ultima modificación: Julio 03, 2017, 09:35:02 AM por dannyjpt
Hola amigo que tal

Para tu inquietud se me ocurren muchas respuestas, por ejemplo puedes hacer esa verificacion en el evento step, en el objeto con el cual van a coalisionar los cuatro personajes.

vas a la pestaña control y seleccionas execute code y escribes lo siguiente:
 
if (place_meeting(x,y,obj_personaje1) && place_meeting(x,y,obj_personaje2) && place_meeting(x,y,obj_personaje3) &&
place_meeting(x,y,obj_personaje4))
{
     //aqui el nombre de la room a la cual deseas ir
     room_goto(room_lvl2);
}

la funcion "place_meeting" comprueba si estas en contacto con alguna instancia.

espero que te sirva de ayuda y si tienes dudas pregunta lo que desees amigo.

Cita de: dannyjpt en Julio 03, 2017, 09:21:59 AM
Hola amigo que tal

Para tu inquietud se me ocurren muchas respuestas, por ejemplo puedes hacer esa verificacion en el evento step, en el objeto con el cual van a coalisionar los cuatro personajes.

vas a la pestaña control y seleccionas execute code y escribes lo siguiente:
 
if (place_meeting(x,y,obj_personaje1) && place_meeting(x,y,obj_personaje2) && place_meeting(x,y,obj_personaje3) &&
place_meeting(x,y,obj_personaje4))
{
     //aqui el nombre de la room a la cual deseas ir
     room_goto(room_lvl2);
}

la funcion "place_meeting" comprueba si estas en contacto con alguna instancia.

espero que te sirva de ayuda y si tienes dudas pregunta lo que desees amigo.

Buenas dannyjpt. Gracias por responder. He puesto el script dentro de Execute a piece of code, tal y cómo me lo has escrito (escribiendo el nombre de la room a la que quería acceder):

if (place_meeting(x,y,obj_personaje1) && place_meeting(x,y,obj_personaje2) && place_meeting(x,y,obj_personaje3) &&
place_meeting(x,y,obj_personaje4))
{
     //aqui el nombre de la room a la cual deseas ir
     room_goto(room_Enhorabuena1);
}

Sin embargo, no me lleva a la room que le puse. No entiendo bien lo de la función place_meeting. Saludos.

Suponiendo que
*el personaje 1 toca el objeto desde arriba,
*el personaje 2 toca el objeto desde abajo,
*el personaje 3 toca el objeto desde la derecha,
*el personaje 4 toca el personaje desde la izquierda,
*los sprites de los personajes son de 32x32 y no están centrados (es decir su origen es x=0, y=0)
El código quedaría así

if (place_meeting(x,y-32,obj_personaje1) && place_meeting(x,y+32,obj_personaje2) && place_meeting(x+32,y,obj_personaje3) &&
place_meeting(x-32,y,obj_personaje4))
{
     room_goto(room_Enhorabuena1);
}

Espero que funcione.

Cita de: Zapdos43 en Julio 03, 2017, 03:57:54 PM
Suponiendo que
*el personaje 1 toca el objeto desde arriba,
*el personaje 2 toca el objeto desde abajo,
*el personaje 3 toca el objeto desde la derecha,
*el personaje 4 toca el personaje desde la izquierda,
*los sprites de los personajes son de 32x32 y no están centrados (es decir su origen es x=0, y=0)
El código quedaría así

if (place_meeting(x,y-32,obj_personaje1) && place_meeting(x,y+32,obj_personaje2) && place_meeting(x+32,y,obj_personaje3) &&
place_meeting(x-32,y,obj_personaje4))
{
     room_goto(room_Enhorabuena1);
}

Espero que funcione.

No me funciona :S El objeto con el que quiero que colisionen los 4 personajes está repartido por el escenario. Es decir, he copiado y pegado el mismo objeto 4 veces para los 4 personajes. Como es el mismo objeto, pienso que el código que se le aplica va a ser el mismo para los 4 objetos. No importa desde donde colisionen los personajes, solo que colisionen. Gracias y saludos :)

Entonces, existen 4 objetos "meta" (por llamarlo de alguna manera) y otros 4 "personajes".
He pensado que puedes hacer lo siguiente:
Creas 2 objetos: uno será el objeto meta_inactivo y el otro el objeto meta_activado (puedes ponerle los mismos sprites).

En el objeto del personaje, pon este código en STEP event:
if instance_number(meta_activo) == 4
{
room_goto(nivel); // pon el nombre de la room dentro del parentesis
}

Y en COLLISION EVENT con el objeto meta_inactivo, pon este codigo:
with(other)
{
instance_change(meta_activo, false);
}


Ahora solo coloca 4 objetos meta_inactivo y otros 4 personajes.  :)

Cita de: Zapdos43 en Julio 03, 2017, 06:34:33 PM
Entonces, existen 4 objetos "meta" (por llamarlo de alguna manera) y otros 4 "personajes".
He pensado que puedes hacer lo siguiente:
Creas 2 objetos: uno será el objeto meta_inactivo y el otro el objeto meta_activado (puedes ponerle los mismos sprites).

En el objeto del personaje, pon este código en STEP event:
if instance_number(meta_activo) == 4
{
room_goto(nivel); // pon el nombre de la room dentro del parentesis
}

Y en COLLISION EVENT con el objeto meta_inactivo, pon este codigo:
with(other)
{
instance_change(meta_activo, false);
}


Ahora solo coloca 4 objetos meta_inactivo y otros 4 personajes.  :)

Muy buenas. Está casi resuelto. El único problema es que cuando los personajes colisionan una vez con el objeto, este objeto puede ser atravesado por los personajes. Quiero que ese objeto sea firme y que no pueda atravesarse. Y que me lleve a la siguiente pantalla cuando los cuatro personajes estén colisionando a la vez con los 4 objetos. Gracias y saludos :)

En las propiedades de los objetos meta marca la casilla SOLID.  ;)

Cita de: Zapdos43 en Julio 03, 2017, 07:57:32 PM
En las propiedades de los objetos meta marca la casilla SOLID.  ;)

Le he dado, pero me sigue dando ese problema de que lo atraviesa a partir de la segunda vez que colisiona el personaje :S

#9 Julio 03, 2017, 08:58:25 PM Ultima modificación: Julio 03, 2017, 09:20:46 PM por Zapdos43
EDITO:
En el objeto del Personaje:
Collision con meta_activo:
speed = 0;

Collision con meta_inactivo:
speed = 0;

with(other)
{
instance_change(meta_activo, false);
}


Y los objetos meta deben ser sólidos (marcar SOLID). ;)

Cita de: Zapdos43 en Julio 03, 2017, 08:58:25 PM
EDITO:
En el objeto del Personaje:
Collision con meta_activo:
speed = 0;

Collision con meta_inactivo:
speed = 0;

with(other)
{
instance_change(meta_activo, false);
}


Y los objetos meta deben ser sólidos (marcar SOLID). ;)

Ahora sí. Muchas gracias amigo. Saludos :)

Cita de: Casas47 en Julio 03, 2017, 09:51:13 PM
Cita de: Zapdos43 en Julio 03, 2017, 08:58:25 PM
EDITO:
En el objeto del Personaje:
Collision con meta_activo:
speed = 0;

Collision con meta_inactivo:
speed = 0;

with(other)
{
instance_change(meta_activo, false);
}


Y los objetos meta deben ser sólidos (marcar SOLID). ;)

Ahora sí. Muchas gracias amigo. Saludos :)

Buenas otra vez. Lamento esto, es que lo he probado la primera vez y ha ido, a la segunda me he dado cuenta que no cumple la condición de que todos los personajes se encuentren tocando a la vez el objeto para pasar a la siguiente pantalla. :S

hola amigo, hay que tener muchas cosas en cuenta, por ejemplo la mascara de coalision, el punto de origen del sprite, como esta organizado tu codigo etc, pienso que debereias dar mas pistas de lo que estas haciendo y algunas secciones de codigo para poder mirar donde esta el fallo de la condicion, animo quedo atento.

Tan solo pon en el Step event del meta_activo:
if not collision_rectangle(x-1,y-1,x+1,y+1,objeto_personaje,false,true)
{
    instance_change(meta_inactiva,false);
}


Esto sirve para volver a poner el objeto meta_inactiva cuando el personaje deja de tocar la meta_activa. La funcion Collision_rectangle dibuja un area de colision rectangular alrededor del objeto que está usando dicha función, en este caso la meta_activa. Puedes informarte de esta función y otras funciones en la documentación de ayuda de yoyogames.  ;)

Cita de: Zapdos43 en Julio 03, 2017, 11:50:14 PM
Tan solo pon en el Step event del meta_activo:
if not collision_rectangle(x-1,y-1,x+1,y+1,objeto_personaje,false,true)
{
    instance_change(meta_inactiva,false);
}


Esto sirve para volver a poner el objeto meta_inactiva cuando el personaje deja de tocar la meta_activa. La funcion Collision_rectangle dibuja un area de colision rectangular alrededor del objeto que está usando dicha función, en este caso la meta_activa. Puedes informarte de esta función y otras funciones en la documentación de ayuda de yoyogames.  ;)

De acuerdo. Gracias por la ayuda. Ahora corre todo perfecto :)