回合制 堆栈溢出的问题

问题大概是这样的:
function Battle:sendToken()

hero:onReceiveToken()
return
….
end

function Hero:onReceiveToken()

battle:sendToken()
return

end

Battle是战斗系统,控制回合的流程,Hero是角色,battle会调用Hero:onReceiveToken方法,把控制权交给hero,让他执行工作,执行完后会调用Battle:sendToken把控制权返回给battle,这样就陷入了一个代码的循环,导致LUA ERROR :stack overflow的错误,有没有办法能让hero:onReceiveToken和battle:sendToken这2个调用改成异步调用,好让return语句结束把堆栈释放掉呢?前提是不能使用依赖cocos2dx的代码,所以类似performWithDelay的方法都不能用,因为这个模块是纯lua代码写的,给服务器调用生成录像用的。另外我看了下quick的状态机和事件也都不是异步的,因此也解决不了这个问题

协程什么的搞这个最好了

CCNotificationCenter:sharedNotificationCenter():postNotification

看看 samples/mvc 里 hero 和 enemy 是如何交互的

我的情况和samples的mvc还不一样,samples是由UI事件驱动的,而且控制器有个tick(dt)的帧函数是依赖cocos2d-x的,我的情况是要把一次性把所有比赛过程都走完才会有这种2个函数相互调用的情况

不能用依赖游戏引擎的代码,而且事件内部也是函数调用

看了半天才搞清楚楼主的需求是什么…

function Battle:sendToken()

return handler(hero, hero.onReceiveToken)
….

end

function Hero:onReceiveToken()

return handler(battle, battle.sendToken)

end

local func = handler(battle, battle.sendToken)
while func do
func()
end

大概应该是这样吧

嗯,既然不能异步执行,只能用这个办法了,把hander返回,堆栈释放完后再执行,谢谢你的提醒,可能是我的框架搭的不好才有这个问题

协程我也看了下,主要是解决异步引起的问题,还是解决不了这个问题

最终的解决办法是把需要延迟调用的hander都放到队列里头,然后开启一个循环执行:
function SGBattle:startRunLoop()
while #self.handlers_ > 0 and not self:isGameOver() do
local hander = self.handlers
table.remove(self.handlers_, 1)
hander()
end
self.handlers
= {}
end

function SGBattle:sendToken()
table.insert(self.handlers_, handler(self, self.__sendToken))
end

function SGBattle:__sendToken()
local event = {…}
self:dispatchEvent(event)
end