使用協程實現遊戲狀態機

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 是一個全局變量用於記錄兩次刷新幀之間的時間差的。

相關文章
相關標籤/搜索