hola, tengo un juego en el cual estoy implementando trampas de pinchos que se caen desde arriba como picos de hielo, mi problema radica en que hay algunos que no caen.
el sistema funciona así: si el jugador esta debajo el pincho debe caer y al colisionar con el jugador o bien con un bloque tipo piso se debe reiniciar su coordenada (es decir que vuelva arriba).
El problema está en que no cae cuando el player está por debajo.
el codigo que uso en la trampa tipo pincho es el siguiente:
create:
image_single = 1;
caer = false;
reiniciar = false;
Step:
if (collision_line(x+16, y, x+32, y+128, coco, false, true))
caer = true;
if (caer){
vspeed = 8;
image_single = 0;
if (vspeed != 0)
alarm[0] = 60;
}
else
image_single = 1;
Alarma numero 0:
reiniciar = true;
y finalmente, colision con bloques del tipo piso:
if (reiniciar)
{
x = xstart;
y = ystart;
caer = false;
vspeed = 0;
reiniciar = false;
}
dejo una imagen en la cual se puede ver cómo cuando el personaje pasa por debajo de los pinchos se ponen en caer, pero no caen (los que estan marcados con amarillo) y se quedan así.
mientras que hay otro (marcado con verde) que sí que cae y daña al personaje.
ademas los pinchos son objetos no solidos, por lo que creo que deberian caer de todas maneras.
no sé porque anda mal :-X
segun pense, y luego tu imagen me lo confirmo creo que:
Los pinchos estan detectando colisión con los bloques de arriba, lo que fija su vspeed como cero y por eso no caen.
creo que podrias detectar esa colision desde el evento step con un place_meeting
Pues hay varios errores, por ejemplo, los parámetros que estás usando en collision_line() están creando una línea de colisión "chueca" (en diagonal) en lugar de una línea vertical.
El código
[gml]
if (vspeed != 0)
alarm[0] = 60;
[/gml]
no acciona la alarma de la manera que estás pensando, porque los STEPS en que la condición es verdadera pueden ser muchos, y durante esos steps la alarma no comenzará a contar, porque siempre está igualándose a 60.
La colisión que hace regresar a los pinchos a su lugar de origen debería verificar que eso ocurra sólo si los pinchos tienen una vspeed distinta de 0, eso evitaría que los pinchos se queden quietos por la razón que fega mencionó.
Está bien utilizar collision_line para determinar si el jugador esta debajo de un pincho, pero creo que yo optaría por usar (si el pincho tiene el origen centrado)
[gml]if (player.x < x+16) and (player.x > x-16) and !caer[/gml]
aahh ya me di cuenta de los errores XD fail
bueno a la final terminé escribiendo de nuevo el codigo de colision usando un poco de lo que dijo penumbra y me ahorré asi tener que usar la alarma.
gracias :D