2016-07-07 32 views
0

我正在使用GetAsyncKeyState()來獲取我正在製作的遊戲的每個幀的輸入。在按鍵之間添加一個延遲

我想在每次按下時移動一個x,但不是每一幀都必須有延遲。我現在每次按下按鍵時都會冷靜下來。

這裏是我CoolDown類的某些部分:

bool test(bool asumedStatus) 
{ 
    if(asumedStatus == status) 
    { 
     return true; 
    } else 
    { 
     return false; 
    } 
} 

void go() 
{ 
    if(currentCount == runFor) 
    { 
     status = OFF_COOLDOWN; 
    } else 
    { 
     currentCount++; 
    } 
} 

void start() 
{ 
    currentCount = 0; 
    status = ON_COOLDOWN; 
} 

controls被調用每一幀來獲取用戶輸入

void controls() 
{ 
    if(test(OFF_COOLDOWN)) 
    { 
     if(KEY_L && !KEY_R && !KEY_U && !KEY_D) 
     { 
      left(); 
      print(); 
      cd.start(); 
     } 
     else if(KEY_R && !KEY_L && !KEY_D && !KEY_U) 
     { 
      right(); 
      print(); 
      cd.start(); 
     } else if(KEY_U && !KEY_L && !KEY_D && !KEY_R) 
     { 
      up(); 
      print(); 
      cd.start(); 
     } else if(KEY_D && !KEY_L && !KEY_R && !KEY_U) 
     { 
      down(); 
      print(); 
      cd.start(); 
     } 
    } else 
    { 
     cd.go(); 
    } 
} 

不幸的是,這並不工作,延遲不存在。沒有改變。

有人有任何想法我可以做到這一點?

+0

你試圖給'runFor'非常大的數字?簡單的遊戲可以運行數千幀每秒和遊戲,無需圖形甚至數百萬幀/秒。還有一個更好的主意是使用Rakete1111提出的時間。 BTW。爲什麼'test()'不是'cd.test()'? – Logman

回答

1

這是我會怎麼做:


我用時間來表示幀,或者遊戲的蜱。

我會做2個變量:

  • startTime - 時間點延遲開始
  • currentTime - 當前時間

現在,每一個節拍,我會更新currentTime(由1)。

通過獲取這些變量之間的差異,可以獲得自延遲開始以來的經過時間。

如果區別是更大delay,那麼我必須重置變量,重新開始。因此,將startTime設置爲currentTime,並將currentTime設置爲0

如果區別是更少delay,什麼也不做,因爲延遲不是「完成」。

喜歡的東西:

startTime = 0; 
currentTime = 0; 
delay = 2000; //In frames/ticks 

//Called every frame/tick 
void update() { 
    ++currentTime; //Update time 

    if (currentTime - startTime > delay) { 
     //Reset 
     startTime = currentTime; 
     currentTime = 0; 

     //Update whatever requires a delay 
    } 
}