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).
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]
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)
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();
}