代码之家  ›  专栏  ›  技术社区  ›  B.Gen.Jack.O.Neill

Windows控制台游戏的实时控制

  •  1
  • B.Gen.Jack.O.Neill  · 技术社区  · 15 年前

    另一个简单的问题是,我想做一个简单的基于控制台的游戏,没有什么太花哨的,只是为了有一些周末项目来熟悉C。基本上我想做俄罗斯方块,但最后我遇到了一个问题:

    如何让游戏引擎运行,同时等待输入?显然,CIN或SCANF对我没用。

    3 回复  |  直到 8 年前
        1
  •  1
  •   tylerl    15 年前

    有两种方法可以做到:

    第一种是运行两个线程;一个线程等待输入并相应地更新状态,而另一个线程运行游戏。

    另一种方法(在游戏开发中更常见)是将游戏编写为一个每秒执行多次的大循环,更新游戏状态,重新绘制屏幕,并检查输入。

    但是,当您得到键输入时,您不需要阻塞,而是检查是否存在挂起的按键,如果没有发生任何事情,您只需继续执行循环。如果您有多个输入源(键盘、网络等),它们都会放在循环中,逐个检查。

    是的,这叫做投票。不,它效率不高。但是,高端游戏通常都是将最高性能和帧速率从计算机中拉出来,而不是运行得很酷。

    为了提高效率,您可以选择用超时阻塞——说“等待按键,但不能超过300毫秒”,这样您就可以继续循环了。

    select() 我想到了,但是也有其他的方法来等待或检查输入。

        2
  •  2
  •   Mark Rushakoff    15 年前

    你在找一个图书馆,比如 ncurses .

    许多 Rogue -就像游戏是用 ncurses 或类似的。

        3
  •  0
  •   frogatto    8 年前

    你可以解决如何将stdin改为非阻塞,这可以让你写一些类似俄罗斯方块的东西,但是游戏可能更直接地用事件驱动的范例来表达。也许这是学习Windows编程的一个好借口。

    不管怎样,如果您想进入控制台路径,如果您使用的是Microsoft编译器,那么您应该 kbhit() 可用(通过) conio.h )它可以告诉你 fgetc stdin 会阻止。

    实际上应该提到mingw gcc编译器3.4.5也支持 KBIT() .