协同程序最突出的例子是旧的图形点击冒险游戏,它们用于编写游戏中的过场动画和其他动画序列.一个简单的代码示例如下所示:
# script_file.scr
bob.walkto(jane)
bob.lookat(jane)
bob.say("How are you?")
wait(2)
jane.say("Fine")
...
Run Code Online (Sandbox Code Playgroud)
这个整个序列不能写成普通代码,因为你想看到bob在你做完之后做他的步行动画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()
Run Code Online (Sandbox Code Playgroud)
然而,一个小小的警告,虽然协同程序使编码这些序列变得非常简单,但并不是每个你会发现它们的实现都会考虑序列化,因此如果你大量使用协同程序,游戏节省将成为一个非常棘手的问题.
这个例子也只是游戏中协程的最基本情况,协程本身也可用于许多其他任务和算法.
可以在游戏中使用协同程序的一种方式是像模特这样的演员中的轻量级线程,就像在Kamaelia中一样.
游戏中的每个对象都是Kamaelia'组件'.组件是一个对象,可以在允许暂停时通过产生暂停执行.这些组件还具有消息传递系统,允许它们以异步方式安全地相互通信.
所有对象将同时执行自己的操作,并在发生交互时将消息发送给对方.
因此,它并不是真正特定于游戏,但是当你有多个通信组件同时执行时,任何事情都可以从协同程序中受益.
| 归档时间: |
|
| 查看次数: |
3401 次 |
| 最近记录: |