2016-07-07 5 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. КСТАТИ. Почему '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 
    } 
} 
Смежные вопросы