2013-03-07 775 views
1

我正在编写魔兽世界插件的中间,我希望插件能够基于按键或按键的组合执行某些功能。大多数主要国家的保护魔兽世界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都被按下。我的问题更多的是算法。有没有更好的方式来执行这个程序化?

回答

0

对我来说听起来很有声音。

作为替代方案,但是,你可以使用一个表:

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

然后,你可以打电话keys.altkeys["alt"]来看看它的压制。

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

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

As a side note, it's Lua, not LUA.

+0

谢谢Netfangled,另外我编辑LUA给Lua。谢谢你的提示:)。 – 2013-03-08 02:06:12

1

如果你要使用一个表,在一般情况下,它会好得多,保持相同的表。

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共享相同的全球环境,因此最好保持清洁。