Mam problemy z implementacją skryptów w silniku gry. Mam tylko kilka wymagań: powinien być intuicyjny, nie chcę pisać niestandardowego języka, analizatora składni i interpretera oraz nie chcę używać wątków. (Jestem pewien, że istnieje prostsze rozwiązanie; nie potrzebuję kłopotów z wieloma wątkami logiki gry.) Oto przykładowy skrypt w Pythonie (inaczej pseudokod):
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?")
Ten epicki kawałek historii stwarza problemy z implementacją. Nie mogę po prostu ocenić całej metody na raz, ponieważ walk_to
wymaga to czasu gry. Jeśli powróci od razu, Alice zacznie podchodzić do Boba i (w tej samej ramce) przywitać się (lub przywitać). Ale jeśli walk_to
zadzwoni blokujący, który powróci, gdy dotrze do Boba, moja gra utknie, ponieważ blokuje ten sam wątek wykonania, który zmusiłby Alice do chodzenia.
Zastanawiałem się nad tym, by każda funkcja kolejkowała akcję - alice.walk_to(bob)
przesuwałaby obiekt do kolejki, która odpadałaby po tym, jak Alice dotarła do Boba, gdziekolwiek był. Jest to bardziej subtelnie zepsute: if
gałąź jest oceniana natychmiast, więc Bob może powitać Alice, nawet jeśli odwróci się do niej plecami.
Jak inne silniki / ludzie radzą sobie ze skryptami bez tworzenia wątków? Zaczynam szukać pomysłów w obszarach nie przeznaczonych dla twórców gier, takich jak łańcuchy animacji jQuery. Wydaje się, że powinny istnieć dobre wzorce dla tego rodzaju problemów.