Hola, que tal?
La cosa es que tengo una idea para empezar con un juego pero requiere de una parte donde habrá pistones gigantes que, golpeen el suelo, suban lentamente y trataran de aplastar al personaje, tengo la idea de como activar su caída rápidamente pero no se como devolverlos de a poco a su posición original y repetir la caída. Un ejemplo que tengo es el nivel de "Curious Factory" de Wario Land 4 donde hay un mecanismo así. Agradecería cualquier ayuda
Para lograr ese comportamiento necesitas una variable que controle el estado del objeto. Más bien sería cómo colocar condiciones, si se cumplen pasar de un estado a otro.
Inicialmente deberías crear la variable que controlase el comportamiento, osease, la variable que controla el estado:
Ev_create
[gml]
estado = -1;
[/gml]
Luego sería definir las constantes que puede tomar la variable estado. En GMS puedes usar enum para enumerar constantes, de momento mantenerlo simple sería lo óptimo, entonces puedes definir nuevas variables simplemente para fines de documentación y para que sea más fácil leer el código:
Ev_create:
[gml]
//definimos variables auxiliares para darle un valor a estado
ES_ESPERANDO = 0
ES_CAYENDO = 1
ES_SUBIENDO = 2
[/gml]
Estas variables ayudarían a determinar el estado actual del objeto, si está cayendo , si está arriba esperando o si está subiendo para retornar a su posicion.
Finalmente bastaría programar el comportamiento para que cambie de estados, ya dependiendo de cuándo se quiere que ocurran estos eventos.
Por colocar un ejemplo, podíamos hacer que nuestro pistón cayese cuando el personaje se encontrase debajo:
Ev_step:
[gml]
if (estado == ES_ESPERANDO) //estamos arriba esperando a que pase el jugador
if (collision_line(x+0,y+0,x+0,y+50, obj_personaje, false, true))//si se detecta que el jugador esta abajo del piston
estado = ES_CAYENDO; //determinar que está cayendo
if (estado == ES_CAYENDO) //si el estado es cayendo
vspeed = 2; //aumentar la velocidad vertical para que caiga
[/gml]
Esto haría que el pistón verifique si el jugador está debajo y cayese en ese caso.
Ahora tocaría hacer que se detuviera cuando colisiona con el suelo, y que subiera, para que al colisionar de nuevo con el techo, por ejemplo, se reestablezca a ES_ESPERANDO.
Para verificar constantemente los estados y el comportamiento estaría bien el evento step, en general. A menos que la lógica no lo requiera XD
Gracias :D