Extra2D/include/utils/timer_module.h

144 lines
3.3 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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 &&) noexcept;
TimerModule &operator=(TimerModule &&) noexcept;
// 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