Ich habe Probleme damit, Skripte in meiner Spiel-Engine zu implementieren. Ich habe nur ein paar Anforderungen: Es sollte intuitiv sein, ich möchte keine benutzerdefinierte Sprache, keinen Parser und keinen Interpreter schreiben und ich möchte kein Threading verwenden. (Ich bin mir sicher, dass es eine einfachere Lösung gibt. Ich brauche nicht den Aufwand mehrerer Game Logic-Threads.) Hier ist ein Beispielskript in Python (auch bekannt als 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?")
Dieses epische Stück Storytelling wirft Implementierungsprobleme auf. Ich kann nicht einfach die ganze Methode auf einmal bewerten, weilwalk_to
das Spiel Zeit kostet. Wenn es sofort zurückkommt, würde Alice auf Bob zugehen und (im selben Frame) Hallo sagen (oder begrüßt werden). Aber wenn walk_to
es sich um einen Blockierungsaufruf handelt, der zurückkommt, wenn sie Bob erreicht, bleibt mein Spiel hängen, weil er denselben Ausführungsstrang blockiert, der Alice zum Laufen bringen würde.
Ich überlegte, jede Funktion dazu zu bringen, eine Aktion alice.walk_to(bob)
in die Warteschlange zu stellen - ein Objekt in eine Warteschlange zu schieben, das auftauchte, sobald Alice Bob erreichte, wo immer er sich befand. Das ist subtiler gebrochen: dieif
Zweig wird sofort ausgewertet, sodass Bob Alice vielleicht begrüßt, selbst wenn er ihr den Rücken zugewandt ist.
Wie gehen andere Engines / Leute mit Skripten um, ohne Threads zu erstellen? Ich fange an, in Bereichen, die keine Spieleentwickler sind, wie jQuery-Animationsketten, nach Ideen zu suchen. Es scheint, dass es einige gute Muster für diese Art von Problem geben sollte.