使用`sleep()`延迟一段时间

时间:2014-03-02 16:20:21

标签: c delay sleep flappy-bird-clone

我试图将程序执行延迟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()
    }
}

2 个答案:

答案 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();
    }
}