使用 CCCallFunc 解析序列列表的 Cocos 2D

我想执行一系列在不同节点上执行的操作。为此,我希望将每个操作处理为该操作的单独序列和指向控制操作序列的函数的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

... 大量的代码 ...

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

我正在调试器的交互式控制台中测试通过在handleActions()函数中持有序列的actionSeq变量上调用setTag()函数。

actionArray中的第一个序列可以轻松设置标记,但是第二个序列会返回以下错误:

=>actionSeq:setTag(2)
Execution error 206: [string "debugger"]:0: invalid 'cobj' in function 'lua_cocos2dx_Action_setTag'

从错误消息中,我能了解到它与垃圾回收器或跨线程变量范围有关。我尝试使用collectgarbage('stop')禁用垃圾回收器,但没有影响。

点赞