From a584e873e46a06fa7487f30aad0291f8162ada25 Mon Sep 17 00:00:00 2001 From: Daniel Stevens Date: Thu, 13 Feb 2025 08:13:50 -0700 Subject: [PATCH 1/5] Add `Duration` struct Simple wrapper for a duration in `milliseconds`. This can be used as a type safe wrapper for a time duration value, which can easily be converted to `std::chrono::milliseconds`, yet doesn't require users to import the full `` library. --- NAS2D/Duration.h | 9 +++++++++ NAS2D/NAS2D.vcxproj | 1 + NAS2D/NAS2D.vcxproj.filters | 3 +++ 3 files changed, 13 insertions(+) create mode 100644 NAS2D/Duration.h diff --git a/NAS2D/Duration.h b/NAS2D/Duration.h new file mode 100644 index 00000000..c1940aef --- /dev/null +++ b/NAS2D/Duration.h @@ -0,0 +1,9 @@ +#pragma once + +#include + + +struct Duration +{ + uint64_t milliseconds; +}; diff --git a/NAS2D/NAS2D.vcxproj b/NAS2D/NAS2D.vcxproj index 9a53f78e..935cf237 100644 --- a/NAS2D/NAS2D.vcxproj +++ b/NAS2D/NAS2D.vcxproj @@ -201,6 +201,7 @@ + diff --git a/NAS2D/NAS2D.vcxproj.filters b/NAS2D/NAS2D.vcxproj.filters index 5f448fcd..efc4328c 100644 --- a/NAS2D/NAS2D.vcxproj.filters +++ b/NAS2D/NAS2D.vcxproj.filters @@ -185,6 +185,9 @@ Header Files + + Header Files + Header Files From 8d70633ac1f220ce6fe0fbe15531fff65946fc37 Mon Sep 17 00:00:00 2001 From: Daniel Stevens Date: Thu, 20 Feb 2025 16:16:08 -0700 Subject: [PATCH 2/5] Convert `std::chrono::milliseconds` to `Duration` in `Mixer` code --- NAS2D/Mixer/Mixer.cpp | 2 +- NAS2D/Mixer/Mixer.h | 10 +++++----- NAS2D/Mixer/MixerNull.cpp | 4 ++-- NAS2D/Mixer/MixerNull.h | 4 ++-- NAS2D/Mixer/MixerSDL.cpp | 8 ++++---- NAS2D/Mixer/MixerSDL.h | 5 +++-- 6 files changed, 17 insertions(+), 16 deletions(-) diff --git a/NAS2D/Mixer/Mixer.cpp b/NAS2D/Mixer/Mixer.cpp index 017bfb0b..34ea9c7c 100644 --- a/NAS2D/Mixer/Mixer.cpp +++ b/NAS2D/Mixer/Mixer.cpp @@ -16,7 +16,7 @@ using namespace NAS2D; void Mixer::playMusic(const Music& music) { - fadeInMusic(music, std::chrono::milliseconds{0}); + fadeInMusic(music, Duration{0}); } diff --git a/NAS2D/Mixer/Mixer.h b/NAS2D/Mixer/Mixer.h index 156a981e..ffd9fee2 100644 --- a/NAS2D/Mixer/Mixer.h +++ b/NAS2D/Mixer/Mixer.h @@ -10,20 +10,20 @@ #pragma once +#include "../Duration.h" #include "../Signal/Signal.h" -#include namespace NAS2D { - class Sound; class Music; + class Mixer { public: - static constexpr std::chrono::milliseconds DefaultFadeTime{500}; + static constexpr Duration DefaultFadeTime{500}; public: Mixer() = default; @@ -49,9 +49,9 @@ namespace NAS2D virtual void pauseMusic() = 0; virtual void resumeMusic() = 0; - virtual void fadeInMusic(const Music& music, std::chrono::milliseconds fadeInTime = Mixer::DefaultFadeTime) = 0; + virtual void fadeInMusic(const Music& music, Duration fadeInTime = Mixer::DefaultFadeTime) = 0; - virtual void fadeOutMusic(std::chrono::milliseconds fadeOutTime = Mixer::DefaultFadeTime) = 0; + virtual void fadeOutMusic(Duration fadeOutTime = Mixer::DefaultFadeTime) = 0; virtual bool musicPlaying() const = 0; diff --git a/NAS2D/Mixer/MixerNull.cpp b/NAS2D/Mixer/MixerNull.cpp index c568c841..96a3f082 100644 --- a/NAS2D/Mixer/MixerNull.cpp +++ b/NAS2D/Mixer/MixerNull.cpp @@ -34,10 +34,10 @@ namespace NAS2D void MixerNull::resumeMusic() {} - void MixerNull::fadeInMusic(const Music& /*music*/, std::chrono::milliseconds /*fadeInTime*/ /*= Mixer::DefaultFadeTime*/) + void MixerNull::fadeInMusic(const Music& /*music*/, Duration /*fadeInTime*/ /*= Mixer::DefaultFadeTime*/) {} - void MixerNull::fadeOutMusic(std::chrono::milliseconds /*fadeOutTime*/ /*= Mixer::DefaultFadeTime*/) + void MixerNull::fadeOutMusic(Duration /*fadeOutTime*/ /*= Mixer::DefaultFadeTime*/) {} bool MixerNull::musicPlaying() const diff --git a/NAS2D/Mixer/MixerNull.h b/NAS2D/Mixer/MixerNull.h index d96ecbcf..539935c2 100644 --- a/NAS2D/Mixer/MixerNull.h +++ b/NAS2D/Mixer/MixerNull.h @@ -27,8 +27,8 @@ namespace NAS2D void pauseMusic() override; void resumeMusic() override; - void fadeInMusic(const Music& music, std::chrono::milliseconds fadeInTime = Mixer::DefaultFadeTime) override; - void fadeOutMusic(std::chrono::milliseconds fadeOutTime = Mixer::DefaultFadeTime) override; + void fadeInMusic(const Music& music, Duration fadeInTime = Mixer::DefaultFadeTime) override; + void fadeOutMusic(Duration fadeOutTime = Mixer::DefaultFadeTime) override; bool musicPlaying() const override; diff --git a/NAS2D/Mixer/MixerSDL.cpp b/NAS2D/Mixer/MixerSDL.cpp index c3864c18..1e72deed 100644 --- a/NAS2D/Mixer/MixerSDL.cpp +++ b/NAS2D/Mixer/MixerSDL.cpp @@ -183,15 +183,15 @@ void MixerSDL::resumeMusic() } -void MixerSDL::fadeInMusic(const Music& music, std::chrono::milliseconds fadeInTime) +void MixerSDL::fadeInMusic(const Music& music, Duration fadeInTime) { - Mix_FadeInMusic(music.music(), 0, static_cast(fadeInTime.count())); + Mix_FadeInMusic(music.music(), 0, static_cast(fadeInTime.milliseconds)); } -void MixerSDL::fadeOutMusic(std::chrono::milliseconds fadeOutTime) +void MixerSDL::fadeOutMusic(Duration fadeOutTime) { - Mix_FadeOutMusic(static_cast(fadeOutTime.count())); + Mix_FadeOutMusic(static_cast(fadeOutTime.milliseconds)); } diff --git a/NAS2D/Mixer/MixerSDL.h b/NAS2D/Mixer/MixerSDL.h index 71048b28..d8e41aa3 100644 --- a/NAS2D/Mixer/MixerSDL.h +++ b/NAS2D/Mixer/MixerSDL.h @@ -12,6 +12,7 @@ #include "Mixer.h" + namespace NAS2D { @@ -56,8 +57,8 @@ namespace NAS2D void pauseMusic() override; void resumeMusic() override; - void fadeInMusic(const Music& music, std::chrono::milliseconds fadeInTime) override; - void fadeOutMusic(std::chrono::milliseconds fadeOutTime) override; + void fadeInMusic(const Music& music, Duration fadeInTime) override; + void fadeOutMusic(Duration fadeOutTime) override; bool musicPlaying() const override; From f50717c6361edec06f144b177b85c0b840934bad Mon Sep 17 00:00:00 2001 From: Daniel Stevens Date: Thu, 20 Feb 2025 16:28:27 -0700 Subject: [PATCH 3/5] Convert `std::chrono::milliseconds` to `Duration` in `Fade` code --- NAS2D/Renderer/Fade.cpp | 10 +++++----- NAS2D/Renderer/Fade.h | 10 +++++----- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/NAS2D/Renderer/Fade.cpp b/NAS2D/Renderer/Fade.cpp index 6a8e1132..084d905b 100644 --- a/NAS2D/Renderer/Fade.cpp +++ b/NAS2D/Renderer/Fade.cpp @@ -55,7 +55,7 @@ SignalSource<>& Fade::fadeComplete() // Fade in from fadeColor -void Fade::fadeIn(std::chrono::milliseconds fadeTime) +void Fade::fadeIn(Duration fadeTime) { setDuration(fadeTime); mDirection = FadeDirection::In; @@ -63,7 +63,7 @@ void Fade::fadeIn(std::chrono::milliseconds fadeTime) // Fade out to fadeColor -void Fade::fadeOut(std::chrono::milliseconds fadeTime) +void Fade::fadeOut(Duration fadeTime) { setDuration(fadeTime); mDirection = FadeDirection::Out; @@ -89,7 +89,7 @@ void Fade::update() return; } - const auto step = static_cast(std::clamp(mFadeTimer.elapsedTicks() * 255u / static_cast(mDuration.count()), 0u, 255u)); + const auto step = static_cast(std::clamp(mFadeTimer.elapsedTicks() * 255u / static_cast(mDuration.milliseconds), 0u, 255u)); mFadeColor.alpha = (mDirection == FadeDirection::In) ? 255 - step : step; if (step == 255) @@ -110,9 +110,9 @@ void Fade::draw(Renderer& renderer) const } -void Fade::setDuration(std::chrono::milliseconds newDuration) +void Fade::setDuration(Duration newDuration) { - if (newDuration == decltype(newDuration)::zero()) + if (newDuration.milliseconds == 0) { throw std::runtime_error("Fade duration must be positive"); } diff --git a/NAS2D/Renderer/Fade.h b/NAS2D/Renderer/Fade.h index f083831c..ae4578af 100644 --- a/NAS2D/Renderer/Fade.h +++ b/NAS2D/Renderer/Fade.h @@ -11,10 +11,10 @@ #pragma once #include "Color.h" +#include "../Duration.h" #include "../Timer.h" #include "../Signal/Signal.h" -#include namespace NAS2D { @@ -35,8 +35,8 @@ namespace NAS2D FadeCompleteSignal::Source& fadeComplete(); - void fadeIn(std::chrono::milliseconds fadeTime); - void fadeOut(std::chrono::milliseconds fadeTime); + void fadeIn(Duration fadeTime); + void fadeOut(Duration fadeTime); bool isFading() const; bool isFaded() const; @@ -45,7 +45,7 @@ namespace NAS2D void draw(Renderer& renderer) const; private: - void setDuration(std::chrono::milliseconds newDuration); + void setDuration(Duration newDuration); enum class FadeDirection { @@ -56,7 +56,7 @@ namespace NAS2D Color mFadeColor; FadeDirection mDirection; - std::chrono::milliseconds mDuration; + Duration mDuration; Timer mFadeTimer; FadeCompleteSignal mFadeComplete; }; From fbfd1427d06b8ae83ec006239d3fb2990ef7dbcd Mon Sep 17 00:00:00 2001 From: Daniel Stevens Date: Thu, 20 Feb 2025 16:37:17 -0700 Subject: [PATCH 4/5] Decrease `Duration` range from `uint64_t` to `uint32_t` The `uint64_t` was chosen based on `std::chrono::milliseconds`. However, we use SDL for time related values, which uses `Uint32`. The SDL2-Mixer library uses `int` values for millisecond timings. So not quite the same as the main SDL library, but closer than `uint64_t`. Considering the values are used for fade-in and fade-out times, it wouldn't make sense to use negative values in that context. --- NAS2D/Duration.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NAS2D/Duration.h b/NAS2D/Duration.h index c1940aef..167f5069 100644 --- a/NAS2D/Duration.h +++ b/NAS2D/Duration.h @@ -5,5 +5,5 @@ struct Duration { - uint64_t milliseconds; + uint32_t milliseconds; }; From 8167fbc4d3aba135db2ba3df8b500bf0e6d838b6 Mon Sep 17 00:00:00 2001 From: Daniel Stevens Date: Thu, 20 Feb 2025 16:39:05 -0700 Subject: [PATCH 5/5] Update `Timer` tick type to be consistent with `Duration` --- NAS2D/Timer.h | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/NAS2D/Timer.h b/NAS2D/Timer.h index dfdbaa3c..d68ff20c 100644 --- a/NAS2D/Timer.h +++ b/NAS2D/Timer.h @@ -10,6 +10,9 @@ #pragma once +#include + + namespace NAS2D { @@ -32,21 +35,21 @@ namespace NAS2D class Timer { public: - static unsigned int tick(); + static uint32_t tick(); Timer(); - Timer(unsigned int startTick); + Timer(uint32_t startTick); Timer(const Timer&) = default; Timer& operator=(const Timer&) = default; - unsigned int elapsedTicks() const; - unsigned int delta(); - void adjustStartTick(unsigned int ticksForward); + uint32_t elapsedTicks() const; + uint32_t delta(); + void adjustStartTick(uint32_t ticksForward); void reset(); private: - unsigned int mStartTick; + uint32_t mStartTick; }; } // namespace