Add PlayerGraphicsComponent to manage player sprite visibility based on movement abilities

This commit is contained in:
2025-08-31 01:14:00 +02:00
parent 53b5f968fd
commit 36d1cac284
6 changed files with 59 additions and 3 deletions

View File

@@ -19,6 +19,7 @@ public partial class PlayerController : CharacterBody2D
[Export] public PackedScene WallJumpScene { get; set; }
[Signal] public delegate void JumpInitiatedEventHandler();
[Signal] public delegate void MovementAbilitiesChangedEventHandler();
public Vector2 LastDirection { get; private set; } = Vector2.Right;
public Vector2 PreviousVelocity { get; private set; } = Vector2.Zero;
@@ -26,6 +27,8 @@ public partial class PlayerController : CharacterBody2D
private List<MovementAbility> _abilities = [];
private PlayerInputHandler _inputHandler;
public IReadOnlyList<MovementAbility> GetActiveAbilities() => _abilities;
public override void _Ready()
{
_inputHandler = GetNode<PlayerInputHandler>("PlayerInputHandler");
@@ -39,6 +42,7 @@ public partial class PlayerController : CharacterBody2D
}
_ = ConnectJumpAndGravityAbilities();
EmitSignalMovementAbilitiesChanged();
}
public override void _PhysicsProcess(double delta)
@@ -100,6 +104,7 @@ public partial class PlayerController : CharacterBody2D
if (OneWayPlatformScene != null) AddAbility(OneWayPlatformScene.Instantiate<MovementAbility>());
_ = ConnectJumpAndGravityAbilities();
EmitSignalMovementAbilitiesChanged();
}
public void SetSpaceshipMovement()
@@ -107,6 +112,7 @@ public partial class PlayerController : CharacterBody2D
ClearMovementAbilities();
if (SpaceshipMovementScene != null) AddAbility(SpaceshipMovementScene.Instantiate<MovementAbility>());
EmitSignalMovementAbilitiesChanged();
}
private async Task ConnectJumpAndGravityAbilities()

View File

@@ -0,0 +1,43 @@
using System.Linq;
using Godot;
namespace Mr.BrickAdventures.scripts.components;
[GlobalClass]
public partial class PlayerGraphicsComponent : Node
{
[Export] public Node2D DefaultSprite { get; set; }
[Export] public Node2D SpaceshipSprite { get; set; }
private PlayerController _playerController;
public override void _Ready()
{
_playerController = GetOwner<PlayerController>();
if (_playerController == null)
{
GD.PrintErr("PlayerGraphicsComponent must be a child of a PlayerController.");
SetProcess(false);
return;
}
_playerController.MovementAbilitiesChanged += OnMovementAbilitiesChanged;
UpdateGraphics();
}
private void OnMovementAbilitiesChanged()
{
UpdateGraphics();
}
private void UpdateGraphics()
{
var isSpaceship = _playerController.GetActiveAbilities().Any(ability => ability is SpaceshipMovementAbility);
if (SpaceshipSprite != null)
{
SpaceshipSprite.Visible = isSpaceship;
}
}
}

View File

@@ -0,0 +1 @@
uid://b2aanqykvdnev