From d45c12bbbb34c2e4e40d17080d888e2c7a4ea06e Mon Sep 17 00:00:00 2001 From: Aki Date: Mon, 7 Mar 2022 23:13:50 +0100 Subject: New Clock uses counters instead of epoch from now on --- Stars45/Clock.cpp | 55 +++++++++++++++++++++++++++++++++++++++++++------------ Stars45/Clock.h | 13 ++++++++++--- 2 files changed, 53 insertions(+), 15 deletions(-) (limited to 'Stars45') diff --git a/Stars45/Clock.cpp b/Stars45/Clock.cpp index 8fd4f95..0bd3447 100644 --- a/Stars45/Clock.cpp +++ b/Stars45/Clock.cpp @@ -13,14 +13,19 @@ static constexpr double STARTING_DELTA {1.0 / 60.0}; Clock::Clock() : - m_epoch {inner_clock::now()} + m_point {inner_clock::now()}, + m_game_elapsed {elapsed_duration::zero()}, + m_real_elapsed {elapsed_duration::zero()}, + m_compression {NO_COMPRESSION}, + m_delta {STARTING_DELTA}, + m_gui_delta {STARTING_DELTA} { - Reset(); + Set(); } void -Clock::Reset() +Clock::Set() { m_point = inner_clock::now(); m_compression = NO_COMPRESSION; @@ -29,14 +34,26 @@ Clock::Reset() } +void +Clock::Reset() +{ + m_game_elapsed = elapsed_duration::zero(); + m_real_elapsed = elapsed_duration::zero(); + Set(); +} + + double Clock::Step() { const auto next = inner_clock::now(); - const std::chrono::duration delta = next - m_point; + const auto delta = std::chrono::duration_cast(next - m_point); + m_game_elapsed += std::chrono::duration_cast(delta * m_compression); + m_real_elapsed += delta; + const std::chrono::duration seconds = delta; + m_delta = seconds.count() * m_compression; + m_gui_delta = seconds.count(); m_point = next; - m_delta = delta.count() * m_compression; - m_gui_delta = delta.count(); return m_delta; } @@ -55,15 +72,29 @@ Clock::GuiDelta() const } -void -Clock::SetTimeCompression(double compression) +double +Clock::TimeCompression() const { - m_compression = compression; + return m_compression; } -double -Clock::TimeCompression() const +Clock::count_type +Clock::GameTime() const { - return m_compression; + return m_game_elapsed.count(); +} + + +Clock::count_type +Clock::RealTime() const +{ + return m_real_elapsed.count(); +} + + +void +Clock::SetTimeCompression(double compression) +{ + m_compression = compression; } diff --git a/Stars45/Clock.h b/Stars45/Clock.h index a0b3c4f..e2ddcb0 100644 --- a/Stars45/Clock.h +++ b/Stars45/Clock.h @@ -13,21 +13,28 @@ class Clock { public: + using inner_clock = std::chrono::high_resolution_clock; + using elapsed_duration = std::chrono::milliseconds; + using count_type = elapsed_duration::rep; + Clock(); + void Set(); void Reset(); double Step(); double Delta() const; double GuiDelta() const; + double TimeCompression() const; + count_type GameTime() const; + count_type RealTime() const; void SetTimeCompression(double compression); - double TimeCompression() const; protected: - using inner_clock = std::chrono::high_resolution_clock; - inner_clock::time_point m_epoch; inner_clock::time_point m_point; + elapsed_duration m_game_elapsed; + elapsed_duration m_real_elapsed; double m_compression; double m_delta; double m_gui_delta; -- cgit v1.1