From 321103ea84cf61f58a26d59700284d84f11833f5 Mon Sep 17 00:00:00 2001 From: Dan Goodliffe Date: Sat, 15 Jun 2024 17:35:13 +0100 Subject: Move main application loop into the library --- application/main.cpp | 37 ++++--------------------------------- ui/mainApplication.cpp | 34 ++++++++++++++++++++++++++++++++++ ui/mainApplication.h | 18 ++++++++++++++++++ 3 files changed, 56 insertions(+), 33 deletions(-) create mode 100644 ui/mainApplication.cpp create mode 100644 ui/mainApplication.h diff --git a/application/main.cpp b/application/main.cpp index 04c88f3..d58cf6d 100644 --- a/application/main.cpp +++ b/application/main.cpp @@ -1,7 +1,7 @@ +#include "ui/mainApplication.h" #include "ui/mainWindow.h" #include #include -#include #include #include #include @@ -32,16 +32,13 @@ static const int DISPLAY_WIDTH = 1280; static const int DISPLAY_HEIGHT = 1024; -class MainApplication : public GameState, public ApplicationBase { +class DummyMainApplication : public GameState, public MainApplication { public: - using Windows = Collection; - int run() { geoData = std::make_shared(GeoData::loadFromAsciiGrid("test/fixtures/height/SD19.asc")); - Windows windows; windows.create(DISPLAY_WIDTH, DISPLAY_HEIGHT)->setContent(); world.create(geoData); @@ -90,41 +87,15 @@ public: } } - auto t_start = std::chrono::high_resolution_clock::now(); - while (isRunning) { - processInputs(windows); - const auto t_end = std::chrono::high_resolution_clock::now(); - const auto t_passed = std::chrono::duration_cast(t_end - t_start); - - world.apply(&WorldObject::tick, t_passed); - windows.apply(&Window::tick, t_passed); - windows.apply(&Window::refresh); - - t_start = t_end; - } + mainLoop(); world.objects.clear(); return 0; } - -private: - void - processInputs(const Windows & windows) - { - for (SDL_Event e; SDL_PollEvent(&e);) { - if (e.type == SDL_QUIT) { - isRunning = false; - return; - } - windows.applyOne(&Window::handleInput, e); - } - } - - bool isRunning {true}; }; int main(int, char **) { - return std::make_shared()->run(); + return std::make_shared()->run(); } diff --git a/ui/mainApplication.cpp b/ui/mainApplication.cpp new file mode 100644 index 0000000..08f49a4 --- /dev/null +++ b/ui/mainApplication.cpp @@ -0,0 +1,34 @@ +#include "mainApplication.h" +#include "game/gamestate.h" +#include "game/worldobject.h" + +void +MainApplication::mainLoop() +{ + auto t_start = std::chrono::high_resolution_clock::now(); + while (isRunning) { + processInputs(); + const auto t_end = std::chrono::high_resolution_clock::now(); + const auto t_passed = std::chrono::duration_cast(t_end - t_start); + + if (gameState) { + gameState->world.apply(&WorldObject::tick, t_passed); + } + windows.apply(&Window::tick, t_passed); + windows.apply(&Window::refresh); + + t_start = t_end; + } +} + +void +MainApplication::processInputs() +{ + for (SDL_Event e; SDL_PollEvent(&e);) { + if (e.type == SDL_QUIT) { + isRunning = false; + return; + } + windows.applyOne(&Window::handleInput, e); + } +} diff --git a/ui/mainApplication.h b/ui/mainApplication.h new file mode 100644 index 0000000..a6cb126 --- /dev/null +++ b/ui/mainApplication.h @@ -0,0 +1,18 @@ +#pragma once + +#include "applicationBase.h" +#include "collection.h" +#include "window.h" + +class MainApplication : public ApplicationBase { +public: + using Windows = Collection; + void mainLoop(); + +protected: + Windows windows; + +private: + void processInputs(); + bool isRunning {true}; +}; -- cgit v1.2.3