Noticias

Importante: ¡Si quieres publicar tu juego no olvides leer este tema!

* Sponsor

Comunidad Game Maker

Bienvenid@ a la comunidad hispana de Game Maker. Nuestro objetivo es crear videojuegos y dar soporte en castellano de GM. Para mejorar nuestro servicio hemos implantado, como adicion al reglamento general, algunas normas especificas en los subforos más comunes. ¡No olvides informarte antes de participar!.

Autor Tema: [SOLUCIONADO] Cómo detectar colisiones con múltiples instancias de un mismo obj  (Leído 466 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado rafitaes

  • Visitante
  • *
  • Puntos: 8
  • Mensajes: 2
    • Ver Perfil
Hola a todos, soy nuevo en esta comunidad y me gustaría hacer la primera pregunta:
¿Cómo puedo detectar colisiones de múltiples instancias pero de un solo objeto?
Estoy haciendo un Arkanoid, y me sucede lo siguiente: estoy tratando de realizar una colisión de la bola con un ladrillo (obj_verde). Para realizar esta colisión he pensado en dividirla en dos partes:
1.- Si la bola está por debajo o por encima de x píxeles desde el centro del ladrillo, sucederá una cosa. Para esto, ¿debería usar place_meeting o instance_place? He probado los dos pero el resultado no cambia.

//Código de la bola
diferencia_alturas = y - obj_verde.y
if (place_meeting(x+hspeed,y+vspeed,obj_verde)){ //obj_verde lo sustituiré por obj_padre en un futuro para realizar todas las colisiones de todos los ladrillos
     if ((diferencia_alturas > 8 ) or (diferencia_alturas < -8)){
          //Código para que rebote de una forma
     }

     2.- Si la bola colisiona a la altura del lateral del ladrillo

     if ((diferencia_alturas < 8 ) && (diferencia_alturas > -8)){
          //Código para que rebote de otra forma
     }
}
//Fin
Los rebotes ya los perfeccionaré a mi manera. La pregunta que quería hacer desde el principio es que, al debuguear el número de instancia con el que choca, siempre me muestra el mismo ( 8 ), choque con el que choque no hay manera de que me muestre la instancia con la que colisiona. Siempre me muestra la primera instancia que coloqué en la room. ¿Alguna sugerencia de como solucionar esto? ¿Cómo puedo hacer colisiones para múltiples instancias, y que al debuguear el número de instancia con el que choca no me muestre siempre el mismo?
Un saludo.
« Última modificación: Marzo 27, 2016, 05:01:19 pm por rafitaes »

 


No Tienes Permisos Para Dar Puntos
point 0 Puntos

Este tema no recibió puntos.


Desconectado correojon

  • El azote de los trollers y
  • Legendario
  • *
  • Puntos: 85
  • Mensajes: 4.112
  • Agradecido: 3 veces
  • No mercy
    • Ver Perfil
place_meeting() e instance_place() te dan información diferente:
  • place_meeting(): Devuelve true si hay colisión, false en caso contrario
  • instance_place(): Devuelve la id de la instancia con la que hay colisión, o noone si no hay colisión

De esta forma, el código:
Código: [Seleccionar]
if (place_meeting(x+hspeed,y+vspeed,obj_verde))es lo mismo que:
Código: [Seleccionar]
if (instance_place(x+hspeed,y+vspeed,obj_verde) != noone)
Si necesitas hacer algo con la instancia contra la que chocas, necesitarás usar instance_place(), por ejemplo:
Código: [Seleccionar]
var vId = instance_place(x+hspeed, y+vspeed, obj_verde);//Ahora podemos acceder al ladrillo con vId
if (vId != noone){
 ...
}

Espero que te sirva ;)


Desconectado rafitaes

  • Visitante
  • *
  • Puntos: 8
  • Mensajes: 2
    • Ver Perfil
place_meeting() e instance_place() te dan información diferente:
  • place_meeting(): Devuelve true si hay colisión, false en caso contrario
  • instance_place(): Devuelve la id de la instancia con la que hay colisión, o noone si no hay colisión

De esta forma, el código:
Código: [Seleccionar]
if (place_meeting(x+hspeed,y+vspeed,obj_verde))es lo mismo que:
Código: [Seleccionar]
if (instance_place(x+hspeed,y+vspeed,obj_verde) != noone)
Si necesitas hacer algo con la instancia contra la que chocas, necesitarás usar instance_place(), por ejemplo:
Código: [Seleccionar]
var vId = instance_place(x+hspeed, y+vspeed, obj_verde);//Ahora podemos acceder al ladrillo con vId
if (vId != noone){
 ...
}

Espero que te sirva ;)
¡Perfecto, justo lo que buscaba!
¡Muchas gracias!
Un saludo  :D