我正在编写《魔兽世界》插件,我希望该插件能够基于按键或按键组合执行某些功能。现在大多数关键状态都是受保护的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.alt
或keys["alt"]
来查看它是否被按下。
可读性更强?可能。更有效率呢?不太可能。但是我对Lua的性能不是很了解。
我只会在KeyCombos
函数上面添加一个注释块,说明每种可能的组合及其含义。
作为旁注,它是Lua,而不是Lua。