使用Lua检测键盘按键组合

3

我正在编写一个《魔兽世界》插件,希望插件能够根据按键或按键组合执行某些功能。现在大多数按键状态都是受保护的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个回答

2

如果您要使用表格,通常情况下最好保持相同的表格。

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中,所有的插件都共享同一个全局环境,因此最好保持其干净整洁,这样会更好。


1

我觉得它已经相当不错了。

但是,作为另一种选择,您可以使用表格:

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

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

更易读?可能是。更有效率?不太可能。但是当涉及到Lua的性能时,我并不是很了解。

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

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


谢谢Netfangled,另外我将LUA编辑为Lua。感谢您的提示 :)。 - Guinness Pqr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接