From 36d1cac2841c2b0bf911228600a14c7e1e671c2f Mon Sep 17 00:00:00 2001 From: Gabriel Kaszewski Date: Sun, 31 Aug 2025 01:14:00 +0200 Subject: [PATCH] Add PlayerGraphicsComponent to manage player sprite visibility based on movement abilities --- Mr. Brick Adventures.sln.DotSettings.user | 1 + objects/entities/brick_player.tscn | 9 +++- scenes/level_village_4.tscn | 2 - scripts/components/PlayerController.cs | 6 +++ scripts/components/PlayerGraphicsComponent.cs | 43 +++++++++++++++++++ .../components/PlayerGraphicsComponent.cs.uid | 1 + 6 files changed, 59 insertions(+), 3 deletions(-) create mode 100644 scripts/components/PlayerGraphicsComponent.cs create mode 100644 scripts/components/PlayerGraphicsComponent.cs.uid diff --git a/Mr. Brick Adventures.sln.DotSettings.user b/Mr. Brick Adventures.sln.DotSettings.user index f213f4d..120e0e1 100644 --- a/Mr. Brick Adventures.sln.DotSettings.user +++ b/Mr. Brick Adventures.sln.DotSettings.user @@ -1,5 +1,6 @@  ForceIncluded + ForceIncluded ForceIncluded ForceIncluded ForceIncluded diff --git a/objects/entities/brick_player.tscn b/objects/entities/brick_player.tscn index 445cd8e..d10eaf1 100644 --- a/objects/entities/brick_player.tscn +++ b/objects/entities/brick_player.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=59 format=3 uid="uid://bqi5s710xb1ju"] +[gd_scene load_steps=60 format=3 uid="uid://bqi5s710xb1ju"] [ext_resource type="Script" uid="uid://csel4s0e4g5uf" path="res://scripts/components/PlayerController.cs" id="1_yysbb"] [ext_resource type="Shader" uid="uid://bs4xvm4qkurpr" path="res://shaders/hit_flash.tres" id="2_lgb3u"] @@ -49,6 +49,7 @@ [ext_resource type="Script" uid="uid://dssa2taiwktis" path="res://scripts/components/Movement/PlayerInputHandler.cs" id="42_e5pae"] [ext_resource type="Script" uid="uid://ceoxet1nqws8w" path="res://scripts/components/SpriteTilterComponent.cs" id="43_xuhvf"] [ext_resource type="Script" uid="uid://b1h8r5irryxcx" path="res://scripts/components/PlayerSfxComponent.cs" id="49_qec3q"] +[ext_resource type="Script" uid="uid://b2aanqykvdnev" path="res://scripts/components/PlayerGraphicsComponent.cs" id="50_dhjci"] [sub_resource type="ShaderMaterial" id="ShaderMaterial_xoue7"] shader = ExtResource("2_lgb3u") @@ -312,3 +313,9 @@ metadata/_custom_type_script = "uid://ceoxet1nqws8w" script = ExtResource("49_qec3q") JumpSfx = NodePath("../sfx_jump") metadata/_custom_type_script = "uid://b1h8r5irryxcx" + +[node name="PlayerGraphicsComponent" type="Node" parent="." node_paths=PackedStringArray("DefaultSprite", "SpaceshipSprite")] +script = ExtResource("50_dhjci") +DefaultSprite = NodePath("../Graphics/Root") +SpaceshipSprite = NodePath("../Graphics/Ship") +metadata/_custom_type_script = "uid://b2aanqykvdnev" diff --git a/scenes/level_village_4.tscn b/scenes/level_village_4.tscn index b33ba22..fd714e4 100644 --- a/scenes/level_village_4.tscn +++ b/scenes/level_village_4.tscn @@ -193,8 +193,6 @@ process_mode = 4 process_material = SubResource("ParticleProcessMaterial_lgb3u") [node name="Enemies" type="Node2D" parent="."] -process_mode = 4 -visible = false [node name="Flying Enemy" parent="Enemies" instance=ExtResource("18_162yw")] position = Vector2(1122, -33) diff --git a/scripts/components/PlayerController.cs b/scripts/components/PlayerController.cs index 1a4ee5f..d2e5b89 100644 --- a/scripts/components/PlayerController.cs +++ b/scripts/components/PlayerController.cs @@ -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 _abilities = []; private PlayerInputHandler _inputHandler; + public IReadOnlyList GetActiveAbilities() => _abilities; + public override void _Ready() { _inputHandler = GetNode("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()); _ = ConnectJumpAndGravityAbilities(); + EmitSignalMovementAbilitiesChanged(); } public void SetSpaceshipMovement() @@ -107,6 +112,7 @@ public partial class PlayerController : CharacterBody2D ClearMovementAbilities(); if (SpaceshipMovementScene != null) AddAbility(SpaceshipMovementScene.Instantiate()); + EmitSignalMovementAbilitiesChanged(); } private async Task ConnectJumpAndGravityAbilities() diff --git a/scripts/components/PlayerGraphicsComponent.cs b/scripts/components/PlayerGraphicsComponent.cs new file mode 100644 index 0000000..2deaa1b --- /dev/null +++ b/scripts/components/PlayerGraphicsComponent.cs @@ -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(); + 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; + } + } +} \ No newline at end of file diff --git a/scripts/components/PlayerGraphicsComponent.cs.uid b/scripts/components/PlayerGraphicsComponent.cs.uid new file mode 100644 index 0000000..3dfa805 --- /dev/null +++ b/scripts/components/PlayerGraphicsComponent.cs.uid @@ -0,0 +1 @@ +uid://b2aanqykvdnev