使用Lua来检测键盘键的组合按键。

我正在编写一个魔兽世界插件,并希望它能够根据按键或按键组合执行特定的功能。现在,大多数按键状态都是受保护的 WoW API 函数,但以下函数仍然可以被插件使用:

IsAltKeyDown()
IsControlKeyDown()
IsShiftKeyDown()

我希望能够根据这些按键中的任意一个或组合来执行某个函数。

这是我的代码:

function KeyCombos()
    total = 0
    if IsShiftKeyDown() then
        total = total + 1
    end
    if IsControlKeyDown() then
        total = total + 2
    end
    if IsAltKeyDown() then
        total = total + 4
    end
end

我的问题并不一定是关于 Lua 的,因为上述函数是有效的,我可以检查 total 是否等于 6,例如查看是否同时按下了 Ctrl 和 Alt。我的问题更多是关于算法。是否有更好的方法进行编程?

点赞
用户1031671
用户1031671

我觉得这个已经很不错了。

作为替代方案,您可以使用表格:

function KeyCombos()
    keys = {
        shift = IsShiftKeyDown(),
        control = IsControlKeyDown(),
        alt = IsAltKeyDown(),
    }
end

然后您可以调用 keys.altkeys["alt"] 来查看是否按下。

更易读?可能吧。更高效?不太可能。但是我对 Lua 的性能不是很了解。

我只会在 KeyCombos 函数上面添加一个注释块,说明每种可能的组合及其含义。

顺便说一句,它是 Lua,不是 LUA。

2013-03-07 23:01:08
用户714557
用户714557

如果您要使用一个表格,一般情况下最好保留相同的表格。

function KeyCombos()
    keys = keys or {}

    keys.shift = IsShiftKeyDown()
    keys.control = IsControlKeyDown()
    keys.alt = IsAltKeyDown()
end

或者,如果您愿意,

function KeyCombos()
    if not keys then
        keys = {}
    end

    keys.shift = IsShiftKeyDown()
    keys.control = IsControlKeyDown()
    keys.alt = IsAltKeyDown()
end

然而,问题中的原始示例使用整数运算的效率更高。


但是这些示例都创建全局变量。因此,

function GetKeyCombos()
    local keys = 0

    if IsShiftKeyDown() then
        keys = keys + 1
    end
    if IsControlKeyDown() then
        keys = keys + 2
    end
    if IsAltKeyDown() then
        keys = keys + 4
    end

    return keys
end

会更好。在魔兽世界中,所有插件共享相同的全局环境,因此最好保持干净。

2013-03-08 14:02:10