8

Soy un desarrollador con experiencia en el desarrollo de juegos nuevos, y he creado un juego de plataforma en 3D bastante simple pero funcional y estoy buscando formas de hacer que la arquitectura sea más escalable.¿Cuáles son las buenas técnicas para manejar el cambio de estado y estado en el desarrollo de juegos?

¿Cuál es una buena forma de manejar el estado en el desarrollo de juegos?
Un enfoque muy ingenuo es tener múltiples booleanos como:

time_stopped = True 
time_slow_motion = False 
level_loaded = True 
level_paused = True 
level_completed = False 

Esto es muy inflexible, ya que un error desarrollador podría conducir a time_stopped = Truetime_slow_motion = True y, al mismo tiempo, lo que destruiría la lógica del juego.

Busco un mejor enfoque en la dirección de:

class TimeState: 
    STOPPED = 0 
    SLOW_MOTION = 1 
    NORMAL = 2 
    current_state = 0 

    def isStopped(self): 
     if current_state == self.STOPPED: return True 

Pero ¿cómo iba a manejar múltiples grupos de estado en el buen sentido? Podría crear un LevelState que tenía LOADED, PAUSED y COMPLETED estados. Pero, ¿cómo manejo los grupos superpuestos, como cuando LevelState y TimeStatePAUSED siempre deben ser iguales? ¿Existe un buen patrón de diseño o una buena práctica sobre cómo resolver la gestión estatal?

¿Cuál es una buena manera de manejar el cambio de estado?
Mis pensamientos son dar el objeto de estado, por ejemplo. LevelState funciones de devolución de llamada para ejecutar en cualquier cambio de estado dado o para sondear el objeto de estado en cada bucle de juego como if level_state.changedTo() == LevelState.COMPLETED: doStuff(). ¿Hay mejores formas de manejar esto? Colas de mensajes/eventos? No quiero incrustar la lógica en los objetos de estado.
También estoy interesado en si se debe manejar tanto changedFromchangedTo y eventos, y lo que sucedería si la lógica provocada por changedFrom cambia el estado del objeto antes de la lógica changedTo se dispara - ¿quién gana?

No quiero respuestas específicas de implementación/lenguaje pero consejos sobre una buena manera de pensar arquitectónicamente sabio.

+0

use python set() y make sets, puede basar su lógica en set.issubset(), etc ... también, creo que desea utilizar el patrón de observador – pyInTheSky

+0

@pyInTheSky ¡Gracias por señalar el patrón del observador! Soy consciente de las formas eficientes de codificar esto en python (aunque el juego actual está en C#), pero traté de hacer ejemplos más legibles que el rápido –

+2

si solo quieres una máquina de estado fácil, publiqué esto en estado activo: http: //code.activestate.com/recipes/577693-dynamically-generated-python-state-machine/ :: lo modifiqué pero no volví a publicar, puedes cambiarlo fácilmente para devolver una tupla y tener una función run() que actúa como árbitro, por lo que no crea una pila de llamadas gigante. También hay algunos otros mods que no he subido, como pedirle al sm que se regenere solo si agrega un estado, etc. ... pero es muy simple y quizás pueda ayudarlo – pyInTheSky

Respuesta

2

Esto es una cosa tan común que incluso hay un patrón: The State Pattern

Al principio, parece que este enfoque tiene algo de sobrecarga, pero a medida que la lógica se vuelve más complicado que va a ver los beneficios.

+0

Gracias por señalar el patrón de estado.Por supuesto que lo encontré a través de Google, pero me pregunto si hay variaciones/expansiones de él que coincidan mejor con el desarrollo del juego (ya que es muy general/simple). También estoy interesado en cómo puedo manejar el cambio de estado y la superposición de grupos estatales. –

Cuestiones relacionadas