#pragma once #include "character/CharacterActionLibrary.h" namespace frostbite2D { class CharacterObject; /// 角色主状态机。输入先变成意图,再由状态机决定当前大状态和动作推进。 class CharacterStateMachine { public: void Reset(); void Update(CharacterObject& owner, CharacterCommandBuffer& commandBuffer, const CharacterIntent& intent, float deltaTime); void ForceHurt(const CharacterActionDefinition* hurtAction); CharacterStateId GetState() const { return currentState_; } const std::string& GetCurrentActionId() const { return currentActionId_; } const CharacterActionDefinition* GetCurrentActionDefinition() const { return currentAction_; } bool CanAcceptGroundActions() const; bool CanBeInterrupted() const; bool IsMovementLocked() const; bool CanTurn() const; private: void ChangeState(CharacterObject& owner, CharacterStateId nextState); void EnterAction(CharacterObject& owner, const CharacterActionDefinition* action); void UpdateGroundState(CharacterObject& owner, CharacterCommandBuffer& commandBuffer, const CharacterIntent& intent); void UpdateAirState(CharacterObject& owner, CharacterCommandBuffer& commandBuffer, const CharacterIntent& intent); void UpdateActionState(CharacterObject& owner, CharacterCommandBuffer& commandBuffer, const CharacterIntent& intent, float deltaTime); void UpdateHurtState(CharacterObject& owner, float deltaTime); bool TryStartAction(CharacterObject& owner, CharacterCommandBuffer& commandBuffer, CharacterCommandType commandType, const std::string& actionId); void ApplyFrameEvents(CharacterObject& owner, int previousFrame, int currentFrame); CharacterStateId currentState_ = CharacterStateId::Idle; std::string currentActionId_; const CharacterActionDefinition* currentAction_ = nullptr; float stateTime_ = 0.0f; float actionFrameProgress_ = 0.0f; int actionFrame_ = 0; float landingTimer_ = 0.0f; }; } // namespace frostbite2D