2014-03-02 42 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(); 
    } 
}