Самым ярким примером сопрограмм являются, вероятно, старые графические приключенческие игры с графическими точками и щелчками, где они используются для написания сценариев катсцен и других анимационных эпизодов в игре. Простой пример кода будет выглядеть так:
# script_file.scr
bob.walkto(jane)
bob.lookat(jane)
bob.say("How are you?")
wait(2)
jane.say("Fine")
...
Вся эта последовательность не может быть написана как обычный код, так как вы хотите, чтобы Боб выполнял анимацию ходьбы после того, как вы сделали bob.walkto(jane)
вместо перехода прямо на следующую строку. Однако для воспроизведения анимации ходьбы вам необходимо вернуть управление игровому движку, и именно здесь в игру вступают сопрограммы.
Вся эта последовательность выполняется как сопрограмма, что означает, что у вас есть возможность приостановить и возобновить ее, как вам нравится. Команда, подобная bob.walkto(jane)
, таким образом сообщает объекту bob на стороне двигателя свою цель, а затем приостанавливает сопрограмму, ожидая вызова пробуждения, когда bob достигнет своей цели.
На стороне двигателя все может выглядеть так (псевдокод):
class Script:
def __init__(self, filename):
self.coroutine = Coroutine(filename)
self.is_wokenup = True
def wakeup(self):
self.is_wokenup = False;
def update():
if self.is_wokenup:
coroutine.run()
class Character:
def walkto(self, target, script):
self.script = script
self.target = target
def update(self):
if target:
move_one_step_closer_to(self.target)
if close_enough_to(self.target):
self.script.wakeup()
self.target = None
self.script = None
objects = [Character("bob"), Character("jane")]
scripts = [Script("script_file.scr")]
while True:
for obj in objects:
obj.update()
for scr in scripts:
scr.update()
Небольшое предупреждение, однако, хотя сопрограммы делают кодирование этих последовательностей очень простым, не все реализации, которые вы найдете, будут построены с учетом сериализации, поэтому сохранение игры станет довольно проблематичной проблемой, если вы интенсивно используете сопрограммы.
Этот пример также является самым основным случаем сопрограммы в игре, сами сопрограммы могут использоваться для множества других задач и алгоритмов.