为 ncurses 游戏编写游戏循环?

Posted

技术标签:

【中文标题】为 ncurses 游戏编写游戏循环?【英文标题】:Writing a game loop for an ncurses game? 【发布时间】:2014-04-04 15:31:32 【问题描述】:

我正在使用 ncurses 编写游戏,但游戏循环出现问题。我已经阅读了这两页 - This one 和 This one 以及通过 SO 链接的其他几页,并且几乎可以理解它们(或者至少,我可以理解他在说什么,如果不完全是解决方案的话作品)。我遇到的问题是,使用 ncurses,精灵一次只能移动一个字符,没有插值或积分,它只是 sprite.x=sprite.x+1。我尝试使用 pthread 和 nanosleep 并且坏人精灵移动得很好,但玩家移动缓慢且无响应/无反应。我尝试使用 2 个线程并在一个线程上进行键输入,在另一个线程上进行游戏循环,但关键线程根本没有做任何事情。那么,如何为 ncurses 编写一个流畅的游戏循环呢?

【问题讨论】:

【参考方案1】:

主要问题是只能检测到按键(而不是按键释放),然后在 VT100 风格的终端仿真器中运行(就像 ncurses 一样)。这对游戏来说有点尴尬。玩家可以反复按键来移动(或者,如果键盘驱动程序配置为这样做,则等到按键自动重复)。或者您可以制作游戏,让玩家按一次键开始移动,然后再按一次键(或者可能是另一个键)停止(就像在旧的 Sierra 冒险游戏中一样)。

您可能只是通过使用线程让事情变得更加困难。相反,您可以使用poll() 等待输入或下一个滴答/预定事件。您将无法获得通常对游戏很重要的高精度、高分辨率时序。但是然后使用 ncurses,即使时间相差几毫秒,我认为您也不必担心。您仍然可以通过像这样计算超时来保持稳定:

next_tick = last_tick + TIME_INTERVAL
timeout = next_tick - now();

为了更平滑的移动(特别是如果物体以不同的速度移动),您可以以更高的精度存储所有坐标(例如通过使用浮点数),然后将它们向下舍入到低精度的屏幕坐标,然后进行绘制。

【讨论】:

【参考方案2】:

我不认为 ncurses 有你需要的东西。在 Windows 上,您可以对您感兴趣的每个键使用 GetAsyncKeyState。

【讨论】:

以上是关于为 ncurses 游戏编写游戏循环?的主要内容,如果未能解决你的问题,请参考以下文章

Linux环境下,基于Ncurse图形库贪吃蛇小游戏(上)

Linux环境下,基于Ncurse图形库贪吃蛇小游戏(中)

Linux环境下,基于Ncurse图形库贪吃蛇小游戏(中)

Linux环境下,基于Ncurse图形库贪吃蛇小游戏(下)

Linux环境下,基于Ncurse图形库贪吃蛇小游戏(下)

使用 ncurses 接收异步用户和外部输入