From 8f964bb27dcac5d0620e0dfab211a4bc51cbd707 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Tue, 23 Sep 2014 20:27:08 +0200 Subject: Move main loop to a new class --- src/CMakeLists.txt | 1 + src/control/RPGEdit.cpp | 108 ++++++++++++++++++++++++++++++++++++++++++++++++ src/control/RPGEdit.hpp | 48 +++++++++++++++++++++ src/rpgedit.cpp | 69 +------------------------------ 4 files changed, 159 insertions(+), 67 deletions(-) create mode 100644 src/control/RPGEdit.cpp create mode 100644 src/control/RPGEdit.hpp diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 91e5b5f..71fc6e2 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -5,6 +5,7 @@ add_executable(rpgedit rpgedit.cpp control/ImageLoader.cpp control/MapContext.cpp + control/RPGEdit.cpp model/Map.cpp view/MapView.cpp ) diff --git a/src/control/RPGEdit.cpp b/src/control/RPGEdit.cpp new file mode 100644 index 0000000..cb34812 --- /dev/null +++ b/src/control/RPGEdit.cpp @@ -0,0 +1,108 @@ +/* + Copyright (c) 2014, Matthias Schiffer + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#include "RPGEdit.hpp" +#include "EventBus.hpp" +#include "InputHandler.hpp" +#include "MapContext.hpp" +#include "../view/MapView.hpp" + +#include + + +#define MIN_FRAME_DELAY 10 + + +namespace RPGEdit { + +namespace Control { + +RPGEdit::RPGEdit() { +} + +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) + break; + + uint32_t newTicks = SDL_GetTicks(); + ctx->advance(&inputHandler, newTicks - ticks); + + ticks = newTicks; + + if (!SDL_TICKS_PASSED(SDL_GetTicks(), lastFrameTicks + MIN_FRAME_DELAY)) + continue; + + Model::Position pos = map->getPlayerEntity().getPosition(); + mapView->render(pos.x, pos.y); + + lastFrameTicks = ticks; + } +} + +} + +} diff --git a/src/control/RPGEdit.hpp b/src/control/RPGEdit.hpp new file mode 100644 index 0000000..edab13c --- /dev/null +++ b/src/control/RPGEdit.hpp @@ -0,0 +1,48 @@ +/* + Copyright (c) 2014, Matthias Schiffer + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#pragma once + +#include + + +namespace RPGEdit { + +namespace Control { + +class RPGEdit { +private: + +public: + RPGEdit(); + ~RPGEdit(); + + void run(); +}; + +} + +} diff --git a/src/rpgedit.cpp b/src/rpgedit.cpp index 4efaf10..6ef5dd3 100644 --- a/src/rpgedit.cpp +++ b/src/rpgedit.cpp @@ -24,82 +24,17 @@ */ -#include "control/EventBus.hpp" -#include "control/InputHandler.hpp" -#include "control/MapContext.hpp" -#include "view/MapView.hpp" - -#include +#include "control/RPGEdit.hpp" #include #include -#define MIN_FRAME_DELAY 10 - - extern "C" int main(__attribute__((unused)) int argc, __attribute__((unused)) char *argv[]) { - using namespace RPGEdit; - SDL_Init(SDL_INIT_VIDEO); - { - Control::EventBus eventBus; - - Control::InputHandler inputHandler; - - Control::ImageLoader tileLoader; - std::shared_ptr map = Model::Map::load("test"); - - std::shared_ptr ctx(new Control::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) - break; - - uint32_t newTicks = SDL_GetTicks(); - ctx->advance(&inputHandler, newTicks - ticks); - - ticks = newTicks; - - if (!SDL_TICKS_PASSED(SDL_GetTicks(), lastFrameTicks + MIN_FRAME_DELAY)) - continue; - - Model::Position pos = map->getPlayerEntity().getPosition(); - mapView->render(pos.x, pos.y); - - lastFrameTicks = ticks; - } - } + RPGEdit::Control::RPGEdit().run(); SDL_Quit(); -- cgit v1.2.3