From 1663c7caf329868a565f72136388843f5b09cdc8 Mon Sep 17 00:00:00 2001 From: Adrian Conlon Date: Sun, 3 May 2020 20:55:58 +0100 Subject: [PATCH] Refactor the "Game" class a little to allow future refactoring. Signed-off-by: Adrian Conlon --- Gaming/inc/Game.h | 6 +++ Gaming/src/Game.cpp | 117 +++++++++++++++++++++++++------------------- 2 files changed, 72 insertions(+), 51 deletions(-) diff --git a/Gaming/inc/Game.h b/Gaming/inc/Game.h index e0c106a..d49ac12 100644 --- a/Gaming/inc/Game.h +++ b/Gaming/inc/Game.h @@ -38,6 +38,12 @@ namespace Gaming { virtual std::string title() const = 0; + virtual void handleEvents(); + virtual void update(); + virtual void draw(); + virtual bool maybeSynchronise(); // true, if manual synchronisation required + virtual void synchronise(); + virtual void runRasterLines() {}; virtual void runVerticalBlank() {} diff --git a/Gaming/src/Game.cpp b/Gaming/src/Game.cpp index 68e2ee7..0fcc4b7 100644 --- a/Gaming/src/Game.cpp +++ b/Gaming/src/Game.cpp @@ -58,6 +58,9 @@ void Game::raisePOWER() { configureBackground(); createBitmapTexture(); + + m_frames = 0UL; + m_startTicks = ::SDL_GetTicks(); } void Game::configureBackground() const { @@ -73,64 +76,76 @@ void Game::createBitmapTexture() { } void Game::runLoop() { - - m_frames = 0UL; - m_startTicks = ::SDL_GetTicks(); - while (powered()) { - ::SDL_Event e; - while (::SDL_PollEvent(&e)) { - switch (e.type) { - case SDL_QUIT: - lowerPOWER(); - break; - case SDL_KEYDOWN: - handleKeyDown(e.key.keysym.sym); - break; - case SDL_KEYUP: - handleKeyUp(e.key.keysym.sym); - break; - case SDL_JOYBUTTONDOWN: - handleJoyButtonDown(e.jbutton); - break; - case SDL_JOYBUTTONUP: - handleJoyButtonUp(e.jbutton); - break; - case SDL_CONTROLLERBUTTONDOWN: - handleControllerButtonDown(e.cbutton); - break; - case SDL_CONTROLLERBUTTONUP: - handleControllerButtonUp(e.cbutton); - break; - case SDL_JOYDEVICEADDED: - addJoystick(e); - break; - case SDL_JOYDEVICEREMOVED: - removeJoystick(e); - break; - } - } + update(); + draw(); + maybeSynchronise(); + } +} - runVerticalBlank(); - runRasterLines(); +void Game::update() { + handleEvents(); + runVerticalBlank(); + runRasterLines(); +} - updateTexture(); - copyTexture(); - displayTexture(); - - ++m_frames; - - if (!m_vsync) { - const auto elapsedTicks = ::SDL_GetTicks() - m_startTicks; - const auto neededTicks = (m_frames / fps()) * 1000.0; - const auto sleepNeeded = (int)(neededTicks - elapsedTicks); - if (sleepNeeded > 0) { - ::SDL_Delay(sleepNeeded); - } +void Game::handleEvents() { + ::SDL_Event e; + while (::SDL_PollEvent(&e)) { + switch (e.type) { + case SDL_QUIT: + lowerPOWER(); + break; + case SDL_KEYDOWN: + handleKeyDown(e.key.keysym.sym); + break; + case SDL_KEYUP: + handleKeyUp(e.key.keysym.sym); + break; + case SDL_JOYBUTTONDOWN: + handleJoyButtonDown(e.jbutton); + break; + case SDL_JOYBUTTONUP: + handleJoyButtonUp(e.jbutton); + break; + case SDL_CONTROLLERBUTTONDOWN: + handleControllerButtonDown(e.cbutton); + break; + case SDL_CONTROLLERBUTTONUP: + handleControllerButtonUp(e.cbutton); + break; + case SDL_JOYDEVICEADDED: + addJoystick(e); + break; + case SDL_JOYDEVICEREMOVED: + removeJoystick(e); + break; } } } +void Game::draw() { + updateTexture(); + copyTexture(); + displayTexture(); +} + +bool Game::maybeSynchronise() { + ++m_frames; + const bool synchronising = !m_vsync; + if (synchronising) + synchronise(); + return synchronising; +} + +void Game::synchronise() { + const auto elapsedTicks = ::SDL_GetTicks() - m_startTicks; + const auto neededTicks = (m_frames / fps()) * 1000.0; + const auto sleepNeeded = (int)(neededTicks - elapsedTicks); + if (sleepNeeded > 0) + ::SDL_Delay(sleepNeeded); +} + void Game::removeJoystick(SDL_Event& e) { const auto which = e.jdevice.which; const auto found = m_gameControllers.find(which);