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 = True
time_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 TimeState
PAUSED
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 changedFrom
changedTo
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.
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
@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 –
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