2016-07-07 77 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 
    } 
}