2014-03-02 47 views
-1

我尝试将程序执行延迟200ms,然后测试在延迟期间是否按下了一个键。我该怎么做呢?使用`sleep()`延时

我尝试创建一个类似于飞扬的鸟类的简单电脑游戏,使用C.我希望用户有一小段时间(〜200ms)按下一个键让鸟跳跃,否则它会掉下来,但我在执行延迟时遇到了麻烦。

我看过一些论坛[哪里?]sleep(100)应该给100ms的延迟,但是当我这样做的时候,我得到了100秒。

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

此外,我需要能够测试在200ms期间是否按下了按键;我在某处读[哪里?]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

http://stackoverflow.com/questions/4184468/sleep-for-milliseconds –

+0

搜索[ 'usleep()'](http://linux.die.net/man/3/usleep)或['nanosleep()'](http://linux.die.net/man/2/nanosleep)(第二个是优选的)。 – MBlanc

+0

尝试睡着。有关更多详细信息,请参阅“man usleep”。 – elyashiv

回答

2

要执行期望的延迟,#include <unistd.h>和使用usleep(microseconds)。 (要睡200ms,电话是usleep(200000))。

要测试键盘罢工,#include <conio.h>并在测试使用_kbhit()(简称ķ EY b OARD )。 _kbhit测试密钥缓冲区中是否存在密钥,但不能消除密钥。您还需要使用_getch来检索密钥,将其从密钥缓冲区中删除。我建议在这里定义一个帮助函数:

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

此方法将清除当前在密钥缓冲区中的所有密钥,并返回清除的密钥数。然后,您可以在测试中使用该功能,如if(clearKeyBuffer())以测试自上次测试以来是否有按键被按下。

至于你的程序流程,你有很多额外的东西在那里。你可以摆脱大部分仍然是功能相同:

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

deadAnimation(); 

然而,这具有明显的问题,有人可能只是

+0

请注意,conio.h可能仅限于Windows。 – Vatine

1

使用usleep()函式,而不是睡眠()。前者在微秒内工作。 并使用_kbhit()+残培()来发现如果按一个键和其关键是它:

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