为ncurses游戏编写游戏循环?

4
我正在使用ncurses编写一款游戏,但是在游戏循环方面遇到了问题。我已经阅读了这两个页面 - 此页面此页面 以及其他一些由SO链接的页面,我大概能够理解它们(或者至少,我能够理解他在谈论什么,尽管不知道解决方案的具体实现方式)。我的问题是,在ncurses中,精灵只能一次移动一个字符步长,没有插值或积分,只是sprite.x=sprite.x+1。我尝试使用pthread和nanosleep,坏人精灵可以很好地移动,但玩家的移动却非常缓慢和迟钝。我尝试使用两个线程,一个用于键盘输入,另一个用于游戏循环,但键盘线程根本没有起到任何作用。那么,如何为ncurses编写流畅的游戏循环?
2个回答

4
主要问题在于只能在运行VT100风格终端模拟器(如ncurses)时检测到按键,而不能检测到松开按键。这对游戏来说有点尴尬。玩家要么需要反复按键才能移动(或者等待按键自动重复,如果键盘驱动程序配置为这样)。要么可以使游戏玩家仅需按一次键即可开始移动,并再次按下该键(或另一个键)停止移动(与旧版Sierra冒险游戏相似)。
如果使用线程,可能会让问题变得更加困难。相反,您可以使用来等待输入或下一个时间片/计划事件。您将无法获得通常对于游戏非常重要的高精度、高分辨率的定时。但是,如果您使用ncurses,即使时间差几毫秒,也不必担心。您仍然可以通过以下方式计算超时时间来保持稳定:
next_tick = last_tick + TIME_INTERVAL
timeout = next_tick - now();

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


0

我认为ncurses并没有你需要的功能。在Windows中,你可以使用GetAsyncKeyState来检测你感兴趣的每一个按键。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接