He estado luchando con la forma de implementar secuencias de comandos en mi motor de juego. Solo tengo unos pocos requisitos: debe ser intuitivo, no quiero escribir un lenguaje, analizador e intérprete personalizados, y no quiero usar hilos. (Estoy seguro de que hay una solución más simple; no necesito la molestia de múltiples hilos de lógica de juego). Aquí hay un script de ejemplo, en Python (también conocido como pseudocódigo):
def dramatic_scene(actors):
alice = actors["alice"]
bob = actors["bob"]
alice.walk_to(bob)
if bob.can_see(alice):
bob.say("Hello again!")
else:
alice.say("Excuse me, Bob?")
Esa pieza épica de narración plantea problemas de implementación. No puedo evaluar todo el método a la vez, porque walk_to
lleva tiempo de juego. Si regresa de inmediato, Alice comenzaría a caminar hacia Bob y (en el mismo marco) saludaría (o sería saludada). Pero si walk_to
es una llamada de bloqueo que regresa cuando llega a Bob, entonces mi juego se atasca, porque está bloqueando el mismo hilo de ejecución que haría que Alice caminara.
Pensé en hacer que cada función pusiera en acción una acción: alice.walk_to(bob)
empujaría un objeto a una cola, que se despegaría después de que Alice llegara a Bob, donde sea que estuviera. Eso está más sutilmente roto: la if
rama se evalúa de inmediato, por lo que Bob podría saludar a Alice incluso si le da la espalda.
¿Cómo manejan otros motores / personas las secuencias de comandos sin crear hilos? Estoy empezando a buscar ideas en áreas que no sean de desarrollo de juegos, como las cadenas de animación jQuery. Parece que debería haber algunos buenos patrones para este tipo de problema.