我正试图在c++中创建一个带有ncurses库的游戏。当我向播放器发射子弹时,我必须使用凝固汽油弹()函数来画出子弹的运动,但是玩家不能移动,因为有了凝固汽油弹()函数。我怎么才能解决呢?我必须使用线程,还是有一个函数可以帮助我做到这一点?谢谢大家的关注。
发布于 2022-05-04 21:05:31
poll() / select()方法很流行,但是--除非你真的需要在同一个循环中检查非诅咒输入--我建议你研究一种基于诅咒的纯基于halfdelay()或timeout()的方法。您也可以在napms()模式下与getch()一起在循环中使用延迟较短的nodelay()。例如,如果您想每隔半秒钟更新一次子弹,那么您可以调用napms(50)十次,而不是调用napms(50) --每次都检查输入,允许玩家响应--然后才更新子弹。
(我的偏见是:如果您坚持使用诅咒调用,您的程序将很容易移植到其他实现,如PDCurses,如果您使用poll() / select()路由,则不会移植。)
发布于 2022-05-04 11:13:49
简短的回答是:您不使用napms与ncurses。您使用无延迟模式和poll().首先使用nodelay()将ncurses置于无延迟模式(有关更多信息,请参见ncurses文档)。
如果您阅读getch()手册页,您将发现它解释了如何在无延迟模式下getch从不阻塞,但是如果没有按下键,则立即返回ERR。
此时,您可以使用poll()或select()等待按下键,并进行显式超时。你的延迟是毫秒。您需要添加一点逻辑来确定应该做什么。
您的总体逻辑如下:
getch
如果
。
只有当
只有当您的程序得出一个结论,认为现在还不是提取要点的时候,才能计算出需要等待多少时间才能在步骤3中完成某件事情。
指定时间间隔的
poll()或select()。然后回到步骤1.因此,例如,当您从一开始,getch给您bupkis,然后您决定您只是画了你的子弹,你需要再次抽出子弹在100毫秒内。您可以使用poll(),醒来后您可以从getch那里得到一些东西,然后您就可以处理这个问题了。然后,无论何时回到步骤5,您都会确定子弹是75毫秒前画出来的(poll()返回了,因为现在有东西是getch-ed,所以没有超时,在处理完密钥之后,您查阅了挂钟,并看到现在是75毫秒后),所以您现在可以多写25毫秒了。
https://stackoverflow.com/questions/72111820
复制相似问题