使用Lua检测键盘按键的组合
问题描述:
我正在编写魔兽世界插件的中间,我希望插件能够基于按键或按键的组合执行某些功能。大多数主要国家的保护魔兽世界API函数,但现在下仍然能够通过插件可以使用:使用Lua检测键盘按键的组合
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例如,看是否控制和Alt都被按下。我的问题更多的是算法。有没有更好的方式来执行这个程序化?
答
对我来说听起来很有声音。
作为替代方案,但是,你可以使用一个表:
function KeyCombos()
keys = {
shift = IsShiftKeyDown(),
control = IsControlKeyDown(),
alt = IsAltKeyDown(),
}
end
然后,你可以打电话keys.alt
或keys["alt"]
来看看它的压制。
更具可读性?大概。更高效?不见得。但是当我谈到Lua的表现时,我不是很了解。
我只是在KeyCombos
函数上面添加注释块,说明每种可能的组合及其含义。
答
如果你要使用一个表,在一般情况下,它会好得多,保持相同的表。
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共享相同的全球环境,因此最好保持清洁。
谢谢Netfangled,另外我编辑LUA给Lua。谢谢你的提示:)。 – 2013-03-08 02:06:12