feat(animation): 添加动画状态回调支持

refactor(character): 重构角色动作处理逻辑

feat(swordman): 实现剑士基础攻击和技能1处理

refactor(state): 优化状态机与动作上下文管理

feat(input): 改进输入系统支持动作请求队列

refactor(movement): 重构移动系统支持行走/奔跑模式
This commit is contained in:
2026-04-04 14:45:41 +08:00
parent 1200cf0181
commit 5e80df040b
29 changed files with 1251 additions and 513 deletions

View File

@@ -0,0 +1,66 @@
#pragma once
#include "character/states/CharacterStateBase.h"
#include <string>
namespace frostbite2D {
struct SwordmanActionUpdateResult {
enum class Type {
Running,
Finished,
Transition,
};
static SwordmanActionUpdateResult Running() {
return {};
}
static SwordmanActionUpdateResult Finished() {
SwordmanActionUpdateResult result;
result.type = Type::Finished;
return result;
}
static SwordmanActionUpdateResult TransitionTo(const std::string& requestedActionId,
bool requireBufferedInput = true) {
SwordmanActionUpdateResult result;
result.type = Type::Transition;
result.requestedActionId = requestedActionId;
result.requireBufferedInput = requireBufferedInput;
return result;
}
Type type = Type::Running;
std::string requestedActionId;
bool requireBufferedInput = true;
};
class ISwordmanActionHandler {
public:
virtual ~ISwordmanActionHandler() = default;
virtual const std::string& GetActionId() const = 0;
virtual void OnEnter(CharacterStateContext& context,
const CharacterActionDefinition& action) = 0;
virtual SwordmanActionUpdateResult OnUpdate(CharacterStateContext& context,
const CharacterActionDefinition& action) = 0;
virtual void OnExit(CharacterStateContext& context,
const CharacterActionDefinition& action) {
(void)context;
(void)action;
}
};
class SwordmanActionHandlerBase : public ISwordmanActionHandler {
public:
explicit SwordmanActionHandlerBase(std::string actionId);
~SwordmanActionHandlerBase() override = default;
const std::string& GetActionId() const override { return actionId_; }
protected:
std::string actionId_;
};
} // namespace frostbite2D

View File

@@ -1,6 +1,10 @@
#pragma once
#include "character/states/CharacterStateBase.h"
#include "character/states/jobs/swordman/SwordmanActionHandler.h"
#include <memory>
#include <string>
#include <unordered_map>
namespace frostbite2D {
@@ -18,6 +22,11 @@ public:
void OnExit(CharacterStateMachine& machine,
CharacterStateContext& context,
CharacterStateId nextState) override;
private:
ISwordmanActionHandler* FindHandler(const std::string& actionId) const;
std::unordered_map<std::string, std::unique_ptr<ISwordmanActionHandler>> handlers_;
};
} // namespace frostbite2D

View File

@@ -0,0 +1,24 @@
#pragma once
#include "character/states/jobs/swordman/SwordmanActionHandler.h"
namespace frostbite2D {
class SwordmanBasicAttackHandler : public SwordmanActionHandlerBase {
public:
SwordmanBasicAttackHandler();
void OnEnter(CharacterStateContext& context,
const CharacterActionDefinition& action) override;
SwordmanActionUpdateResult OnUpdate(CharacterStateContext& context,
const CharacterActionDefinition& action) override;
void OnExit(CharacterStateContext& context,
const CharacterActionDefinition& action) override;
private:
void BeginComboStep(CharacterStateContext& context, int comboStep);
int comboStep_ = 0;
};
} // namespace frostbite2D

View File

@@ -0,0 +1,17 @@
#pragma once
#include "character/states/jobs/swordman/SwordmanActionHandler.h"
namespace frostbite2D {
class SwordmanSkill1Handler : public SwordmanActionHandlerBase {
public:
SwordmanSkill1Handler();
void OnEnter(CharacterStateContext& context,
const CharacterActionDefinition& action) override;
SwordmanActionUpdateResult OnUpdate(CharacterStateContext& context,
const CharacterActionDefinition& action) override;
};
} // namespace frostbite2D