martes, 19 de mayo de 2020

Maquina de estado infinito

¿ Que es una Maquina de estado?

Es un mecanismo para controlar los distintos estados que tiene un personaje. la maquina de estado se crea con un tipo de dato llamado Enum que es una colección de constantes evaluados pro el ramificador multidireccional Match.
Acá tenemos 4 estados.
Idle: Cuando está quieto
Run: Movimiento
Jump: Salto
Dead: Game over

Idle a Run: Vamos a programa que sea cuando se detecte la tecla izquierda y derecha.
Run a Idle: Será cuando después de estar en Run el speed es igual a cero
Idle a Jump: La transición se cumple cuando estamos en el suelo y cuando pulsamos la tecla hacia arriba
Jump a Idle: Se cumple cuando estamos en el suelo y el speed es igual a cero
Jump a Run: Si estamos en el suelo y la velocidad es distinta de cero
Run a Jum: La transición se cumple cuando estamos en el suelo y cuando pulsamos la tecla hacia arriba
A Dead: Todos los estados generan una transición a dead





Teniendo la escena de un personaje, vamos a ella y creamos dos nodos. Un sprite y un animation player

Luego al sprite le arrastramos un aset de los cuadros de la aniamción del personaje en formato png a texture

El aset contiene 19 imágenes. Para colocarlas en la misma posición, debemos seleccioanr primero el sprite, luego en inspector abrimos "animation" y cambiamos el valor de Hframe a 19. Con Frame vamos moviéndonos entres todos ellos

En animationPlayer creamos una animación nueva

Luego abrimos el inspector y modificamos algunos parámetros de la animación como el largo del cuadro

Luego hacemos los siguientes pasos. seleccionamos el sprite, vamos al inspector, seleccionamos el frame que corresponda a la animación que queremos hacer que en este caso es el Edle y corresponde al frame 7 hasta el 10. Al 7 que es el primer 4 le agregamos una clave

Seguidamente presionamos el key para agregar los otros cuadros de la animación. Para agrandar la planilla de tiempo usamos el Ctrl y la rueda

Luego hacemos lo mismo con los otros estados. Run que son 6 imágenes por ello en inspector colocamos 0.6 de lenght. Luego Jump que es solo una imagen y Dead que son dos

1. Ahora pasamos al código y lo primero que vamos a hacer es crear una variable tipo Enum definiendo los 4 estados en mayúscula por convención.
2. Luego necesitamos 3 variables
var state Para conocer el estado actual de las 4 constantes.
var current_animation Para mantener la animación actual
var new animation Para que diga si la animación a cambiado

3. La animación ira cambiando pero para ello necesitamos la funcion func transition_to y que esté recibiendo como parámetro el new_state
4. Luego tenemos que asignar el new_state (nuevo estado) a la variable state. Para ello simplemente igualamos new_state = state
5. Luego para evaluar el contenido de state usamos al palabra reservada Match. Match state
6. Al match con dos puntos señalamos los posibles casos que son los 4 estados que tenemos
7. Ahora para determinar por donde ingresará el flujo del código usamos el new animation para cada uno de los estados. Entonces a cada estado señalado seguido de dos puntos, expresaremos el new_animation = "estado"

(todo esto tiene que quedar al final)

8. Ahora vamos a usar la función Ready con "transition_to" y el estado idle para que empiece por defecto ahí. También agregamos el OS.center_window()
9. Luego usamos la funcion func physics_process(delta) y seguido de dos puntos lo que hacemos es evaluar si la animación actual es distinta a la nueva animación (new_animation) y siendo así se asigne a lo nuevo. Usamos la siguiente operación: Si (if) current_animation es distinto (!=) a new_animation (seguido de dos puntos) igualamos current_aniamtion con new_aniamtion, y lo enviamos a reproducir por medio del nodo $Animationplayer.play(current_aniamtion)

10. Ahora debemos programar las transiciones

Evaluemos que tenemos para poder determinar el estado actual. Si queremos programar la transición de:
IDLE a RUN preguntamos: Si (if) state es igual (==) a IDLE y (andvelocity.x es distinta (!=) de cero, quiere decir que estamos corriendo (:transition_to(RUN))

RUN a IDLE preguntamos: Si (if) state es igual (==) a RUN y (andvelocity.x es igual (==) a cero, quiere decir que estamos quietos  (:transition_to(IDLE))

IDLE o RUN a JUMP preguntamos: Si (if) state está en (in[IDLE, RUN] y (and) no está en el suelo (!is_on_floor()), quiere decir que estamos en el aire (:transition_to(JUMP))

JUMP a IDLE preguntamos: Si (if) state es igual (==) a JUMP y (and) está en el suelo (is_on_floor()), quiere decir que estamos quietos (:transition_to(IDLE))



Apuntes tomados del tutorial de Irwin Rodriguez:https://www.youtube.co m/watch?v=jRpao7ztWBg&list=PLlFOKoWJ_eWbujM7hiUVB7ioPom94ShIL&index=21

No hay comentarios:

Publicar un comentario