如何将参数传递给运行时事件侦听器?

好的,我有一个游戏,其中我使用一个运行时侦听器中的此函数:

local function moveenemy(target)

if(target.direction=="left") then

target:setSequence("left")
target:setLinearVelocity(-30,0)

else

target:setSequence("right")
target:setLinearVelocity(30,0)

end
end

我使用运行时侦听器将所有游戏敌人作为参数传递,例如:

Runtime:addEventListener("enterFrame",function() moveenemy(enemy1) end)
Runtime:addEventListener("enterFrame",function() moveenemy(enemy2) end)

现在当敌人死亡并且我需要删除其侦听器时,如何做到呢?显然以下内容无效:

Runtime:removeEventListener("enterFrame",function() moveenemy(enemy1) end)
Runtime:removeEventListener("enterFrame",function() moveenemy(enemy2) end)

谢谢。

点赞
用户3586583
用户3586583

通过一点谷歌搜索,我发现你可能正在使用 Corona。而从 文档 中我了解到除了事件名称外,你还需要传递函数。

这意味着你需要在定义函数时给函数命名,并在移除事件时引用它。

例如:

function myFunction()
    -- 代码
end

-- 将函数添加到事件中
Runtime:addEventListener("enterFrame", myFunction)
-- 将函数从事件中移除
Runtime:removeEventListener("enterFrame", myFunction)

你可以尝试将每个敌人的函数保存到敌人或其他可以使用敌人或敌人 ID 的存储中。这样你就可以做如下的操作:

-- 将函数添加到事件中
enemy1.Event = function() moveenemy(enemy1) end
Runtime:addEventListener("enterFrame", enemy1.Event)

-- 将函数从事件中移除
Runtime:removeEventListener("enterFrame", enemy1.Event)
enemy1.Event = nil
2016-07-28 18:17:42
用户6312494
用户6312494

创建一个表格(列表),列出敌人并在 enterFrame 函数中调用它们。因此,当敌人死亡时,将其从列表中移除。

local enemies = {enemy1, enemy2}

local myListener = function( event )
    for i=1, #enemies do
       moveenemy(enemies[i])
    end
end

Runtime:addEventListener( "enterFrame", myListener )
2016-07-29 02:30:07