diff --git a/src/gamescenebase.cpp b/src/gamescenebase.cpp index 70be162..856fef5 100644 --- a/src/gamescenebase.cpp +++ b/src/gamescenebase.cpp @@ -41,6 +41,7 @@ namespace curry { } //unnamed namespace GameSceneBase::GameSceneBase (cloonel::SDLMain* parSdlMain) : + m_time0(std::chrono::steady_clock::now()), m_input(std::make_unique()), m_sdlmain(parSdlMain), m_wants_to_quit(false) @@ -53,6 +54,8 @@ namespace curry { void GameSceneBase::prepare() { m_wants_to_quit = false; this->on_prepare(); + + m_time0 = std::chrono::steady_clock::now(); } void GameSceneBase::destroy() noexcept { @@ -69,12 +72,16 @@ namespace curry { } void GameSceneBase::exec() { + const auto time1 = std::chrono::steady_clock::now(); + const bool quit = DoEvents(*m_input, m_sdlmain); m_input->KeyStateUpdateFinished(); if (quit) set_wants_to_quit(); - this->on_update(); + const float delta = std::chrono::duration(time1 - m_time0).count(); + m_time0 = time1; + this->on_update(delta); } cloonel::SDLMain* GameSceneBase::sdl_main() { diff --git a/src/gamescenebase.hpp b/src/gamescenebase.hpp index 41737a9..f523e2e 100644 --- a/src/gamescenebase.hpp +++ b/src/gamescenebase.hpp @@ -1,6 +1,7 @@ #pragma once #include +#include namespace cloonel { class InputBag; @@ -24,11 +25,12 @@ namespace curry { protected: virtual void on_prepare() = 0; virtual void on_destroy() noexcept = 0; - virtual void on_update() = 0; + virtual void on_update (float parDeltaT) = 0; cloonel::SDLMain* sdl_main(); cloonel::InputBag& input_bag(); private: + std::chrono::time_point m_time0; std::unique_ptr m_input; cloonel::SDLMain* m_sdlmain; bool m_wants_to_quit; diff --git a/src/ingamescene.cpp b/src/ingamescene.cpp index 271dd47..1c746cd 100644 --- a/src/ingamescene.cpp +++ b/src/ingamescene.cpp @@ -4,6 +4,7 @@ #include "key.hpp" #include "inputbag.hpp" #include +#include namespace curry { namespace { @@ -47,15 +48,21 @@ namespace curry { m_worldtiles.load(RESOURCES_PATH "textures.png", *this->sdl_main()); } - void IngameScene::on_update() { + void IngameScene::on_update (float parDeltaT) { + const float speed_per_sec = + static_cast( + std::max(m_world.tile_size().x(), m_world.tile_size().y()) + ) * 1.5f; + + const float speed = parDeltaT * speed_per_sec; if (cloonel::IsPressed(input_bag(), ActionRight)) - m_viewport.set_position(m_viewport.position() + vec2i(1, 0)); + m_viewport.set_position(m_viewport.position() + vec2f(speed, 0)); if (cloonel::IsPressed(input_bag(), ActionLeft)) - m_viewport.set_position(m_viewport.position() - vec2i(1, 0)); + m_viewport.set_position(m_viewport.position() - vec2f(speed, 0)); if (cloonel::IsPressed(input_bag(), ActionUp)) - m_viewport.set_position(m_viewport.position() - vec2i(0, 1)); + m_viewport.set_position(m_viewport.position() - vec2f(0, speed)); if (cloonel::IsPressed(input_bag(), ActionDown)) - m_viewport.set_position(m_viewport.position() + vec2i(0, 1)); + m_viewport.set_position(m_viewport.position() + vec2f(0, speed)); const auto tilesize(m_world.tile_size()); for (auto tile : m_viewport) { diff --git a/src/ingamescene.hpp b/src/ingamescene.hpp index 1244409..c41cef4 100644 --- a/src/ingamescene.hpp +++ b/src/ingamescene.hpp @@ -18,7 +18,7 @@ namespace curry { protected: virtual void on_prepare() override; virtual void on_destroy() noexcept override; - virtual void on_update() override; + virtual void on_update (float parDeltaT) override; private: WorldGrid m_world; diff --git a/src/tileiterator.cpp b/src/tileiterator.cpp index 0f108b9..ca9e73d 100644 --- a/src/tileiterator.cpp +++ b/src/tileiterator.cpp @@ -25,7 +25,10 @@ namespace curry { m_index(parEnd ? -1 : 0) { assert(m_viewport); - m_pixel_pos = first_col_starting_pixel(m_viewport->position(), m_viewport->world()->tile_size()); + m_pixel_pos = first_col_starting_pixel( + static_cast(m_viewport->position()), + m_viewport->world()->tile_size() + ); } void TileIterator::increment() { @@ -34,7 +37,7 @@ namespace curry { const WorldGrid& world = *m_viewport->world(); vec2i tile_size(world.tile_size()); auto first_tile_pos = first_col_starting_pixel( - m_viewport->position(), + static_cast(m_viewport->position()), m_viewport->world()->tile_size() ); vec2i pos(tile_size * m_index + first_tile_pos); diff --git a/src/worldviewport.cpp b/src/worldviewport.cpp index 9044606..3e286a8 100644 --- a/src/worldviewport.cpp +++ b/src/worldviewport.cpp @@ -15,11 +15,11 @@ namespace curry { return m_world; } - const vec2i& WorldViewport::position() const { + const vec2f& WorldViewport::position() const { return m_position; } - const vec2i& WorldViewport::size() const { + const vec2f& WorldViewport::size() const { return m_size; } @@ -31,7 +31,7 @@ namespace curry { return iterator(this, true); } - void WorldViewport::set_position (const vec2i& parPos) { + void WorldViewport::set_position (const vec2f& parPos) { m_position = parPos; //TODO: assert validity } } //namespace curry diff --git a/src/worldviewport.hpp b/src/worldviewport.hpp index 5daf6b6..eb0bee8 100644 --- a/src/worldviewport.hpp +++ b/src/worldviewport.hpp @@ -12,17 +12,17 @@ namespace curry { WorldViewport (WorldGrid* parWorld, vec2i parSize); const WorldGrid* world() const; - const vec2i& position() const; - const vec2i& size() const; + const vec2f& position() const; + const vec2f& size() const; - void set_position (const vec2i& parPos); + void set_position (const vec2f& parPos); iterator begin(); iterator end(); private: - vec2i m_position; - vec2i m_size; + vec2f m_position; + vec2f m_size; WorldGrid* m_world; }; } //namespace curry