Files
Frostbite2D/Game/include/character/CharacterAnimation.h
Lenheart bcc285eed6 feat(场景管理): 添加UIScene支持并重构场景管理器
refactor(渲染器): 优化相机切换时的渲染批处理

feat(调试工具): 新增游戏调试UI场景和九宫格面板组件

fix(动画系统): 跳过缺失的动画资源加载并记录日志

perf(资源加载): 使用BinaryFileStreamReader优化NPK文件解析

feat(地图系统): 支持多边形可行走区域调试显示

style(代码格式): 清理多余空格和统一文件编码

docs(注释): 补充关键类和方法的文档说明

test(启动跟踪): 添加启动过程性能跟踪工具

chore(依赖): 添加SDL2_ttf库支持
2026-04-06 01:18:21 +08:00

67 lines
2.4 KiB
C++

#pragma once
#include "character/CharacterDataLoader.h"
#include "character/CharacterEquipmentManager.h"
#include <frostbite2D/2d/actor.h>
#include <frostbite2D/animation/animation.h>
#include <frostbite2D/base/RefPtr.h>
#include <functional>
#include <map>
#include <string>
#include <unordered_set>
#include <vector>
namespace frostbite2D {
class CharacterObject;
class CharacterAnimation : public Actor {
public:
using ActionAnimationList = std::map<std::string, std::vector<RefPtr<Animation>>>;
using ActionFrameFlagCallback = std::function<void(int)>;
using ActionEndCallback = std::function<void()>;
bool Init(CharacterObject* parent,
const character::CharacterConfig& config,
const CharacterEquipmentManager& equipmentManager);
bool SetAction(const std::string& actionName);
void SetDirection(int direction);
const std::string& GetCurrentAction() const { return currentActionTag_; }
bool HasAction(const std::string& actionName) const {
return actionAnimations_.count(actionName) > 0;
}
std::string DescribeAvailableActions() const;
bool IsCurrentActionFinished() const;
int GetCurrentFrameIndex() const;
int GetCurrentFrameCount() const;
float GetCurrentNormalizedProgress() const;
animation::AniFrame GetCurrentFrameInfo() const;
void SetActionFrameFlagCallback(ActionFrameFlagCallback callback);
void SetActionEndCallback(ActionEndCallback callback);
private:
static std::string FormatImgPath(std::string path, Animation::ReplaceData data);
Animation* GetPrimaryAnimation(const std::string& actionName) const;
Animation* GetCurrentPrimaryAnimation() const;
void RefreshRuntimeCallbacks();
bool shouldSkipMissingAnimation(const std::string& aniPath);
void CreateAnimationBySlot(const std::string& actionName,
const std::string& slotName,
const std::string& actionPath,
const character::CharacterConfig& config,
const CharacterEquipmentManager& equipmentManager);
CharacterObject* parent_ = nullptr;
ActionAnimationList actionAnimations_;
std::string currentActionTag_;
int direction_ = 1;
ActionFrameFlagCallback actionFrameFlagCallback_;
ActionEndCallback actionEndCallback_;
std::unordered_set<std::string> missingAnimationPaths_;
size_t skippedMissingAnimationCount_ = 0;
};
} // namespace frostbite2D