Я боролся с тем, как реализовать скрипты в моем игровом движке. У меня есть только несколько требований: это должно быть интуитивно понятно, я не хочу писать собственный язык, парсер и интерпретатор, и я не хочу использовать многопоточность. (Я уверен, что есть более простое решение; мне не нужны хлопоты из нескольких игровых логических потоков.) Вот пример сценария на Python (он же псевдокод):
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?")
Этот эпический кусок повествования создает проблемы с реализацией. Я не могу просто оценить весь метод сразу, потому что walk_to
занимает время игры. Если он сразу же вернется, Алиса начнет подходить к Бобу и (в том же кадре) поздороваться (или будет встречена). Но если walk_to
это блокирующий вызов, который возвращается, когда она достигает Боба, то моя игра застревает, потому что она блокирует тот же поток выполнения, который заставил бы Алису ходить.
Я подумал о том, чтобы заставить каждую функцию ставить в очередь действие - помещать alice.walk_to(bob)
объект в очередь, которая будет отбрасываться после того, как Алиса дойдет до Боба, где бы он ни находился. Это более тонко нарушено: if
ветвь оценивается немедленно, поэтому Боб может приветствовать Алису, даже если его спина повернута к ней.
Как другие движки / люди обрабатывают сценарии без создания потоков? Я начинаю искать идеи в областях, не связанных с разработкой игр, таких как цепочки анимации jQuery. Похоже, что для такого рода проблем должны быть хорошие шаблоны.