Lua中是否有“获取键盘输入”功能? (方向键)

时间:2013-07-30 22:07:29

标签: input lua

我想知道你是否可以像Java,C +等那样接收键盘输入。或者如果没有外部库?

以下是关于2D迷宫游戏的一些信息: 您可以使用箭头键浏览迷宫。使用向上和向下箭头键选择菜单中的对象,例如:

- >新游戏

加载游戏

选项

依此类推......我感谢任何帮助。美好的一天。

3 个答案:

答案 0 :(得分:4)

Lua本身并不提供任何不属于ANSI C的库,这是该语言广泛可移植性的一部分。

因此,您会错过键盘输入和图形等操作,也会错过可能被视为“简单”的操作,例如列出目录中的文件。

最有可能的是,有一个库可以满足您的需求,如果没有,那么请记住,Lua是最友好的编写C端库的语言之一。

LOVE是一个很好的框架,它或多或少地使用分发方法将相当多的扩展(包括一个相当抽象的SDL接口)耦合到Lua。如果您正在使用Lua开发游戏,这是一个很好的起点。

编辑:如果您使用LuaJIT在Windows上,并且您可以使用全局密钥钩子,那么我最近(2015年5月)开发了一个解决该问题的库:https://github.com/LPGhatguy/global-keys

答案 1 :(得分:2)

像诅咒这样的图书馆可能有所帮助;这是一个tutorial one reading arrow keys with curses in Lua。还有luaposix库,其中包括curses。

答案 2 :(得分:0)

如果您使用linux,我有答案,此代码有效。只需在其他平台上尝试我的代码,看看是否可行(如果您好奇)。它不会回显箭头键,并且不会等到按Enter键。

如果这会引起一些问题,请修改我的代码。

这对于您的2D迷宫项目可能非常有用

    function getch_unix() --This return key pressed instantly without waiting until user press enter key
      os.execute("stty -echo raw")
      os.execute("stty cbreak </dev/tty >/dev/tty 2>&1")
      local key = io.read(3) --must read three letter for getArrowKey to work
      os.execute("stty -cbreak </dev/tty >/dev/tty 2>&1");
      return(key);
    end
    
    function getArrowKey()
      function split(str)
        local tmp = {}
        for let in string.gmatch(str, ".") do
          table.insert(tmp, let)
        end
        return tmp
      end
      --[[
      A is up arrow
      B is down arrow
      D is left arrow
      C is right arrow
      ]]
      local key = split(getch_unix())
      if string.lower(key[3]) == "a" then
        return "up"
      elseif string.lower(key[3]) == "b" then
        return "down"
      elseif string.lower(key[3]) == "d" then
        return "left"
      elseif string.lower(key[3]) == "c" then
        return "right"
      else
        error("Invalid arrow key!")
      end
    end

当我使用在互联网搜索中找到的getch_unix()函数进行实验以得到一个被按下的键而根本没有回声并且不等您按enter键时,我就会采用这种方式。

编辑: 我还发现https://github.com/max1220/lua-getch对于您的用例有几个有用的功能,如果我的代码仍然不适合您的用例,它会在git上提供更多信息,这也会缩短您的代码