使用Lua检测键盘按键组合

时间:2013-03-07 22:32:50

标签: lua add-on world-of-warcraft

我正在编写一个魔兽世界插件,我希望插件能够基于按键或按键组合执行某些功能。大多数关键状态现在都是受保护的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,因为上面的函数正在工作,因为我可以检查总数是否等于6,例如看看是否同时按下了Control和Alt。我的问题更多的是算法问题。是否有更好的方法以程序化方式执行此操作?

2 个答案:

答案 0 :(得分:1)

如果您打算使用表格,一般情况下保持同一张表会好得多。

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

会好得多。在WoW中,所有AddOns都共享相同的全局环境,因此最好保持它的清洁。

答案 1 :(得分:0)

对我来说似乎很有声音。

但是,您可以使用表格

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

然后,您可以致电keys.altkeys["alt"]查看是否已将其按下。

更具可读性?大概。更高效?不见得。但就Lua的表现而言,我并不是很了解。

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

As a side note, it's Lua, not LUA.