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 是否都被按下。我的问题更多是算法问题。有没有更好的方法以编程方式执行此操作?

4

2 回答 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

会好很多。在《魔兽世界》中,所有插件共享相同的全球环境,因此最好保持清洁。

于 2013-03-08T14:02:10.803 回答
1

对我来说似乎已经很好听了。

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

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

然后你可以打电话keys.altkeys["alt"]看看它是否被按下。

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

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

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

于 2013-03-07T23:01:08.230 回答