diff options
author | Aki <please@ignore.pl> | 2022-03-07 23:13:50 +0100 |
---|---|---|
committer | Aki <please@ignore.pl> | 2022-03-07 23:13:50 +0100 |
commit | d45c12bbbb34c2e4e40d17080d888e2c7a4ea06e (patch) | |
tree | 4277dbfd9ebbb0c315e643848dc1818732114d09 | |
parent | a8477c1483374bb0aeb3eb9ac9caabe68a4afbb9 (diff) | |
download | starshatter-d45c12bbbb34c2e4e40d17080d888e2c7a4ea06e.zip starshatter-d45c12bbbb34c2e4e40d17080d888e2c7a4ea06e.tar.gz starshatter-d45c12bbbb34c2e4e40d17080d888e2c7a4ea06e.tar.bz2 |
New Clock uses counters instead of epoch from now on
-rw-r--r-- | Stars45/Clock.cpp | 55 | ||||
-rw-r--r-- | Stars45/Clock.h | 13 |
2 files changed, 53 insertions, 15 deletions
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<double> delta = next - m_point; + const auto delta = std::chrono::duration_cast<std::chrono::milliseconds>(next - m_point); + m_game_elapsed += std::chrono::duration_cast<std::chrono::milliseconds>(delta * m_compression); + m_real_elapsed += delta; + const std::chrono::duration<double> 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; |