From 24ae84861379f2f878804b53a457153ad1ad6c1e Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Tue, 23 Sep 2014 20:58:49 +0200 Subject: [PATCH] Rewrite main loop --- src/control/MapContext.hpp | 4 ++ src/control/RPGEdit.cpp | 93 ++++++++++++++++---------------------- src/control/RPGEdit.hpp | 23 ++++++++-- src/model/Map.cpp | 2 +- 4 files changed, 62 insertions(+), 60 deletions(-) diff --git a/src/control/MapContext.hpp b/src/control/MapContext.hpp index 504afc2..26f7e34 100644 --- a/src/control/MapContext.hpp +++ b/src/control/MapContext.hpp @@ -55,6 +55,10 @@ public: void advance(InputHandler *inputHandler, unsigned ticks); + Model::Position getViewPosition() { + return map->getPlayerEntity().getPosition(); + } + std::shared_ptr initView(const std::shared_ptr &window) { return std::make_shared(window, map, tiles, entities); } diff --git a/src/control/RPGEdit.cpp b/src/control/RPGEdit.cpp index cb34812..679796c 100644 --- a/src/control/RPGEdit.cpp +++ b/src/control/RPGEdit.cpp @@ -25,8 +25,6 @@ #include "RPGEdit.hpp" -#include "EventBus.hpp" -#include "InputHandler.hpp" #include "MapContext.hpp" #include "../view/MapView.hpp" @@ -40,69 +38,54 @@ namespace RPGEdit { namespace Control { -RPGEdit::RPGEdit() { -} +bool RPGEdit::systemIter(unsigned ticks) { + int timeout = 0; -RPGEdit::~RPGEdit() { -} - -void RPGEdit::run() { - EventBus eventBus; - - InputHandler inputHandler; - - ImageLoader tileLoader; - std::shared_ptr map = Model::Map::load("test"); - - std::shared_ptr ctx(new MapContext(&tileLoader, map)); - - std::shared_ptr window(new View::Window); - std::shared_ptr mapView = ctx->initView(window); - - bool running = true; - uint32_t ticks = SDL_GetTicks(); - uint32_t lastFrameTicks = ticks; - - while (true) { - int timeout = lastFrameTicks + MIN_FRAME_DELAY - SDL_GetTicks(); - if (timeout < 0) - timeout = 0; - - SDL_Event event; - if (SDL_WaitEventTimeout(&event, timeout)) { - switch (event.type) { - case SDL_KEYDOWN: - inputHandler.keyPressed(event.key.keysym.scancode); - break; - - case SDL_KEYUP: - inputHandler.keyReleased(event.key.keysym.scancode); - break; - - case SDL_QUIT: - running = false; - break; - } - } - - if (!running) + SDL_Event event; + if (SDL_WaitEventTimeout(&event, timeout)) { + switch (event.type) { + case SDL_KEYDOWN: + inputHandler.keyPressed(event.key.keysym.scancode); break; - uint32_t newTicks = SDL_GetTicks(); - ctx->advance(&inputHandler, newTicks - ticks); + case SDL_KEYUP: + inputHandler.keyReleased(event.key.keysym.scancode); + break; - ticks = newTicks; + case SDL_QUIT: + return false; + } + } - if (!SDL_TICKS_PASSED(SDL_GetTicks(), lastFrameTicks + MIN_FRAME_DELAY)) - continue; + ctx->advance(&inputHandler, ticks); - Model::Position pos = map->getPlayerEntity().getPosition(); - mapView->render(pos.x, pos.y); + Model::Position pos = ctx->getViewPosition(); + mapView->render(pos.x, pos.y); - lastFrameTicks = ticks; + return true; +} + +void RPGEdit::systemLoop() { + uint32_t ticks1 = SDL_GetTicks(); + uint32_t ticks2 = ticks1; + + while (systemIter(ticks2 - ticks1)) { + ticks1 = ticks2; + ticks2 = SDL_GetTicks(); } } +void RPGEdit::run() { + std::shared_ptr map = Model::Map::load("test"); + + ctx = std::make_shared(&tileLoader, map); + + window = std::make_shared(); + mapView = ctx->initView(window); + + systemLoop(); +} + } } diff --git a/src/control/RPGEdit.hpp b/src/control/RPGEdit.hpp index edab13c..f045265 100644 --- a/src/control/RPGEdit.hpp +++ b/src/control/RPGEdit.hpp @@ -26,7 +26,12 @@ #pragma once -#include +#include "EventBus.hpp" +#include "InputHandler.hpp" +#include "MapContext.hpp" + +#include +#include namespace RPGEdit { @@ -35,11 +40,21 @@ namespace Control { class RPGEdit { private: + EventBus eventBus; + InputHandler inputHandler; + ImageLoader tileLoader; + + std::shared_ptr ctx; + + std::shared_ptr window; + std::shared_ptr mapView; + + std::mutex modelLock; + + bool systemIter(unsigned ticks); + void systemLoop(); public: - RPGEdit(); - ~RPGEdit(); - void run(); }; diff --git a/src/model/Map.cpp b/src/model/Map.cpp index 48f5669..8081255 100644 --- a/src/model/Map.cpp +++ b/src/model/Map.cpp @@ -45,7 +45,7 @@ std::shared_ptr Map::load(__attribute__((unused)) const std::string &name) } } - map->playerEntity.reset(new Entity("square")); + map->playerEntity = std::make_shared("square"); map->playerEntity->moveTo(6, 6); map->entities.push_back(map->playerEntity);