J'ai du mal à implémenter les scripts dans mon moteur de jeu. Je n'ai que quelques exigences: cela devrait être intuitif, je ne veux pas écrire un langage personnalisé, un analyseur et un interprète, et je ne veux pas utiliser le filetage. (Je suis certain qu'il existe une solution plus simple; je n'ai pas besoin des tracas de plusieurs threads de logique de jeu.) Voici un exemple de script, en Python (alias pseudocode):
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?")
Ce morceau épique de narration pose des problèmes de mise en œuvre. Je ne peux pas simplement évaluer toute la méthode à la fois, car cela walk_to
prend du temps de jeu. Si cela revient tout de suite, Alice commencerait à marcher vers Bob et (dans le même cadre) dire bonjour (ou être salué). Mais s'il walk_to
y a un appel de blocage qui revient quand elle atteint Bob, alors mon jeu est bloqué, car il bloque le même fil d'exécution qui ferait marcher Alice.
J'ai envisagé de faire de chaque fonction la mise en file d'attente d'une action - alice.walk_to(bob)
pousserait un objet dans une file d'attente, qui serait sauté après qu'Alice ait atteint Bob, où qu'il soit. C'est plus subtilement cassé: la if
branche est évaluée immédiatement, donc Bob pourrait saluer Alice même si son dos lui est tourné.
Comment les autres moteurs / personnes gèrent-ils les scripts sans créer de threads? Je commence à chercher des idées dans des domaines autres que les développeurs de jeux, comme les chaînes d'animation jQuery. Il semble qu'il devrait y avoir de bons modèles pour ce genre de problème.