另一个快速问题,我想制作简单的基于游戏机的游戏,没有什么太花哨,只是为了让周末项目更熟悉C.基本上我想制作俄罗斯方块,但我最终遇到了一个问题:
如何让游戏引擎走,同时等待输入?显然,cin或scanf对我来说毫无用处。
答案 0 :(得分:2)
答案 1 :(得分:1)
有两种方法可以做到:
第一个是运行两个线程;一个人等待输入并相应地更新状态,而另一个则运行游戏。
另一种(在游戏开发中更常见)方式是将游戏编写为一个大循环,每秒执行多次,更新游戏状态,重绘屏幕和检查输入。
但是当您获得键输入时,不是阻塞,而是检查是否存在待处理的按键,如果没有发生任何事情,您只需继续循环。如果你有多个输入源(键盘,网络等),它们都会被放在循环中,一个接一个地检查。
是的,这叫做民意调查。不,它效率不高。但高端游戏通常都是为了将最高性能和帧率从计算机中拉出来,而不是很酷。
为了提高效率,您可以选择阻止超时 - 说“等待按键,但不超过300毫秒”,这样您就可以继续循环。
我想到了{p>select()
,但还有其他等待或检查输入的方法。
答案 2 :(得分:0)
你可以弄清楚如何将stdin更改为非阻塞,这样你就可以编写像俄罗斯方块这样的东西,但游戏可能会更直接地表达在事件驱动的范例中。也许这是学习Windows编程的一个很好的借口。
无论如何,如果您想要使用控制台路由,如果您使用的是Microsoft软件编译器,那么您应该kbhit()
可用(通过conio.h
),它可以告诉您是否调用了{{ 1 {} fgetc
会阻止。
实际上应该提到MinGW gcc编译器3.4.5也支持stdin
。