コルーチンの最も顕著なケースは、おそらく古いグラフィカルなポイントアンドクリックアドベンチャーゲームであり、ゲーム内のカットシーンやその他のアニメーションシーケンスのスクリプトを作成するために使用されていました。簡単なコード例は次のようになります。
# 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)
は、エンジン側のボブオブジェクトにそのターゲットを通知し、コルーチンを一時停止して、ボブがターゲットに到達したときにウェイクアップ呼び出しを待機します。
エンジン側では、次のようになります(擬似コード)。
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()
ただし、コルーチンを使用するとこれらのシーケンスのコーディングが非常に簡単になりますが、それらのすべての実装がシリアル化を念頭に置いて構築されるわけではないため、コルーチンを多用するとゲームの保存が非常に厄介な問題になります。
この例は、ゲーム内のコルーチンの最も基本的なケースでもあります。コルーチン自体は、他の多くのタスクやアルゴリズムにも使用できます。