2

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

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

--> 新游戏

加载游戏

选项

等等......我很感激任何帮助。再会。

4

3 回答 3

5

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

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

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

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

编辑:如果你在 Windows 上使用 LuaJIT 并且你对全局键挂钩没问题,那么我最近(2015 年 5 月)开发了一个库来解决这个问题:https ://github.com/LPGhatguy/global-keys

于 2013-07-30T22:12:00.960 回答
2

有像 curses 这样的库可能会有所帮助;这是一个教程,一是在 Lua 中阅读带有诅咒的箭头键。还有luaposix库,其中包括诅咒。

于 2013-07-30T22:31:26.897 回答
0

如果您使用 linux,我有答案,此代码将起作用。只需在其他平台上尝试我的代码,看看它是否有效(如果你好奇的话)。它不会回显箭头键,也不会等到您按下回车键。

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

这可能对您的 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 上获取更多信息,它也会缩短您的代码

于 2020-07-05T11:49:39.640 回答