diff --git a/core/actions/Animate.cpp b/core/actions/Animate.cpp index 89f97452..9896c8a2 100644 --- a/core/actions/Animate.cpp +++ b/core/actions/Animate.cpp @@ -90,7 +90,7 @@ void easy2d::Animate::Update() target->Load(frames[frame_index_]); } - started_ += Duration(animation_->GetInterval()); + started_ += Duration::Second * animation_->GetInterval(); ++frame_index_; if (frame_index_ == frames.size()) diff --git a/core/actions/Delay.cpp b/core/actions/Delay.cpp index 1ae664b1..24ee9523 100644 --- a/core/actions/Delay.cpp +++ b/core/actions/Delay.cpp @@ -62,5 +62,5 @@ void easy2d::Delay::Update() void easy2d::Delay::ResetTime() { Action::ResetTime(); - started_ = Time::Now() - Duration(delta_); + started_ = Time::Now() - Duration::Second * delta_; } diff --git a/core/actions/FiniteTimeAction.cpp b/core/actions/FiniteTimeAction.cpp index 963fd0f3..2053db99 100644 --- a/core/actions/FiniteTimeAction.cpp +++ b/core/actions/FiniteTimeAction.cpp @@ -60,5 +60,5 @@ void easy2d::FiniteTimeAction::Update() void easy2d::FiniteTimeAction::ResetTime() { Action::ResetTime(); - started_ = Time::Now() - Duration(delta_ * duration_); + started_ = Time::Now() - Duration::Second * (delta_ * duration_); } diff --git a/core/e2dutil.h b/core/e2dutil.h index 111f3463..993967ef 100644 --- a/core/e2dutil.h +++ b/core/e2dutil.h @@ -513,19 +513,31 @@ namespace easy2d // 时间段 class Duration { + public: + static const Duration Millisecond; // 毫秒 + static const Duration Second; // 秒 + static const Duration Minute; // 分钟 + static const Duration Hour; // 小时 + public: Duration(); explicit Duration( - float seconds + int64_t milliseconds ); // 获取毫秒数 - int Milliseconds() const; + int64_t Milliseconds() const; // 获取秒数 float Seconds() const; + // 获取分钟数 + float Minutes() const; + + // 获取小时数 + float Hours() const; + bool operator== (const Duration &) const; bool operator!= (const Duration &) const; bool operator> (const Duration &) const; @@ -535,12 +547,20 @@ namespace easy2d Duration operator + (Duration const &) const; Duration operator - (Duration const &) const; + Duration operator * (int) const; + Duration operator * (float) const; + Duration operator / (int) const; + Duration operator / (float) const; Duration& operator += (Duration const &); Duration& operator -= (Duration const &); + Duration& operator *= (int); + Duration& operator *= (float); + Duration& operator /= (int); + Duration& operator /= (float); private: - std::chrono::milliseconds duration_ms_; + int64_t milliseconds_; }; @@ -553,7 +573,7 @@ namespace easy2d // 获取时间戳 time_t GetTimeStamp() const; - // 是否是 + // 是否是零时 bool IsZero() const; Time operator + (Duration const &) const; diff --git a/core/utils/Duration.cpp b/core/utils/Duration.cpp index 34ea13f7..8bf90418 100644 --- a/core/utils/Duration.cpp +++ b/core/utils/Duration.cpp @@ -20,80 +20,148 @@ #include "..\e2dutil.h" -using namespace std::chrono; + +const easy2d::Duration easy2d::Duration::Millisecond = easy2d::Duration(1); +const easy2d::Duration easy2d::Duration::Second = 1000 * easy2d::Duration::Millisecond; +const easy2d::Duration easy2d::Duration::Minute = 60 * easy2d::Duration::Second; +const easy2d::Duration easy2d::Duration::Hour = 60 * easy2d::Duration::Minute; easy2d::Duration::Duration() - : duration_ms_() + : milliseconds_(0) { } -easy2d::Duration::Duration(float seconds) - : duration_ms_(static_cast(seconds * 1000.f)) +easy2d::Duration::Duration(int64_t milliseconds) + : milliseconds_(milliseconds) { } -int easy2d::Duration::Milliseconds() const +int64_t easy2d::Duration::Milliseconds() const { - return static_cast(duration_ms_.count()); + return milliseconds_; } float easy2d::Duration::Seconds() const { - return duration_ms_.count() / 1000.f; + int64_t sec = milliseconds_ / Second.milliseconds_; + int64_t ms = milliseconds_ % Second.milliseconds_; + return static_cast(sec) + static_cast(ms) / 1000.f; +} + +float easy2d::Duration::Minutes() const +{ + int64_t min = milliseconds_ / Minute.milliseconds_; + int64_t ms = milliseconds_ % Minute.milliseconds_; + return static_cast(min) + static_cast(ms) / (60 * 1000.f); +} + +float easy2d::Duration::Hours() const +{ + int64_t hour = milliseconds_ / Hour.milliseconds_; + int64_t ms = milliseconds_ % Hour.milliseconds_; + return static_cast(hour) + static_cast(ms) / (60 * 60 * 1000.f); } bool easy2d::Duration::operator==(const Duration & other) const { - return duration_ms_ == other.duration_ms_; + return milliseconds_ == other.milliseconds_; } bool easy2d::Duration::operator!=(const Duration & other) const { - return duration_ms_ != other.duration_ms_; + return milliseconds_ != other.milliseconds_; } bool easy2d::Duration::operator>(const Duration & other) const { - return duration_ms_ > other.duration_ms_; + return milliseconds_ > other.milliseconds_; } bool easy2d::Duration::operator>=(const Duration & other) const { - return duration_ms_ >= other.duration_ms_; + return milliseconds_ >= other.milliseconds_; } bool easy2d::Duration::operator<(const Duration & other) const { - return duration_ms_ < other.duration_ms_; + return milliseconds_ < other.milliseconds_; } bool easy2d::Duration::operator<=(const Duration & other) const { - return duration_ms_ <= other.duration_ms_; + return milliseconds_ <= other.milliseconds_; } easy2d::Duration easy2d::Duration::operator+(Duration const & other) const { - Duration d; - d.duration_ms_ = duration_ms_ + other.duration_ms_; + Duration d(milliseconds_ + other.milliseconds_); return std::move(d); } easy2d::Duration easy2d::Duration::operator-(Duration const & other) const { - Duration d; - d.duration_ms_ = duration_ms_ - other.duration_ms_; + Duration d(milliseconds_ - other.milliseconds_); + return std::move(d); +} + +easy2d::Duration easy2d::Duration::operator*(int value) const +{ + Duration d(milliseconds_ * value); + return std::move(d); +} + +easy2d::Duration easy2d::Duration::operator/(int value) const +{ + Duration d(milliseconds_ / value); + return std::move(d); +} + +easy2d::Duration easy2d::Duration::operator*(float value) const +{ + int64_t ms = static_cast(milliseconds_ * value); + Duration d(ms); + return std::move(d); +} + +easy2d::Duration easy2d::Duration::operator/(float value) const +{ + int64_t ms = static_cast(milliseconds_ / value); + Duration d(ms); return std::move(d); } easy2d::Duration & easy2d::Duration::operator+=(Duration const &other) { - duration_ms_ += other.duration_ms_; + milliseconds_ += other.milliseconds_; return (*this); } easy2d::Duration & easy2d::Duration::operator-=(Duration const &other) { - duration_ms_ -= other.duration_ms_; + milliseconds_ -= other.milliseconds_; + return (*this); +} + +easy2d::Duration & easy2d::Duration::operator*=(int value) +{ + milliseconds_ *= value; + return (*this); +} + +easy2d::Duration & easy2d::Duration::operator/=(int value) +{ + milliseconds_ /= value; + return (*this); +} + +easy2d::Duration & easy2d::Duration::operator*=(float value) +{ + milliseconds_ *= value; + return (*this); +} + +easy2d::Duration & easy2d::Duration::operator/=(float value) +{ + milliseconds_ /= value; return (*this); } diff --git a/core/utils/Time.cpp b/core/utils/Time.cpp index 5a8f29f1..f242c480 100644 --- a/core/utils/Time.cpp +++ b/core/utils/Time.cpp @@ -67,7 +67,8 @@ easy2d::Time & easy2d::Time::operator-=(Duration const &other) easy2d::Duration easy2d::Time::operator-(Time const & other) const { auto ms = duration_cast(time_ - other.time_).count(); - return std::move(Duration(static_cast(ms) / 1000.f)); + Duration d(static_cast(ms)); + return std::move(d); } easy2d::Time easy2d::Time::Now()