-1

我试图将程序执行延迟 200 毫秒,然后测试在延迟期间是否按下了某个键。我该怎么做呢?

我正在尝试使用 C 创建一个类似于小鸟的简单电脑游戏。我希望用户有一点点时间(~200 毫秒)来按键让小鸟跳跃,否则它会掉下来,但我是在实施延迟时遇到问题。

我在一些论坛[在哪里?]上读过sleep(100)应该有 100 毫秒的延迟,但是当我这样做时,我得到了 100 秒。

我也尝试过使用sleep(1/5),但该函数只接受整数。

此外,我需要能够测试在 200 毫秒内是否按下了某个键;我在某处[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()
    }
}
4

2 回答 2

3

要执行所需的延迟,请#include <unistd.h>使用usleep(microseconds). (要休眠 200 毫秒,调用是usleep(200000))。

测试键盘敲击,#include <conio.h>_kbhit()在您的测试中使用(key board hit缩写)。测试密钥缓冲区中是否有密钥,但不会删除它。您还需要用于检索密钥,将其从密钥缓冲区中删除。我建议在这里定义一个辅助函数:_kbhit_getch

int clearKeyBuffer(){
    int count = 0;
    while(_kbhit()){
        _getch();
        count++;
    }
    return count;
}

此方法将清除当前在键缓冲区中的所有键,并返回已清除的键数。然后,您可以在测试中使用它,if(clearKeyBuffer())以测试自上次测试以来是否按下了某个键。

至于你的程序流程,你有很多额外的东西。您可以摆脱其中的大部分,但在功能上仍然相同:

do {
    notDeadAnimation();
    usleep(200000);
} while(clearKeyBuffer());

deadAnimation();

但是,这有一个明显的问题,即有人可以

于 2014-03-02T16:47:52.913 回答
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();
    }
}
于 2014-03-02T16:56:56.627 回答