Extra2D/include/utils/timer_module.h

142 lines
3.3 KiB
C
Raw Normal View History

#pragma once
#include <functional>
#include <memory>
#include <module/module.h>
#include <module/module_registry.h>
#include <types/base/types.h>
#include <unordered_map>
#include <vector>
namespace extra2d {
/**
* @brief
*/
using TimerId = uint32;
constexpr TimerId INVALID_TIMER_ID = 0;
/**
* @brief
*/
using TimerCallback = std::function<void()>;
using TimerUpdateCallback = std::function<void(float)>;
/**
* @brief
*/
struct TimerInfo {
TimerId id = INVALID_TIMER_ID;
float interval = 0.0f; // 间隔时间(秒)
float elapsed = 0.0f; // 已过去的时间
uint32 repeat = 0; // 重复次数0表示无限
uint32 executed = 0; // 已执行次数
bool paused = false; // 是否暂停
bool cancelled = false; // 是否取消
TimerCallback callback; // 回调函数
TimerUpdateCallback updateCallback; // 带dt的回调
};
/**
* @brief
*
*
* 线
*/
class TimerModule : public Module {
// 自动注册到模块系统,优先级为 5核心模块
E2D_REGISTER_MODULE(TimerModule, "Timer", 5)
public:
TimerModule();
~TimerModule() override;
// 禁止拷贝和移动
TimerModule(const TimerModule &) = delete;
TimerModule &operator=(const TimerModule &) = delete;
TimerModule(TimerModule &&) = delete;
TimerModule &operator=(TimerModule &&) = delete;
// Module 接口实现
bool init() override;
void shutdown() override;
void update(float dt) override;
/**
* @brief
* @param delay
* @param callback
* @return ID
*/
TimerId scheduleOnce(float delay, TimerCallback callback);
/**
* @brief
* @param interval
* @param repeat 0
* @param callback
* @return ID
*/
TimerId scheduleRepeat(float interval, uint32 repeat, TimerCallback callback);
/**
* @brief
* @param callback dt
* @return ID
*/
TimerId scheduleUpdate(TimerUpdateCallback callback);
/**
* @brief
* @param id ID
*/
void cancel(TimerId id);
/**
* @brief
* @param id ID
*/
void pause(TimerId id);
/**
* @brief
* @param id ID
*/
void resume(TimerId id);
/**
* @brief
* @param scale 1.0
*/
void setTimeScale(float scale) { timeScale_ = scale; }
/**
* @brief
*/
float getTimeScale() const { return timeScale_; }
/**
* @brief
*/
void cancelAll();
/**
* @brief
*/
size_t getActiveCount() const;
private:
/**
* @brief ID
*/
TimerId generateId();
std::unordered_map<TimerId, std::unique_ptr<TimerInfo>> timers_;
std::vector<TimerId> pendingRemove_;
TimerId nextId_ = 1;
float timeScale_ = 1.0f;
bool inUpdate_ = false;
};
} // namespace extra2d