Comunidad Game Maker

Ayuda => Preguntas y respuestas => Mensaje iniciado por: Xizotono en Agosto 16, 2014, 01:52:11 AM

Título: Destruccion de objeto al pisarlo
Publicado por: Xizotono en Agosto 16, 2014, 01:52:11 AM
Bueno, tengo un objeto que en forma normal no pasa nada si pulsas vk_down, pero intento que estando en otro tipo de forma (llamada fuerte en el ejemplo) pues si pulsas abajo quiero que destruya el/los bloque/s que haya debajo suya.

Hice la colision con dicho objeto (obj_suelo1) y puse esto.

Colision obj.player -> obj.suelo1

if keyboard_check(vk_down) and tfuerte = 1 and not place_free(obj_player.x,obj_player.y+1) { with(obj_suelo1) {instance_destroy();}}


Pobre cambiar el with(obj_suelo1) a with(other).
Título: Re:Destruccion de objeto al pisarlo
Publicado por: penumbra en Agosto 16, 2014, 02:30:28 AM
1. Si el código ese lo usas desde el objeto player, no tiene caso usar la sintaxis de punto
[gml]obj_player.x y obj_player.y+1[/gml]
ya que x e y son locales a la instancia del jugador

2. Hay que entender la diferencia entre objeto e instancia. with (obj_suelo) no es una alternativa correcta en este caso, porque lo que se busca es destruír bloques individuales (una instancia solamente) y la forma with(obj_suelo) aplica a TODAS las instancias existentes del objeto suelo. Yo lo haría así

[STEP][gml]
abajo = keyboard_check(vk_down)
c_suelo = place_free(x, y+1)[/gml]

[EV. COLISION JUGADOR - SUELO][gml]
if (abajo) and (!c_suelo)
{
     with(other)
          instance_destroy()         //Esto destruye únicamente la instancia suelo contra la que se colisiona
}
[/gml]

Título: Re:Destruccion de objeto al pisarlo
Publicado por: Xizotono en Agosto 16, 2014, 12:51:24 PM
No me funciona, sigue sin destruir el objeto de abajo...simplemente no pasa nada.

PD: Solo funciona al saltar(o caer), en el aire mantener presionado hacia abajo y cuando colisiona si que funciona.

EDIT: Bueno da igual, hice que al presionar el boton de abajo el personaje autosaltara y como que golpee el suelo y por eso lo destroza, a quedado bien xD. Bueno si alguien quiere dar la solucion de que no haga falta caer pues que lo diga (a lo mejor es fallo de mi codigo :S)
Título: Re:Destruccion de objeto al pisarlo
Publicado por: Guacusio en Agosto 17, 2014, 12:15:47 AM
Cita de: penumbra en Agosto 16, 2014, 02:30:28 AM
2. Hay que entender la diferencia entre objeto e instancia. with (obj_suelo) no es una alternativa correcta en este caso, porque lo que se busca es destruír bloques individuales (una instancia solamente) y la forma with(obj_suelo) aplica a TODAS las instancias existentes del objeto suelo. Yo lo haría así

[STEP][gml]
abajo = keyboard_check(vk_down)
c_suelo = place_free(x, y+1)[/gml]

[EV. COLISION JUGADOR - SUELO][gml]
if (abajo) and (!c_suelo)
{
     with(other)
          instance_destroy()         //Esto destruye únicamente la instancia suelo contra la que se colisiona
}
[/gml]

Me parece excelente que recalques la importancia de hacer la diferencia entre instancia y objeto, muchos errores surgen por la no comprensión de este asunto primordial.

Respecto al tema, no sabemos cómo es que el jugador se mueve y cuándo colisiona con el suelo. Por eso me parece que el evento importante aquí es el de la tecla vk_down: ahí es cuando hay que revisar si hay un bloque de suelo abajo.

Evento key press vk_down del personaje:

var s;
while place_meeting(x,y+1,obj_suelo1)
    {
    s=instance_place(x,y+1,obj_suelo1);
    with s
        instance_destroy();
    }