#pragma once #include #include #include #include #include #include #include namespace easy2d { // ============================================================================ // AnimationNode - 动画节点(继承 Node) // 使用 FrameRenderer 单渲染器策略,不依赖 Sprite 基类 // 适用于需要独立渲染控制的动画(如特效、复合动画图层) // ============================================================================ class AnimationNode : public Node { public: AnimationNode(); ~AnimationNode() override = default; // ------ 静态工厂(Cocos 风格)------ static Ptr create(); static Ptr create(Ptr clip); static Ptr create(const std::string& aniFilePath); // ------ 动画数据 ------ void setClip(Ptr clip); Ptr getClip() const; bool loadFromFile(const std::string& aniFilePath); // ------ 播放控制 ------ void play(); void pause(); void resume(); void stop(); void reset(); bool isPlaying() const; bool isPaused() const; bool isStopped() const; void setPlaybackSpeed(float speed); float getPlaybackSpeed() const; void setLooping(bool loop); bool isLooping() const; // ------ 帧控制 ------ void setFrameIndex(size_t index); size_t getCurrentFrameIndex() const; size_t getTotalFrames() const; // ------ 事件回调 ------ void setKeyframeCallback(KeyframeHitCallback callback); void setCompletionCallback(AnimationCompleteCallback callback); void setFrameChangeCallback(AnimationController::FrameChangeCallback callback); void addEventListener(AnimationEventCallback callback); // ------ 视觉属性 ------ void setTintColor(const Color& color); Color getTintColor() const { return tintColor_; } void setFlipX(bool flip) { flipX_ = flip; } void setFlipY(bool flip) { flipY_ = flip; } bool isFlipX() const { return flipX_; } bool isFlipY() const { return flipY_; } // ------ 自动播放 ------ void setAutoPlay(bool autoPlay) { autoPlay_ = autoPlay; } bool isAutoPlay() const { return autoPlay_; } // ------ 碰撞盒访问 ------ const std::vector>& getCurrentDamageBoxes() const; const std::vector>& getCurrentAttackBoxes() const; // ------ 查询 ------ Size getMaxFrameSize() const; Rect getBoundingBox() const override; // ------ 直接访问 ------ AnimationController& getController() { return controller_; } const AnimationController& getController() const { return controller_; } FrameRenderer& getFrameRenderer() { return frameRenderer_; } const FrameRenderer& getFrameRenderer() const { return frameRenderer_; } protected: void onUpdate(float dt) override; void onDraw(RenderBackend& renderer) override; void onEnter() override; void onExit() override; private: AnimationController controller_; FrameRenderer frameRenderer_; Color tintColor_ = Colors::White; bool flipX_ = false; bool flipY_ = false; bool autoPlay_ = false; std::vector eventListeners_; static const std::vector> emptyBoxes_; void setupControllerCallbacks(); void dispatchEvent(const AnimationEvent& event); }; } // namespace easy2d