Lua 如果为true,我如何使事件只触发一次,而不是每次更新迭代都触发一次?

Lua 如果为true,我如何使事件只触发一次,而不是每次更新迭代都触发一次?,lua,Lua,我的事件侦听器代码如下所示: local events = {} function registerEvent (event) table.insert(events, event) end function unregisterEvent (event) table.remove(events, event) end function processEvents () for _, event in pairs(events) do for _,

我的事件侦听器代码如下所示:

local events = {}

function registerEvent (event)
    table.insert(events, event)
end

function unregisterEvent (event)
    table.remove(events, event)
end

function processEvents ()
    for _, event in pairs(events) do
        for _, condition in pairs(event.conditions) do
            if condition() then
                event.triggered = true;
            else
                event.triggered = false;
                break
            end
        end

        if event.triggered then
            event.callback()
        end
    end
end

registerEvent
{
    conditions = {
        function () return Keyboard.Shift == true end
    },
    callback = function () text = "triggered" end
}

registerEvent
{
    conditions = {
        function () return Keyboard.Shift == false end
    },
    callback = function () text = "not triggered" end
}
更新循环代码很简单:

function OnUpdate(deltaTime)
    processEvents()
end

基本上,我希望回调在条件为真时只触发一次,而不是每次额外的更新(然后在条件不为真时重置触发检查)。

根据评论中的讨论,通过对
processEvents
进行以下修改,您可以按照自己的方式完成此操作:

function processEvents ()
    for _, event in pairs(events) do
        for _, condition in pairs(event.conditions) do
            if condition() then
                event.triggered = true;
            else
                event.triggered = false;
                event.triggeredbefore = false
                break
            end
        end

        if event.triggered and not event.triggeredbefore then
            event.callback()
            event.triggeredbefore = true
        end
    end
end

这听起来像是你的键盘状态没有在帧结束时重置。是否有代码管理您的键盘?它实际上正在更新,但主要问题是我只希望它在满足条件的第一帧触发,而不是在满足条件的每一帧触发。您是否可以添加一个变量,跟踪某个变量是否被触发,然后在设置为true后不再调用它?e、 g.
如果event.triggeredbefore而不是event.triggeredbefore,那么event.callback()event.triggeredbefore=true end
我刚才做了。如果event.triggered然后event.callback()end替换为我刚才给你的代码,那么再次将triggeredbefore设置为false。e、 g.
如果条件()则event.triggered=true;else event.triggered=false;event.triggeredbefore=假中断结束