#pragma once #include namespace extra2d { // 前向声明 class Node; /** * @brief 组件基类 * * 所有组件都继承此类,附加到节点上提供特定功能 */ class Component : public RefCounted { public: /** * @brief 虚析构函数 */ virtual ~Component() = default; /** * @brief 组件附加到节点时调用 * @param owner 所属节点 */ virtual void onAttach(Node* owner); /** * @brief 组件从节点分离时调用 */ virtual void onDetach(); /** * @brief 组件启用时调用 */ virtual void onEnable(); /** * @brief 组件禁用时调用 */ virtual void onDisable(); /** * @brief 每帧更新 * @param dt 帧间隔时间(秒) */ virtual void update(float dt); /** * @brief 渲染时调用(提交渲染命令) */ virtual void render(); /** * @brief 获取所属节点 * @return 节点指针 */ Node* getOwner() const { return owner_; } /** * @brief 设置是否启用 * @param enabled 是否启用 */ void setEnabled(bool enabled); /** * @brief 是否启用 * @return 是否启用 */ bool isEnabled() const { return enabled_; } /** * @brief 获取组件类型名称 * @return 类型名称字符串 */ virtual const char* getTypeName() const = 0; protected: Node* owner_ = nullptr; bool enabled_ = true; }; } // namespace extra2d