我希望在不同的节点上执行一系列操作。为此,我希望将每个动作作为该动作的单个序列处理,并且CCCallFunc指向控制动作序列的函数。
目前我正在尝试让代码只在一个节点上运行,但不幸的是我一直收到一个我无法弄清楚的错误。
下面是构建序列数组的代码。每次调用moveEast()时,都会向actionArray添加一个新序列。
actionArray = {}
function moveEast()
local posAction = CCMoveBy:create(0.2, cc.p(-47, 0))
local callback = CCCallFunc:create(handleActions)
actionArray[table.getn(actionArray) + 1] = {posAction, callback}
end
直接调用CCCallFunc中引用的函数,以启动解析序列列表的过程。
actionCounter = 0
handleActions = function ()
if actionCounter < table.getn(actionArray) then
actionCounter = actionCounter + 1
local actionSeq = actionArray[actionCounter]
layerMaze:runAction(actionSeq)
end
end
... lots of code ...
handleActions()
序列中的CCCallFunc工作正常,并调用handleActions(),但是当actionArray中有多个序列时,我收到以下错误:
cocos2d: [LUA-print] ----------------------------------------
cocos2d: [LUA-print] LUA ERROR: ASSERT FAILED ON LUA EXECUTE: Argument must be non-nil
cocos2d: [LUA-print] stack traceback:
[string "src/main.lua"]:13: in function <[string "src/main.lua"]:10>
[C]: in function 'runAction'
[string "GameScene.lua"]:312: in function <[string "GameScene.lua"]:304>
cocos2d: [LUA-print] ----------------------------------------
在调试器中运行时,我可以看到通过CCCallFunc调用handleActions()时所有变量都可用。
那里的任何人都知道出了什么问题?
更新1
我在调试器测试的交互式控制台中通过调用actionSeq变量上的函数setTag()来保存序列,该函数位于handleActions()函数中。
actionArray中的第一个序列可以轻松设置标记,但第二个序列返回以下错误:
=>actionSeq:setTag(2)
Execution error 206: [string "debugger"]:0: invalid 'cobj' in function 'lua_cocos2dx_Action_setTag'
我可以从该错误消息中收集到的最好的信息是,它与垃圾收集器或跨线程的变量范围有关。我尝试使用collectgarbage('stop')禁用垃圾收集器,但它没有任何影响。