FIREFIGHTERS ACTION ¿Cómo se hace?

La gestion del fuego. Parte 2

¿Cómo se hacen los diagramas de estados con SWIFT?
Cuando realizamos un juego con SpriteKit, no disponemos de una librería que nos permita realizar una lógica de estados, para ello debemos importar la API GameplayKit, en ella tenemos una clase llamada GKState esta clase representa, una caja del dibujo, un estado. Vamos a verlo con más detenimiento.

Como ves tienes que crear por cada estado del diagrama una clase FuegoNivel0.swift , FuegoNivel1.swift … FuegoNivel3.swift, todos hijos de GKState.
Pero ¿Cómo sabe mi objeto (Ventana) que tiene todos esos estados?. Para agrupar todos los códigos de los distintos estados creados dentro de un objeto se utiliza una variable del tipo GKStateMachine que los contenga, como se muestra a continuación:
class Ventana: SKSpriteNode {
misEstados = GKStateMachine(states: [FuegoNivel0(ventana: self),
             FuegoNivel1(ventana: self),
             FuegoNivel2(ventana: self),
             FuegoNivel3(ventana: self),
            ])
    })
}

 

Si deseo actualizar los estados cada frame, en la función update de la escena recorro todos los objetos ventana y a la variable misEstados les hago el update.

class Game: SKScene {
// Inicializo los estados.
override func didMove(to: view: SKView) {
    Ventana.ventanas.forEach{$0.estados.enter(FuegoNivel0.self)}
}
// Actualizo los estados.
override func update(_ currentTime: TimeInterval) {
       if (self.lastUpdateTime == 0) {
            self.lastUpdateTime = currentTime
        }
        let dt = currentTime – self.lastUpdateTime
        self.lastUpdateTime = currentTime
        // Actualizo los estados de las ventanas.
        Ventana.ventanas.forEach{$0.misEstados.update(deltaTime: dt)}
    }
}
¿Cómo funciona la clase GKState?
La clase GKState consta 4 funciones que se ejecutan en el siguiente orden:
1.- didEnter(from previousState: GKState?)
Esta es la primera función que se ejecuta y se entra una sola vez, es muy útil para configurar todas las condiciones que se quieren en ese estado; Luego se va para el update. 
2.- update(deltaTime seconds: TimeInterval)
Update como su nombre lo indica es ideal para hacer las actualizaciones constantes, es decir, por aquí pasará 60 veces por segundo, así que mucho cuidado con lo que aquí se coloca.
3.- isValidNextState(_ stateClass: AnyClass) -> Bool
Antes de cambiar de estado pasa por aquí, la variable stateClass nos indica hacia donde se esta solicitando el cambio, es decir, cual sería el próximo estado al que se dirige, así que con esta información podremos decirle si el cambio de estado es válido o no retornando un verdadero o falso a esta función.
Si hacemos un return false, no se cambiará de estado, se mantendrá en el estado actual, aún cuando en el código del juego le indiquemos que queremos cambiar de estado, esto nunca sucederá porque esta función se encarga de evitarlo. Esta función como puedes ver es muy importante.
4.- willExit(to nextState: GKState).
A llegado el momento de decir adiós, esta es tú ultima oportunidad para hacer cambios en este estado, elimina las acciones, comportamientos, etc que creaste en este estado y que consideres que no se deben seguir ejecutando en el sujeto ó clase que contiene los estados.
Espero no haberte liado mucho, quería darte una idea de como se crean y funcionan los estados en GamePlayKit.

En el siguiente Post iremos avanzando y mostrando el desarrollo de Firefighters Action.  Mientras y para hacer la espera  más amena, podéis descargar y jugar cualquiera de los otros juegos para iPhone. 😉

 

Download games/Descarga  juegos.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *