Migrated player state machine

This commit is contained in:
Marco 2025-03-05 10:55:14 +01:00
commit 9c3f22760b
19 changed files with 108 additions and 69 deletions

View file

@ -23,7 +23,7 @@ public partial class ActivationProvider : Area2D
[Signal]
public delegate void InteractableAreaExitedEventHandler(Interactable interactable);
public void Init(ActorStateMachine actor)
public void Init(CharacterBody2D actor)
{
if (SelectorScene is not null && _selector is null)
{

View file

@ -78,7 +78,7 @@ public partial class EnemyPossessionMovement : ActorFreeMovement
{
GameManager.Instance.CameraTargetObject(_parent);
//GameManager.Instance.Player.RequestMovementDisable(true);
GameManager.Instance.Player.SetState((int)PlayerState.Controlling);
GameManager.Instance.Player.SetState(PlayerState.Controlling);
_previousAiState = _actorAi.Ai;
_actorAi.Ai = AiState.Controlled;
@ -94,7 +94,7 @@ public partial class EnemyPossessionMovement : ActorFreeMovement
GameManager.Instance.CameraTargetPlayer();
//GameManager.Instance.Player.RequestMovementDisable(false);
GameManager.Instance.Player.SetState((int)PlayerState.Active);
GameManager.Instance.Player.SetState(PlayerState.Active);
DamageReceiver.BulletGroup = BulletOwner.Enemy;

View file

@ -35,6 +35,11 @@ public abstract partial class BaseState<TKey, TType> : Node2D, IState<TKey, TTyp
}
}
protected void ChangeState(TKey newState)
{
_stateMachine.SetState(newState);
}
public abstract void EnterState();
public abstract void ExitState();

View file

@ -4,8 +4,9 @@ using Godot;
namespace Cirno.Scripts.Components.FSM.Player;
public partial class Active : PlayerFSMState
public partial class Active : PlayerStateBase
{
public override PlayerState StateId => PlayerState.Active;
private Vector2 _movementDirection { get; set; }
public Vector2 FacingDirection { get; private set; } = Vector2.Down;
@ -36,18 +37,16 @@ public partial class Active : PlayerFSMState
public int MovementSpeed => _isStrafing ? StrafeSpeed : Speed;
private PlayerStateMachine _player;
private CharacterBody2D _player;
private Hud _hud;
public override void Init(ActorStateMachine stateMachine)
public override void Init(IStateMachine<PlayerState, CharacterBody2D> machine)
{
base.Init(stateMachine);
base.Init(machine);
_hud = Hud.Instance;
_player = (PlayerStateMachine)stateMachine;
_damageReceiver.Death += () =>
{
ChangeState(PlayerState.Dead);
@ -70,12 +69,12 @@ public partial class Active : PlayerFSMState
_damageReceiver.RefillHealth();
_damageReceiver.RefillShield();
_activationProvider.Init(stateMachine);
_activationProvider.Init(MainObject);
//_weaponProvider = stateMachine.GetNode<PlayerWeaponProvider>("WeaponProvider");
//_animationProvider = stateMachine.GetNode<PlayerAnimationProvider>("AnimationProvider");
_weaponProvider.Init(stateMachine);
_weaponProvider.Init(MainObject);
}
public override void EnterState()
@ -102,9 +101,9 @@ public partial class Active : PlayerFSMState
public override void PhysicsProcessState(double delta)
{
_stateMachine.Velocity = _movementDirection * MovementSpeed;
MainObject.Velocity = _movementDirection * MovementSpeed;
_stateMachine.MoveAndSlide();
MainObject.MoveAndSlide();
}
public override void ProcessState(double delta)
@ -130,7 +129,7 @@ public partial class Active : PlayerFSMState
}
}
_animationProvider.SetAnimation(_stateMachine.Velocity);
_animationProvider.SetAnimation(MainObject.Velocity);
_crosshairProvider.UpdatePosition(FacingDirection);

View file

@ -2,8 +2,9 @@
namespace Cirno.Scripts.Components.FSM.Player;
public partial class Controlling : PlayerFSMState
public partial class Controlling : PlayerStateBase
{
public override PlayerState StateId => PlayerState.Controlling;
[Export]
private PlayerAnimationProvider _animationProvider;

View file

@ -2,8 +2,9 @@
namespace Cirno.Scripts.Components.FSM.Player;
public partial class Cutscene : PlayerFSMState
public partial class Cutscene : PlayerStateBase
{
public override PlayerState StateId => PlayerState.Cutscene;
[Export]
private PlayerAnimationProvider _animationProvider;
@ -19,7 +20,7 @@ public partial class Cutscene : PlayerFSMState
public override void ProcessState(double delta)
{
_animationProvider.SetAnimation(_stateMachine.Velocity);
_animationProvider.SetAnimation(MainObject.Velocity);
}
public override void PhysicsProcessState(double delta)

View file

@ -3,8 +3,10 @@ using Godot;
namespace Cirno.Scripts.Components.FSM.Player;
public partial class Dead : PlayerFSMState
public partial class Dead : PlayerStateBase
{
public override PlayerState StateId => PlayerState.Dead;
[Export]
private PlayerAnimationProvider _animationProvider;
@ -13,30 +15,19 @@ public partial class Dead : PlayerFSMState
[Export]
private ActorResourceProvider _healthProvider;
private GameManager _gameManager;
private Hud _hud;
public override void Init(ActorStateMachine stateMachine)
{
base.Init(stateMachine);
_gameManager = GameManager.Instance;
_hud = Hud.Instance;
}
public override void EnterState()
{
_animationProvider.PlayDeathAnimation();
// show game over
_hud.ShowGameOver();
Hud.Instance.ShowGameOver();
}
public override void ExitState()
{
// Hide game over
_hud.HideGameOver();
Hud.Instance.HideGameOver();
}
public override void ProcessState(double delta)
@ -55,10 +46,10 @@ public partial class Dead : PlayerFSMState
public void Respawn()
{
_stateMachine.GlobalPosition = _gameManager.LastCheckpointPosition;
MainObject.GlobalPosition = GameManager.Instance.LastCheckpointPosition;
_healthProvider.FillResource();
_gameManager.ClearBullets();
GameManager.Instance.ClearBullets();
_stateMachine.SetState((int)PlayerState.Active);
ChangeState(PlayerState.Active);
}
}

View file

@ -4,8 +4,10 @@ using Godot;
namespace Cirno.Scripts.Components.FSM.Player;
public partial class Init : PlayerFSMState
public partial class Init : PlayerStateBase
{
public override PlayerState StateId => PlayerState.Init;
[Export]
private PlayerAnimationProvider _animationProvider;
public override void EnterState()
@ -32,6 +34,6 @@ public partial class Init : PlayerFSMState
private async Task AutoSwitchToStart()
{
await Task.Delay(500);
_stateMachine.SetState((int)PlayerState.Active);
StateMachine.SetState(PlayerState.Active);
}
}

View file

@ -0,0 +1,8 @@
using Godot;
namespace Cirno.Scripts.Components.FSM.Player;
public abstract partial class PlayerStateBase : BaseState<PlayerState, CharacterBody2D>
{
}

View file

@ -2,8 +2,10 @@
namespace Cirno.Scripts.Components.FSM.Player;
public partial class Teleporting : PlayerFSMState
public partial class Teleporting : PlayerStateBase
{
public override PlayerState StateId => PlayerState.Init;
[Export]
private PlayerAnimationProvider _animationProvider;

View file

@ -2,8 +2,10 @@
namespace Cirno.Scripts.Components.FSM.Player;
public partial class UnTeleporting : PlayerFSMState
public partial class UnTeleporting : PlayerStateBase
{
public override PlayerState StateId => PlayerState.UnTeleporting
;
[Export]
private PlayerAnimationProvider _animationProvider;

View file

@ -0,0 +1,18 @@
using Godot;
namespace Cirno.Scripts.Components.FSM;
public abstract partial class PlayerArea2DModule : Area2D, IModule<PlayerState, CharacterBody2D>
{
public IStateMachine<PlayerState, CharacterBody2D> StateMachine { get; private set; }
public CharacterBody2D CharacterBody => StateMachine.MainObject;
public virtual void Init(IStateMachine<PlayerState, CharacterBody2D> machine)
{
StateMachine = machine;
}
public abstract void Process(double delta);
public abstract void PhysicsProcess(double delta);
}

View file

@ -3,15 +3,8 @@ using Godot;
namespace Cirno.Scripts.Components.FSM;
public partial class PlayerStateMachine : ActorStateMachine
public partial class PlayerStateMachine : StateMachineBase<PlayerState, CharacterBody2D>
{
[Export]
public PlayerState InitialState { get; private set; }
public override void _Ready()
{
base._Ready();
this.SetState((int)InitialState);
}
[Export] public override PlayerState InitialState { get; protected set; } = PlayerState.Init;
}