【问题标题】:Using Lua to detect a combination of keyboard key presses使用 Lua 检测键盘按键组合
【发布时间】:2013-03-07 22:32:49
【问题描述】:

我正在编写魔兽世界插件,我希望插件能够基于按键或按键组合执行某些功能。大多数关键状态现在都是受保护的 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 是否都被按下。我的问题更多是算法问题。有没有更好的方式以编程方式执行此操作?

【问题讨论】:

    标签: lua add-on world-of-warcraft


    【解决方案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
    

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

    【讨论】:

      【解决方案2】:

      在我看来已经很不错了。

      不过,您也可以使用表格:

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

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

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

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

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

      【讨论】:

      • 谢谢Netfangled,另外我将LUA编辑到Lua。谢谢你的提示:)。
      猜你喜欢
      • 2017-07-31
      • 2020-02-17
      • 2020-02-11
      • 2018-10-24
      • 2019-03-05
      • 1970-01-01
      • 1970-01-01
      • 2015-11-23
      • 2014-09-20
      相关资源
      最近更新 更多