Simplified actor modules

This commit is contained in:
Marco 2025-02-20 18:26:53 +01:00
commit a7f4f4eb28
8 changed files with 57 additions and 34 deletions

View file

@ -14,40 +14,35 @@ public partial class Actor : CharacterBody2D
private GameManager _gameManager; private GameManager _gameManager;
private List<MovementHandler> _movementHandlers = new(); private List<ActorModule> _modules = new();
private List<AnimationHandler> _animationHandlers = new();
public override void _Ready() public override void _Ready()
{ {
_gameManager = this.GetGameManager(); _gameManager = this.GetGameManager();
var children = GetChildren(); var children = GetChildren();
foreach (var child in children) { foreach (var child in children)
if (child is MovementHandler movementHandler) {
{ if (child is not ActorModule actorModule) continue;
_movementHandlers.Add(movementHandler); _modules.Add(actorModule);
movementHandler.Init(this); actorModule.Init(this);
}
else if (child is AnimationHandler animationHandler)
{
_animationHandlers.Add(animationHandler);
animationHandler.Init(this);
}
} }
} }
public override void _PhysicsProcess(double delta) public override void _Process(double delta)
{ {
foreach (var handler in _movementHandlers) foreach (var handler in _modules)
{
handler.Move(delta);
}
foreach (var handler in _animationHandlers)
{ {
handler.Update(delta); handler.Update(delta);
} }
} }
public override void _PhysicsProcess(double delta)
{
foreach (var handler in _modules)
{
handler.PhysicsUpdate(delta);
}
}
} }

View file

@ -25,7 +25,12 @@ public partial class ActorFreeMovement : MovementHandler
FacingDirection = Vector2.Down; FacingDirection = Vector2.Down;
} }
public override void Move(double delta) public override void Update(double delta)
{
}
public override void PhysicsUpdate(double delta)
{ {
MovementDirection = AggregateInputProviders().Normalized(); MovementDirection = AggregateInputProviders().Normalized();

View file

@ -0,0 +1,10 @@
using Godot;
namespace Cirno.Scripts.Components.Actors;
public abstract partial class ActorModule : Node2D
{
public abstract void Init(Actor actor);
public abstract void Update(double delta);
public abstract void PhysicsUpdate(double delta);
}

View file

@ -34,8 +34,13 @@ public partial class ActorTankMovement : MovementHandler
MovementDirection = Vector2.Zero; MovementDirection = Vector2.Zero;
FacingDirection = Vector2.Down; FacingDirection = Vector2.Down;
} }
public override void Move(double delta) public override void Update(double delta)
{
}
public override void PhysicsUpdate(double delta)
{ {
var inputDirection = AggregateInputProviders(); var inputDirection = AggregateInputProviders();

View file

@ -3,14 +3,14 @@ using Godot;
namespace Cirno.Scripts.Components.Actors; namespace Cirno.Scripts.Components.Actors;
public partial class AnimationHandler : Node2D public partial class AnimationHandler : ActorModule
{ {
[Export] [Export]
public AnimatedSprite2D _animatedSprite { get; protected set; } public AnimatedSprite2D _animatedSprite { get; protected set; }
protected Actor _parent; protected Actor _parent;
public virtual void Init(Actor parent) public override void Init(Actor parent)
{ {
_parent = parent; _parent = parent;
@ -23,7 +23,7 @@ public partial class AnimationHandler : Node2D
// } // }
} }
public virtual void Update(double delta) public override void Update(double delta)
{ {
var direction = _parent.FacingDirection; //GetSnappedDirection(); var direction = _parent.FacingDirection; //GetSnappedDirection();
@ -41,7 +41,12 @@ public partial class AnimationHandler : Node2D
} }
} }
public override void PhysicsUpdate(double delta)
{
}
private string DirectionToString(Vector2 direction) private string DirectionToString(Vector2 direction)
{ {
var angle = Mathf.RadToDeg(direction.Angle()); var angle = Mathf.RadToDeg(direction.Angle());

View file

@ -64,6 +64,11 @@ public partial class EnemyNavigationMovement : MovementHandler
} }
} }
public override void Update(double delta)
{
}
private void AlarmManagerOnAlarmEnabled(Vector2 location) private void AlarmManagerOnAlarmEnabled(Vector2 location)
{ {
if (NavigationEnabled && location.DistanceTo(this.GlobalPosition) <= AlarmReactRange) if (NavigationEnabled && location.DistanceTo(this.GlobalPosition) <= AlarmReactRange)
@ -74,7 +79,7 @@ public partial class EnemyNavigationMovement : MovementHandler
} }
} }
public override void Move(double delta) public override void PhysicsUpdate(double delta)
{ {
if (_actorAi.Ai is not AiState.Enabled) if (_actorAi.Ai is not AiState.Enabled)
return; return;

View file

@ -14,10 +14,10 @@ public partial class EnemyPossessionMovement : ActorFreeMovement
_actorAi = parent.GetNode<ActorAi>("ActorAi"); _actorAi = parent.GetNode<ActorAi>("ActorAi");
} }
public override void Move(double delta) public override void PhysicsUpdate(double delta)
{ {
if (_actorAi.Ai is AiState.Controlled) if (_actorAi.Ai is AiState.Controlled)
base.Move(delta); base.PhysicsUpdate(delta);
} }
} }

View file

@ -3,7 +3,7 @@ using System.Linq;
using Cirno.Scripts.Components.Actors; using Cirno.Scripts.Components.Actors;
using Godot; using Godot;
public abstract partial class MovementHandler : Node2D public abstract partial class MovementHandler : ActorModule
{ {
protected Actor _parent; protected Actor _parent;
@ -13,7 +13,7 @@ public abstract partial class MovementHandler : Node2D
protected readonly List<InputProvider> _inputProviders = new(); protected readonly List<InputProvider> _inputProviders = new();
public virtual void Init(Actor parent) public override void Init(Actor parent)
{ {
_parent = parent; _parent = parent;
@ -41,6 +41,4 @@ public abstract partial class MovementHandler : Node2D
return _inputProviders.Aggregate(false, (current, inputProvider) => current && inputProvider.GetStrafing()); return _inputProviders.Aggregate(false, (current, inputProvider) => current && inputProvider.GetStrafing());
} }
public abstract void Move(double delta);
} }