我试图将程序执行延迟200ms,然后测试在延迟期间是否按下了某个键。我该怎么做?
我尝试使用C创建一个类似于飞扬鸟类的简单计算机游戏。我希望用户有一点点时间(约200毫秒)按下一把钥匙让鸟跳,或者它会掉下来,但是我在实施延迟方面遇到了麻烦。
我在一些论坛 [where?] 上读到sleep(100)
应该延迟100ms,但是当我这样做时,我得到100秒。
我也尝试使用sleep(1/5)
,但该函数只使用整数。
此外,我需要能够测试在200ms内是否按下了按键;我在某处 [where?] 读到kbhit
函数可用于此,但我不知道如何使用它。
while(!dead) {
sleep(200); // what do I put here to get 200ms?
if (keyWasPressedDuringWait()){ //what do I put here?
notDeadAnimation():
}else{
dead=true;
deadAimation()
}
}
答案 0 :(得分:2)
要执行所需的延迟#include <unistd.h>
并使用usleep(microseconds)
。 (睡眠时间为200毫秒,呼叫为usleep(200000)
)。
要测试键盘敲击,#include <conio.h>
并在测试中使用_kbhit()
( k ey b oard hit < / b>的)。 _kbhit
测试密钥缓冲区中是否有密钥,但是没有删除它。您还需要使用_getch
来检索密钥,将其从密钥缓冲区中删除。我建议在这里定义一个辅助函数:
int clearKeyBuffer(){
int count = 0;
while(_kbhit()){
_getch();
count++;
}
return count;
}
此方法将清除当前密钥缓冲区中的所有密钥,并返回已清除的密钥数。然后,您可以在测试中使用它,如if(clearKeyBuffer())
来测试自上次测试后是否按下了某个键。
至于你的程序流程,你有很多额外的东西。你可以摆脱它的大部分并仍然在功能上相同:
do {
notDeadAnimation();
usleep(200000);
} while(clearKeyBuffer());
deadAnimation();
然而,这有一个明显的问题,有人可能只是
答案 1 :(得分:2)
使用usleep()而不是sleep()。前者在微秒内工作。 并使用_kbhit()+ getch()来发现是否按下了某个键以及它是哪个键:
while (!dead) {
usleep(200*1000); // 200 msec
if (_kbhit()) { // if key was pressed during sleep
int key = getch();
// you can check key value here
notDeadAnimation();
} else {
dead = true;
deadAnimation();
}
}