Comunidad Game Maker

Ayuda => Preguntas y respuestas => Mensaje iniciado por: venus en Septiembre 04, 2015, 05:39:37 PM

Título: Detectar colision entre dos objetos.
Publicado por: venus en Septiembre 04, 2015, 05:39:37 PM
Hola, necesito detectar si dos objetos se están tocando. He probado con las funciones place_meeting y position_meeting pero no da resultado.

Y otra duda, necesito detectar esa colisión con un objeto que tiene varias copias en el mapa, pero solo quiero saber si colisiona con ese objeto en particular, no con él y cualquiera de sus copias. ¿Hay alguna manera de hacerlo? He leido que los objetos tienen un ID o algo así ¿Puedo usar eso para lo que quiero?
Título: Re:Detectar colision entre dos objetos.
Publicado por: Guacusio en Septiembre 04, 2015, 07:45:32 PM
Normalmente las colisiones se detectan en el evento Collision. Las funciones place_meeting y position_meeting están pensadas en el caso que necesites detectar si una instancia ubicada en un lugar diferente a su ubicación actual colisiona con otra instancia. Veo que tienes una confusión con los conceptos de instancia y objeto, cosa muy común por cierto (y cuya comprensión es crucial para poder programar en un lenguaje orientado a objetos como GML). Los objetos son conceptos abstractos, son "plantillas" que indican cómo deben reaccionar las instancias de esos objetos frente a eventos. Cuando creas un objeto en el editor y colocas el código para cada evento, lo que estás haciendo es definir esa plantilla. Luego, en el editor del room (o durante el juego, mediante la función instance_create) colocas instancias pertenecientes a objetos. No estás colocando objetos, estás colocando instancias de éstos, para que lo tengas claro. Cada instancia se comportará de acuerdo a los eventos que codificaste para su objeto respectivo pero al mismo tiempo cada instancia puede tener sus propias variables. Lo que colisiona en el juego no son objetos, son instancias de objetos. Cada instancia tiene un número que la identifica llamado id. Cuando creas una instancia de un objeto mediante instance_create, la función retorna la id de esa instancia. Las funciones place_meeting y position_meeting retornan true o false dependiendo de si existe una colisión, mientras que instance_place e instance_position retornan la id de la instancia con la que hay colisión. Tienes que tener en cuenta también que estas funciones asumen que la instancia desde la cual se invocan es la instancia que se usará para ver si existe una colisión.

Ahora, es difícil ayudarte sin saber qué es lo que pretendes hacer. Si simplemente quieres ejecutar un código cuando dos instancias colisionen, usa el evento de colisión del objeto correspondiente para definir qué pasará. Para saber con qué instancia ocurre la colisión, en el evento colisión evalúa la variable other.id y en base a ello toma las acciones correspondientes.