#pragma once #include #include namespace td { namespace utils { std::uint64_t getTime(); typedef std::function TimerExecFunction; // utililty class to call function at regular period of time class AutoTimer { private: std::uint64_t m_Interval; TimerExecFunction m_Function; std::uint64_t m_LastTime = getTime(); std::uint64_t m_InternalTime = 0; public: AutoTimer() : m_Interval(0), m_Function(nullptr) {} AutoTimer(std::uint64_t interval) : m_Interval(interval), m_Function(nullptr) {} AutoTimer(std::uint64_t interval, TimerExecFunction callback) : m_Interval(interval), m_Function(callback) {} void update(); void update(std::uint64_t delta); void reset(); void setInterval(std::uint64_t newInterval) { m_Interval = newInterval; } std::uint64_t getInterval() const { return m_Interval; } void setCallbackFunction(TimerExecFunction newCallback) { m_Function = newCallback; } TimerExecFunction getCallbackFunction() const { return m_Function; } }; // utililty class to call function at regular period of time class Timer { private: std::uint64_t m_Interval; // in millis std::uint64_t m_InternalTime = 0; public: Timer() : m_Interval(0) {} Timer(std::uint64_t interval) : m_Interval(interval) {} bool update(std::uint64_t delta); void reset(); void setInterval(std::uint64_t newInterval) { m_Interval = newInterval; } std::uint64_t getInterval() const { return m_Interval; } }; // utililty class to call function at regular period of time with a cooldown (used for towers) class CooldownTimer { private: std::uint64_t m_Cooldown; // in millis std::uint64_t m_CooldownTime; public: CooldownTimer() : m_Cooldown(0), m_CooldownTime(0) {} CooldownTimer(std::uint64_t cooldown) : m_Cooldown(0), m_CooldownTime(cooldown) {} bool update(std::uint64_t delta); void applyCooldown(); void reset(); void setCooldown(std::uint64_t newCooldown) { m_CooldownTime = newCooldown; } std::uint64_t getCooldown() const { return m_CooldownTime; } }; } // namespace utils } // namespace td