Как сделать задержку на событие от клавиатуры в SDL?

Я делаю простую игру - танчики, исключительно для себя. Вот фрагмент кода, который ответственнен за события от клавиаты. tankObj->Fire() - создает пули.

const Uint8* state = SDL_GetKeyboardState(NULL);
    tankObj->setState(State::STOP);
    if(state[SDL_SCANCODE_ESCAPE])
        mIsRunning = false;
    else if(state[SDL_SCANCODE_W]){
        tankObj->setState(State::MOVE);
        tankObj->change_direction(Direction::UP);
    }
    else if(state[SDL_SCANCODE_S]){
        tankObj->setState(State::MOVE);
        tankObj->change_direction(Direction::DOWN);
    }
    else if(state[SDL_SCANCODE_D]){
        tankObj->setState(State::MOVE);
        tankObj->change_direction(Direction::RIGHT);
    }
    else if(state[SDL_SCANCODE_A]){
        tankObj->setState(State::MOVE);
        tankObj->change_direction(Direction::LEFT);
    }
    if(state[SDL_SCANCODE_SPACE])
    {
        tankObj->Fire();    /*  <--- Вот тут  */
    }

Проблема в том, что если я зажимаю space, то пулей создается очень много:

введите сюда описание изображения

Как бы я хотел сделать? Я хочу, чтобы танк, при зажатом пробеле, выпускал одну пулю, например, каждые 3 секунды. Я искал информацию и особо ничего не нашел.


Ответы (1 шт):

Автор решения: Eoan Ermine

Вы можете сохранять в неком объекте, содержащем игровое состояние, время, когда был произведен последний выстрел:

#include <chrono>

class GameState {
    std::chrono::time_point<std::chrono::steady_clock> last_shoot;
};

И потом проверять, прошло ли с момента последнего выстрела больше трех секунд, если прошло - стрелять:

// ...
if(state[SDL_SCANCODE_SPACE])
{
    auto now = std::chrono::steady_clock::now();

    // gameState - объект типа GameState
    // Проверяем, прошло ли с момента последнего выстрела минимум 3 секунды
    if(std::chrono::duration_cast<std::chrono::seconds>(now - gameState.last_shoot) >= 3) {
        tankObj->Fire(); // Если прошло, то стреляем
        gameState.last_shoot = now; // И обновляем время последнего выстрела
    }
}
→ Ссылка