Как сделать задержку на событие от клавиатуры в 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; // И обновляем время последнего выстрела
}
}
