Files
Frostbite2D/Game/include/npc/NpcAnimation.h
Lenheart 5af657c5c9 feat(npc): 添加NPC交互高亮效果及复合纹理支持
实现NPC交互时的绿色高亮效果,通过InteractionHighlightSprite类实现
重构NpcAnimation支持复合纹理渲染,优化高亮效果的性能
添加ShaderManager获取所有加载Shader的方法,优化渲染器uniform更新逻辑
2026-04-07 23:17:34 +08:00

57 lines
1.8 KiB
C++

#pragma once
#include "npc/NpcDataLoader.h"
#include <frostbite2D/2d/actor.h>
#include <frostbite2D/2d/canvas_actor.h>
#include <frostbite2D/animation/animation.h>
#include <string>
namespace frostbite2D {
class NpcAnimation : public Actor {
public:
struct CompositeFrameInfo {
bool valid = false;
Rect localBounds;
Vec2 originInTexture = Vec2::Zero();
Vec2 groundAnchorInTexture = Vec2::Zero();
int width = 1;
int height = 1;
};
bool Init(const npc::NpcConfig& config);
void Update(float deltaTime) override;
void Render() override;
void SetDirection(int direction);
bool IsReady() const { return displayAnimation_ != nullptr; }
bool IsAnimationFinished() const;
const std::string& GetAnimationPath() const { return animationPath_; }
bool GetDisplayLocalBounds(Rect& outBounds) const;
bool EnsureCompositeTextureReady();
bool HasCompositeTexture() const;
Ptr<Texture> GetCompositeTexture() const;
Vec2 GetCompositeTextureSize() const;
Vec2 GetCompositeGroundAnchorInTexture() const;
uint64 GetCompositeVersion() const { return compositeVersion_; }
private:
CompositeFrameInfo ComputeCompositeFrameInfo(int direction) const;
CompositeFrameInfo GetCurrentCompositeFrameInfo() const { return compositeFrameInfo_; }
uint64 CaptureCurrentRenderSignature() const;
void MarkCompositeDirty();
void UpdateCompositeCamera();
void RefreshCompositeTextureIfNeeded();
void RenderCurrentAnimationToCompositeCanvas();
RefPtr<Animation> displayAnimation_ = nullptr;
RefPtr<CanvasActor> compositeCanvas_ = nullptr;
CompositeFrameInfo compositeFrameInfo_;
std::string animationPath_;
int direction_ = 1;
bool compositeDirty_ = true;
uint64 compositeVersion_ = 0;
uint64 lastCompositeSignature_ = 0;
};
} // namespace frostbite2D