我正在用ncurses写一个游戏,但我遇到了游戏循环问题。我已经阅读了这两页 - This one和This one以及其他几个通过SO链接的内容,并且可以了解它们(或者至少,我能理解他在说什么,如果没有究竟解决方案是如何工作的)。我遇到的问题是,对于ncurses,sprite只能一次移动一个字符步骤,没有插值或积分,它只是sprite.x=sprite.x+1
。我尝试使用pthread和nanosleep,坏人精灵很好地移动,但玩家运动缓慢且反应迟钝/不活跃。我尝试使用2个线程并在另一个线程上使用键输入和游戏循环但是关键线程根本没有做任何事情。那么,你如何为ncurses写一个流畅的游戏循环?
答案 0 :(得分:3)
主要问题是只能按下按键(而非按键释放),然后在VT100风格的终端仿真器中运行(如ncurses所做)。这对游戏来说有点尴尬。播放器重复按键移动(或等到键自动重复,如果键盘驱动程序配置为这样做)。或者你可以制作游戏,以便玩家按一次键开始移动并再次按下键(或许是另一个键)停止(就像在古老的Sierra冒险游戏中一样)。
你可能只是通过使用线程让自己变得更加困难。相反,您可以使用poll()
等待输入或下一个tick / scheduled事件。你不会得到通常对游戏很重要的高精度,高分辨率的时间。但是然后使用ncurses我不认为你需要担心,即使时间是几毫秒关闭。您仍然可以通过计算超时来保持稳定:
next_tick = last_tick + TIME_INTERVAL
timeout = next_tick - now();
为了使运动更平稳(特别是如果物体以不同的速度移动),您可以使用更高的精度存储所有坐标(例如使用浮子),然后将它们向下舍入到低精度的屏幕坐标,然后绘制。
答案 1 :(得分:0)
我认为ncurses没有你需要的东西。在Windows上,您可以对您感兴趣的每个密钥使用GetAsyncKeyState。