首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >游戏设计的协程?

游戏设计的协程?
EN

Stack Overflow用户
提问于 2009-08-08 03:31:01
回答 5查看 3.9K关注 0票数 16

我听说协程是一种很好的构建游戏结构的方法(例如,PEP 342:“协程是表达许多算法的自然方式,比如模拟、游戏……”)但我很难理解这到底是怎么做的。

我从这个article中看到,协程可以表示状态机中使用调度程序相互转换的状态,但我不清楚这如何适用于游戏状态基于多个玩家的移动而变化的游戏。

有没有使用协程编写的游戏的简单示例?或者有人可以提供一个可能如何实现的草图?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-08-08 04:37:31

协程可以在游戏中使用的一种方式是在类似于演员的模型中作为轻量级线程,比如在Kamaelia中。

游戏中的每个对象都是一个Kamaelia‘组件’。组件是一个对象,它可以在允许暂停时通过让步来暂停执行。这些组件还具有一个消息传递系统,允许它们彼此之间安全地进行异步通信。

所有的对象都会同时做自己的事情,当交互发生时,消息会相互发送。

因此,它并不是真正特定于游戏,但是当您有大量并发运行的通信组件时,任何事情都可以从协程中受益。

票数 7
EN

Stack Overflow用户

发布于 2009-08-08 04:35:05

协程允许创建大量具有协作多任务的非常轻量级的“微线程”(即,微线程故意挂起自己以允许其他微线程运行)。阅读Dave Beazley关于这个主题的article

现在,很明显,这样的微线程在游戏编程中是多么有用。考虑一个实时策略游戏,其中你有几十个单元-每个单元都有自己的想法。对于每个单元的AI来说,在模拟的多任务环境中作为这样的微线程运行可能是一种方便的抽象。这只是一个例子,我相信还有更多的例子。

在谷歌上搜索“协程游戏编程”似乎会带来有趣的结果。

票数 10
EN

Stack Overflow用户

发布于 2009-08-09 09:11:35

协程的最突出的例子是可能古老的图形化的点击冒险游戏,它们用于在游戏中编写动画场景和其他动画序列。一个简单的代码示例如下所示:

代码语言:javascript
复制
# script_file.scr
bob.walkto(jane)
bob.lookat(jane)
bob.say("How are you?")
wait(2)
jane.say("Fine")
...

这整个序列不能像普通代码一样编写,因为你想看到bob在你做bob.walkto(jane)之后做他的行走动画,而不是直接跳到下一行。然而,对于要播放的行走动画,您需要将控制权交还给游戏引擎,这就是协程发挥作用的地方。

整个序列是作为协程执行的,这意味着您可以根据自己的喜好暂停和恢复它。因此,像bob.walkto(jane)这样的命令会告诉引擎端的bob对象它的目标,然后暂停协程,等待bob到达其目标时的唤醒呼叫。

在引擎方面,事情可能看起来像这样(伪代码):

代码语言:javascript
复制
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()

然而,需要警告的是,虽然协程使得这些序列的编码非常简单,但并不是你能找到的每一个实现都会考虑到序列化,所以如果你大量使用协程,那么节省游戏就会成为一个相当麻烦的问题。

这个例子也只是游戏中协程的最基本的例子,协程本身也可以用于大量的其他任务和算法。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1247894

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档