使用协程实现游戏状态机

http://www.mohiji.org/2012/12/14/lua-coroutines/ python

http://www.slideshare.net/naughty_dog/statebased-scripting-in-uncharted-2-among-thieves golang

lua 中的协程是一个古老的概念,在早期没有多线程的计算机上,使用协程来模拟多线程。在python, erlang, 以及golang中均可以看到相似的概念的影子。编程

协程特色就是保存了运行时的上下文,方便后续的重入。协程编程模型和传统的基于堆栈的调用和被调用编程模型不一样之处在于,协程之间是平等的,而调用和被调用关系是不平等关系。有些问题采用平等编程模型,能够比较简单的解决。最著名的问题就是词法分析问题。多线程

在词法分析程序中,须要对输入流进行处理,从中获取一个一个的token,接着讲token 传入给parser 使用。一种实现方案是先对全部的token 进行分析,最后将因此结果传给parser, 另一种方案就是使用协程。每分析出一个token以后,就挂起 词法分析程序, 调用parser, 在 parser 须要新的token的时候, 挂起语法分析协程,从上次挂起的词法分析位置,从新执行词法分析程序。ide


在游戏设计中存在一些的问题适合用协程来解决。例如要作一个cutscene,一系列时间轴动做。这是能够使用coroutine来执行这些动做, 下个动做等待上个动做结束。函数

代码相似于:  lua

xxxx(); .net

waitForTime(1);线程

bbbb();设计

waitForTime(2);


Cocos2dx 支持 lua 脚本,经过cocos2dx 自己的scheduler 来调度一个 update 函数。 在这个函数里面接着 coroutine.resume() 咱们的协程。  而这个协程里面就去执行这些序列化的时间轴操做。


那么要实现一个 waitForTime(xxx) 的函数如何实现呢?

function waitForTime(t)

    local passTime = 0

    while passTime < t do

          passTime = passTime+diff

          coroutine.yield() 

   end

end 

这里的diff 是一个全局变量用于记录两次刷新帧之间的时间差的。

相关文章
相关标签/搜索