使用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,例如,看看Control和Alt是否都被按下了。我的问题更像是一个算法问题。有没有更好的方法来程序化地执行这个?

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

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

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

对我来说已经很不错了。

但是,作为一种替代方法,您可以使用一个表:
function KeyCombos()
    keys = {
        shift = IsShiftKeyDown(),
        control = IsControlKeyDown(),
        alt = IsAltKeyDown(),
    }
end

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

可读性更强?可能。更有效率呢?不太可能。但是我对Lua的性能不是很了解。

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

作为旁注,它是Lua,而不是Lua。

相关内容

  • 没有找到相关文章

最新更新