From d64504189a7b4514be944dbd5da68752b7a60130 Mon Sep 17 00:00:00 2001 From: Henry Date: Sun, 14 Dec 2025 20:32:23 +0000 Subject: [PATCH 01/20] Branch for signal refactoring, singleton bus. --- events.gd | 2 ++ events.gd.uid | 1 + main.tscn | 2 ++ player.gd | 14 ++++++++++---- progress_bar.gd | 6 ++++++ progress_bar.gd.uid | 1 + progress_bar.tscn | 19 +++++++++++++++++++ project.godot | 4 ++++ ui.gd | 30 +++++++++++++++++++++++++++--- ui.tscn | 12 +++++++++++- 10 files changed, 83 insertions(+), 8 deletions(-) create mode 100644 events.gd create mode 100644 events.gd.uid create mode 100644 progress_bar.gd create mode 100644 progress_bar.gd.uid create mode 100644 progress_bar.tscn diff --git a/events.gd b/events.gd new file mode 100644 index 0000000..487b284 --- /dev/null +++ b/events.gd @@ -0,0 +1,2 @@ +extends Node + diff --git a/events.gd.uid b/events.gd.uid new file mode 100644 index 0000000..3f2b2eb --- /dev/null +++ b/events.gd.uid @@ -0,0 +1 @@ +uid://jibpipn2p1c7 diff --git a/main.tscn b/main.tscn index ad3905b..c4f77db 100644 --- a/main.tscn +++ b/main.tscn @@ -71,6 +71,8 @@ autoplay = "scroll" [node name="CanvasLayer" type="CanvasLayer" parent="."] [node name="UI" parent="CanvasLayer" instance=ExtResource("4_1bvp3")] +offset_right = 196.0 +offset_bottom = 36.0 [node name="CenterContainer" type="CenterContainer" parent="CanvasLayer"] anchors_preset = 15 diff --git a/player.gd b/player.gd index f827b14..464581a 100644 --- a/player.gd +++ b/player.gd @@ -1,14 +1,17 @@ extends Area2D signal died -signal shield_changed +signal shield_changed(max_value: int, old_value: int, new_value: int) signal damage_taken +signal shield_damage +signal shield_ui + var shader_active = false @onready var screensize = get_viewport_rect().size @export var max_shield = 10 -var shield = max_shield: +var shield: int = max_shield: set = set_shield @export var speed = 150 @export var cooldown = 0.25 @@ -25,9 +28,11 @@ func start(): position = Vector2(screensize.x / 2, screensize.y - 64) $GunCooldown.wait_time = cooldown -func set_shield(value): +func set_shield(value: int): + var old_value: int = shield shield = min(max_shield, value) - shield_changed.emit(max_shield, shield) + shield_changed.emit(max_shield, old_value, shield) + shield_damage.emit() if shield <= 0: set_process(false) $Ship.hide() @@ -77,6 +82,7 @@ func _on_area_entered(area): func _on_damage_taken() -> void: + emit_signal("shield_ui") shader_active = true $Ship.material.set_shader_parameter("toggle", 1.0) await get_tree().create_timer(1).timeout diff --git a/progress_bar.gd b/progress_bar.gd new file mode 100644 index 0000000..0c08b33 --- /dev/null +++ b/progress_bar.gd @@ -0,0 +1,6 @@ +extends TextureProgressBar + +func _ready(): + self.value = 0 + var shield_tween = get_tree().create_tween() + shield_tween.tween_property(self, "value", 100, 3).set_trans(Tween.TRANS_LINEAR) diff --git a/progress_bar.gd.uid b/progress_bar.gd.uid new file mode 100644 index 0000000..40fa4b9 --- /dev/null +++ b/progress_bar.gd.uid @@ -0,0 +1 @@ +uid://b85ktxeoj4b2n diff --git a/progress_bar.tscn b/progress_bar.tscn new file mode 100644 index 0000000..7f8d56f --- /dev/null +++ b/progress_bar.tscn @@ -0,0 +1,19 @@ +[gd_scene load_steps=4 format=3 uid="uid://c8s7htpdg4v4i"] + +[ext_resource type="Texture2D" uid="uid://d11molrkdjjh5" path="res://bar_background.png" id="1_q0tf5"] +[ext_resource type="Texture2D" uid="uid://bsl3pxvxiuoqg" path="res://bar_foreground.png" id="2_5xu4y"] +[ext_resource type="Script" uid="uid://b85ktxeoj4b2n" path="res://progress_bar.gd" id="3_5xu4y"] + +[node name="ProgressBar" type="TextureProgressBar"] +anchors_preset = 10 +anchor_right = 1.0 +offset_bottom = 20.0 +grow_horizontal = 2 +nine_patch_stretch = true +stretch_margin_left = 8 +stretch_margin_top = 8 +stretch_margin_right = 8 +stretch_margin_bottom = 8 +texture_under = ExtResource("1_q0tf5") +texture_progress = ExtResource("2_5xu4y") +script = ExtResource("3_5xu4y") diff --git a/project.godot b/project.godot index c1bda8f..c9c0499 100644 --- a/project.godot +++ b/project.godot @@ -14,6 +14,10 @@ config/name="shmup01b" config/features=PackedStringArray("4.5", "Forward Plus") config/icon="res://icon.svg" +[autoload] + +Events="*res://events.gd" + [display] window/size/viewport_width=240 diff --git a/ui.gd b/ui.gd index ab2aa60..84b5ca4 100644 --- a/ui.gd +++ b/ui.gd @@ -3,12 +3,36 @@ extends MarginContainer @onready var shield_bar = $HBoxContainer/ShieldBar @onready var score_counter = $HBoxContainer/ScoreCounter +var shader_active = false + +func _ready(): + get_node("Player.Ship").node_ready.connect("shield_ui", self, "_on_shield_ui") + func update_score(value): score_counter.display_digits(value) -func update_shield(max_value, value): - var shield_tween = get_tree().create_tween() +func update_shield(max_value, value, old_value): + shield_bar.max_value = max_value shield_bar.value = value - shield_tween.tween_property(shield_bar, "value", "max_value", 3,).set_trans(Tween.TRANS_LINEAR) + + print("update_shield"," ","Current ",(value), " ", "(Max ",(max_value),")"," ","Old Value:"," ",old_value) + + if value >= max_value: + print("No need to tween!") + + else: + print("I should be tweening!") + var tween = create_tween() + tween.tween_property(shield_bar, "value", (old_value/max_value)*100, .25).set_trans(Tween.TRANS_LINEAR) + + + +func _on_shield_ui(): + print("SHIELD FX!") + shader_active = true + shield_bar.material.set_shader_parameter("toggle", 1.0) + await get_tree().create_timer(1).timeout + shader_active = false + shield_bar.material.set_shader_parameter("toggle", 0.0) diff --git a/ui.tscn b/ui.tscn index b0737fb..8729dae 100644 --- a/ui.tscn +++ b/ui.tscn @@ -1,10 +1,15 @@ -[gd_scene load_steps=5 format=3 uid="uid://s6wf3egdqtmh"] +[gd_scene load_steps=7 format=3 uid="uid://s6wf3egdqtmh"] [ext_resource type="Texture2D" uid="uid://d11molrkdjjh5" path="res://bar_background.png" id="1_m6e0p"] [ext_resource type="Script" uid="uid://b544c65halgk4" path="res://ui.gd" id="1_nltto"] [ext_resource type="Texture2D" uid="uid://bsl3pxvxiuoqg" path="res://bar_foreground.png" id="2_27fn8"] +[ext_resource type="Shader" uid="uid://dfywtah53il1m" path="res://player_hit.gdshader" id="2_ibotj"] [ext_resource type="PackedScene" uid="uid://5qkcf1cpre32" path="res://score_counter.tscn" id="4_ibotj"] +[sub_resource type="ShaderMaterial" id="ShaderMaterial_n5ude"] +shader = ExtResource("2_ibotj") +shader_parameter/toggle = 0.0 + [node name="UI" type="MarginContainer"] anchors_preset = 10 anchor_right = 1.0 @@ -20,8 +25,11 @@ script = ExtResource("1_nltto") layout_mode = 2 [node name="ShieldBar" type="TextureProgressBar" parent="HBoxContainer"] +material = SubResource("ShaderMaterial_n5ude") custom_minimum_size = Vector2(80, 16) layout_mode = 2 +step = 0.0 +value = 100.0 nine_patch_stretch = true stretch_margin_left = 3 stretch_margin_top = 3 @@ -32,3 +40,5 @@ texture_progress = ExtResource("2_27fn8") [node name="ScoreCounter" parent="HBoxContainer" instance=ExtResource("4_ibotj")] layout_mode = 2 + +[connection signal="value_changed" from="HBoxContainer/ShieldBar" to="." method="_on_shield_bar_value_changed"] From 1ebba28e5df5bfb3aceb5911f0c4de9342241518 Mon Sep 17 00:00:00 2001 From: Henry Date: Mon, 15 Dec 2025 10:20:23 +0000 Subject: [PATCH 02/20] Updated event_bus to have shield change single; attempted to update player's set shield but running into problems at runtime. --- event_bus.gd | 7 +++++++ events.gd.uid => event_bus.gd.uid | 0 events.gd | 2 -- main.tscn | 5 +++-- player.gd | 3 +-- project.godot | 2 +- ui.gd | 11 ++++++----- 7 files changed, 18 insertions(+), 12 deletions(-) create mode 100644 event_bus.gd rename events.gd.uid => event_bus.gd.uid (100%) delete mode 100644 events.gd diff --git a/event_bus.gd b/event_bus.gd new file mode 100644 index 0000000..d860734 --- /dev/null +++ b/event_bus.gd @@ -0,0 +1,7 @@ +extends Node + +@warning_ignore_start("unused_signal") # since otherwise Godot will throw a warning that the signal is unused in current scope + +signal shield_changed(max_value: int, old_value: int, new_value: int) + +@warning_ignore_restore("unused_signal") # put any future signals you add between the two ignore annotations diff --git a/events.gd.uid b/event_bus.gd.uid similarity index 100% rename from events.gd.uid rename to event_bus.gd.uid diff --git a/events.gd b/events.gd deleted file mode 100644 index 487b284..0000000 --- a/events.gd +++ /dev/null @@ -1,2 +0,0 @@ -extends Node - diff --git a/main.tscn b/main.tscn index c4f77db..3a9c041 100644 --- a/main.tscn +++ b/main.tscn @@ -61,6 +61,9 @@ region_rect = Rect2(0, 0, 240, 320) [node name="Player" parent="." instance=ExtResource("2_0xm2m")] position = Vector2(123, 270) +max_shield = null +speed = null +cooldown = null [node name="AnimationPlayer" type="AnimationPlayer" parent="."] libraries = { @@ -89,6 +92,4 @@ texture_normal = ExtResource("5_lquwl") layout_mode = 2 texture = ExtResource("6_7mycd") -[connection signal="died" from="Player" to="." method="_on_player_died"] -[connection signal="shield_changed" from="Player" to="CanvasLayer/UI" method="update_shield"] [connection signal="pressed" from="CanvasLayer/CenterContainer/Start" to="." method="_on_start_pressed"] diff --git a/player.gd b/player.gd index 464581a..199b65b 100644 --- a/player.gd +++ b/player.gd @@ -1,7 +1,6 @@ extends Area2D signal died -signal shield_changed(max_value: int, old_value: int, new_value: int) signal damage_taken signal shield_damage signal shield_ui @@ -31,7 +30,7 @@ func start(): func set_shield(value: int): var old_value: int = shield shield = min(max_shield, value) - shield_changed.emit(max_shield, old_value, shield) + EventBus.shield_changed.emit(max_shield, old_value, shield) shield_damage.emit() if shield <= 0: set_process(false) diff --git a/project.godot b/project.godot index c9c0499..d690f5a 100644 --- a/project.godot +++ b/project.godot @@ -16,7 +16,7 @@ config/icon="res://icon.svg" [autoload] -Events="*res://events.gd" +EventBus="*res://event_bus.gd" [display] diff --git a/ui.gd b/ui.gd index 84b5ca4..8a47310 100644 --- a/ui.gd +++ b/ui.gd @@ -6,20 +6,21 @@ extends MarginContainer var shader_active = false func _ready(): - get_node("Player.Ship").node_ready.connect("shield_ui", self, "_on_shield_ui") + get_node("Player.Ship").node_ready.connect("shield_ui", self, "_on_shield_ui") + EventBus.shield_changed.connect(_on_shield_changed) func update_score(value): score_counter.display_digits(value) -func update_shield(max_value, value, old_value): +func _on_shield_changed(max_value: int, old_value: int, new_value: int) -> void: shield_bar.max_value = max_value - shield_bar.value = value + shield_bar.value = new_value - print("update_shield"," ","Current ",(value), " ", "(Max ",(max_value),")"," ","Old Value:"," ",old_value) + print("update_shield"," ","Current ",(new_value), " ", "(Max ",(max_value),")"," ","Old Value:"," ",old_value) - if value >= max_value: + if new_value >= max_value: print("No need to tween!") else: From d739beb6f2c94ebedb1790932e5cbebecc67a60d Mon Sep 17 00:00:00 2001 From: Henry Date: Mon, 15 Dec 2025 12:03:13 +0000 Subject: [PATCH 03/20] Cleaned up @export and @onready ordering; commented out unfinished features. --- player.gd | 66 +++++++++++++++++++++++++++---------------------------- ui.gd | 18 +++++++-------- 2 files changed, 42 insertions(+), 42 deletions(-) diff --git a/player.gd b/player.gd index 199b65b..7de3649 100644 --- a/player.gd +++ b/player.gd @@ -2,20 +2,20 @@ extends Area2D signal died signal damage_taken -signal shield_damage -signal shield_ui +# signal shield_damage +# signal shield_ui - -var shader_active = false - -@onready var screensize = get_viewport_rect().size -@export var max_shield = 10 -var shield: int = max_shield: - set = set_shield @export var speed = 150 @export var cooldown = 0.25 @export var bullet_scene : PackedScene +@export var max_shield: int = 10 +var shield: int = max_shield: + set = set_shield + var can_shoot = true +var shader_active = false + +@onready var screensize = get_viewport_rect().size func _ready(): start() @@ -23,32 +23,10 @@ func _ready(): func start(): set_process(true) $Ship.show() - shield = max_shield position = Vector2(screensize.x / 2, screensize.y - 64) + shield = max_shield $GunCooldown.wait_time = cooldown -func set_shield(value: int): - var old_value: int = shield - shield = min(max_shield, value) - EventBus.shield_changed.emit(max_shield, old_value, shield) - shield_damage.emit() - if shield <= 0: - set_process(false) - $Ship.hide() - $Explosion.show() - $Explosion/AnimationPlayer.play("explosion-one-shot") - await $Explosion/AnimationPlayer.animation_finished - died.emit() - -func shoot(): - if not can_shoot: - return - can_shoot = false - $GunCooldown.start() - var b = bullet_scene.instantiate() - get_tree().root.add_child(b) - b.start(position + Vector2(0, -8)) - func _process(delta): var input = Input.get_vector("left", "right", "up", "down") if input.x > 0: @@ -65,6 +43,28 @@ func _process(delta): if Input.is_action_pressed("shoot"): shoot() +func shoot(): + if not can_shoot: + return + can_shoot = false + $GunCooldown.start() + var b = bullet_scene.instantiate() + get_tree().root.add_child(b) + b.start(position + Vector2(0, -8)) + +func set_shield(value: int): + var old_value: int = shield + shield = min(max_shield, value) + EventBus.shield_changed.emit(max_shield, old_value, shield) + # shield_damage.emit() + if shield <= 0: + set_process(false) + $Ship.hide() + $Explosion.show() + $Explosion/AnimationPlayer.play("explosion-one-shot") + await $Explosion/AnimationPlayer.animation_finished + died.emit() + func _on_gun_cooldown_timeout(): can_shoot = true @@ -81,7 +81,7 @@ func _on_area_entered(area): func _on_damage_taken() -> void: - emit_signal("shield_ui") + # emit_signal("shield_ui") shader_active = true $Ship.material.set_shader_parameter("toggle", 1.0) await get_tree().create_timer(1).timeout diff --git a/ui.gd b/ui.gd index 8a47310..70f1282 100644 --- a/ui.gd +++ b/ui.gd @@ -3,10 +3,10 @@ extends MarginContainer @onready var shield_bar = $HBoxContainer/ShieldBar @onready var score_counter = $HBoxContainer/ScoreCounter -var shader_active = false +# var shader_active = false func _ready(): - get_node("Player.Ship").node_ready.connect("shield_ui", self, "_on_shield_ui") + # get_node("Player.Ship").node_ready.connect("shield_ui", self, "_on_shield_ui") EventBus.shield_changed.connect(_on_shield_changed) func update_score(value): @@ -30,10 +30,10 @@ func _on_shield_changed(max_value: int, old_value: int, new_value: int) -> void: -func _on_shield_ui(): - print("SHIELD FX!") - shader_active = true - shield_bar.material.set_shader_parameter("toggle", 1.0) - await get_tree().create_timer(1).timeout - shader_active = false - shield_bar.material.set_shader_parameter("toggle", 0.0) +# func _on_shield_ui(): +# print("SHIELD FX!") +# shader_active = true +# shield_bar.material.set_shader_parameter("toggle", 1.0) +# await get_tree().create_timer(1).timeout +# shader_active = false +# shield_bar.material.set_shader_parameter("toggle", 0.0) From 65a887e9db9ca28d5c197abd28f62314e5ccb267 Mon Sep 17 00:00:00 2001 From: Henry Date: Tue, 16 Dec 2025 00:05:26 +0000 Subject: [PATCH 04/20] Fixed an issue with a signal for cool down; still having an issue with wait_time and vector2 controlling movement. --- player.gd | 9 +++++---- player.tscn | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/player.gd b/player.gd index 7de3649..b3628ec 100644 --- a/player.gd +++ b/player.gd @@ -16,6 +16,10 @@ var can_shoot = true var shader_active = false @onready var screensize = get_viewport_rect().size +@onready var explosion = $Explosion +@onready var gun_cooldown = $GunCooldown +@onready var ship = $Ship +@onready var cooldown_timer = $CooldownTimer func _ready(): start() @@ -65,12 +69,9 @@ func set_shield(value: int): await $Explosion/AnimationPlayer.animation_finished died.emit() -func _on_gun_cooldown_timeout(): +func _on_gun_cooldown_timeout() -> void: can_shoot = true -func _on_gun_cool_down_timeout() -> void: - can_shoot = true - func _on_area_entered(area): if area.is_in_group("enemies"): area.explode() diff --git a/player.tscn b/player.tscn index a03d9b8..2f69b80 100644 --- a/player.tscn +++ b/player.tscn @@ -104,4 +104,4 @@ visible = false [connection signal="area_entered" from="." to="." method="_on_area_entered"] [connection signal="damage_taken" from="." to="." method="_on_damage_taken"] -[connection signal="timeout" from="GunCooldown" to="." method="_on_gun_cool_down_timeout"] +[connection signal="timeout" from="GunCooldown" to="." method="_on_gun_cooldown_timeout"] From 9f2569a73c875e1c06777732464065f04e93dcce Mon Sep 17 00:00:00 2001 From: Henry Date: Tue, 16 Dec 2025 09:25:40 +0000 Subject: [PATCH 05/20] Identified @export variables as int, float and the game started again! --- player.gd | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/player.gd b/player.gd index b3628ec..cb86125 100644 --- a/player.gd +++ b/player.gd @@ -5,8 +5,8 @@ signal damage_taken # signal shield_damage # signal shield_ui -@export var speed = 150 -@export var cooldown = 0.25 +@export var speed: int = 150 +@export var cooldown: float = 0.25 @export var bullet_scene : PackedScene @export var max_shield: int = 10 var shield: int = max_shield: @@ -17,9 +17,8 @@ var shader_active = false @onready var screensize = get_viewport_rect().size @onready var explosion = $Explosion -@onready var gun_cooldown = $GunCooldown +@onready var wait_time = $GunCooldown @onready var ship = $Ship -@onready var cooldown_timer = $CooldownTimer func _ready(): start() @@ -49,18 +48,21 @@ func _process(delta): func shoot(): if not can_shoot: - return + return can_shoot = false $GunCooldown.start() var b = bullet_scene.instantiate() get_tree().root.add_child(b) b.start(position + Vector2(0, -8)) + var tween = create_tween().set_parallel(false) + tween.tween_property($Ship, "position:y", 1, 0.1) + tween.tween_property($Ship, "position:y", 0, 0.05) func set_shield(value: int): var old_value: int = shield shield = min(max_shield, value) EventBus.shield_changed.emit(max_shield, old_value, shield) - # shield_damage.emit() + # shield_damage.emit() # Don't need this anymore since switching to event_bus.gd if shield <= 0: set_process(false) $Ship.hide() From afc5c68569554398c79c84dd0e16bb094f5203bd Mon Sep 17 00:00:00 2001 From: Henry Date: Tue, 16 Dec 2025 13:09:52 +0000 Subject: [PATCH 06/20] Fixed _on_shield_changed logic to smoothly tween shield bar. Added a function call to trigger shader to flash shield bar. --- ui.gd | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/ui.gd b/ui.gd index 70f1282..0b68d23 100644 --- a/ui.gd +++ b/ui.gd @@ -3,7 +3,7 @@ extends MarginContainer @onready var shield_bar = $HBoxContainer/ShieldBar @onready var score_counter = $HBoxContainer/ScoreCounter -# var shader_active = false +var shader_active = false func _ready(): # get_node("Player.Ship").node_ready.connect("shield_ui", self, "_on_shield_ui") @@ -18,22 +18,26 @@ func _on_shield_changed(max_value: int, old_value: int, new_value: int) -> void: shield_bar.max_value = max_value shield_bar.value = new_value - print("update_shield"," ","Current ",(new_value), " ", "(Max ",(max_value),")"," ","Old Value:"," ",old_value) + print("update_shield"," ","Current ",(new_value), " ", "(Max ",(max_value),")"," ","Old Value:"," ",(old_value)) if new_value >= max_value: print("No need to tween!") else: print("I should be tweening!") + var shield_depletion = int(old_value - new_value) + print("Shield Depletion:", old_value, "-", new_value, " = ", shield_depletion) var tween = create_tween() - tween.tween_property(shield_bar, "value", (old_value/max_value)*100, .25).set_trans(Tween.TRANS_LINEAR) + tween.tween_property(shield_bar, "value", new_value - shield_depletion, .20).set_trans(Tween.TRANS_LINEAR) + _on_shield_ui() -# func _on_shield_ui(): -# print("SHIELD FX!") -# shader_active = true -# shield_bar.material.set_shader_parameter("toggle", 1.0) -# await get_tree().create_timer(1).timeout -# shader_active = false -# shield_bar.material.set_shader_parameter("toggle", 0.0) + +func _on_shield_ui(): + print("SHIELD FX!") + shader_active = true + shield_bar.material.set_shader_parameter("toggle", 1.0) + await get_tree().create_timer(1).timeout + shader_active = false + shield_bar.material.set_shader_parameter("toggle", 0.0) From a73fb28552a011c731099e86e29f867b92588dbe Mon Sep 17 00:00:00 2001 From: Henry Date: Tue, 16 Dec 2025 23:19:03 +0000 Subject: [PATCH 07/20] Troubleshooting player_died signal. --- enemy.gd | 4 +--- event_bus.gd | 2 ++ explosion.tscn | 32 ++++++++++++++++---------------- main.gd | 26 +++++++++++++++----------- main.tscn | 5 +---- player.gd | 16 ++++++++-------- ui.gd | 19 +++++-------------- 7 files changed, 48 insertions(+), 56 deletions(-) diff --git a/enemy.gd b/enemy.gd index ec0f53f..06a682b 100644 --- a/enemy.gd +++ b/enemy.gd @@ -1,7 +1,5 @@ extends Area2D -signal died - var bullet_scene = preload("res://enemy_bullet.tscn") var start_pos = Vector2.ZERO var speed = 0 @@ -41,6 +39,6 @@ func explode(): speed = 0 $AnimationPlayer.play("explode") set_deferred("monitoring", false) - died.emit(5) + EventBus.enemy_died.emit(5) await $AnimationPlayer.animation_finished queue_free() diff --git a/event_bus.gd b/event_bus.gd index d860734..d2b4464 100644 --- a/event_bus.gd +++ b/event_bus.gd @@ -3,5 +3,7 @@ extends Node @warning_ignore_start("unused_signal") # since otherwise Godot will throw a warning that the signal is unused in current scope signal shield_changed(max_value: int, old_value: int, new_value: int) +signal player_died() +signal enemy_died() @warning_ignore_restore("unused_signal") # put any future signals you add between the two ignore annotations diff --git a/explosion.tscn b/explosion.tscn index 7aa41d2..c917f03 100644 --- a/explosion.tscn +++ b/explosion.tscn @@ -2,6 +2,21 @@ [ext_resource type="Texture2D" uid="uid://h04wm5a27u0" path="res://Mini Pixel Pack 3/Effects/Explosion (16 x 16).png" id="1_q7epf"] +[sub_resource type="Animation" id="Animation_j4sxf"] +length = 0.001 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath(".:frame") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [0] +} + [sub_resource type="Animation" id="Animation_vxas0"] resource_name = "explosion-one-shot" length = 0.5 @@ -19,21 +34,6 @@ tracks/0/keys = { "values": [0, 1, 3, 4, 5] } -[sub_resource type="Animation" id="Animation_j4sxf"] -length = 0.001 -tracks/0/type = "value" -tracks/0/imported = false -tracks/0/enabled = true -tracks/0/path = NodePath(".:frame") -tracks/0/interp = 1 -tracks/0/loop_wrap = true -tracks/0/keys = { -"times": PackedFloat32Array(0), -"transitions": PackedFloat32Array(1), -"update": 1, -"values": [0] -} - [sub_resource type="AnimationLibrary" id="AnimationLibrary_m5xho"] _data = { &"RESET": SubResource("Animation_j4sxf"), @@ -48,4 +48,4 @@ hframes = 6 libraries = { &"": SubResource("AnimationLibrary_m5xho") } -autoplay = "explosion-one-shot" +autoplay = "RESET" diff --git a/main.gd b/main.gd index 21a74fb..6c64fbb 100644 --- a/main.gd +++ b/main.gd @@ -1,22 +1,17 @@ extends Node2D +var enemy = preload("res://enemy.tscn") +var score = 0 +var playing = false + @onready var start_button = $CanvasLayer/CenterContainer/Start @onready var game_over = $CanvasLayer/CenterContainer/GameOver -var enemy = preload("res://enemy.tscn") -var score = 0 - func _ready(): - start_button.show() game_over.hide() + start_button.show() # spawn_enemies() -func new_game(): - score = 0 - $CanvasLayer/UI.update_score(score) - $Player.start() - spawn_enemies() - func spawn_enemies(): for x in range(9): for y in range(3): @@ -24,19 +19,28 @@ func spawn_enemies(): var pos = Vector2(x * (16 + 8) + 24, 16 * 4 + y * 16) add_child(e) e.start(pos) - e.died.connect(_on_enemy_died) + EventBus.enemy_died.emit() func _on_enemy_died(value): score += value $CanvasLayer/UI.update_score(score) func _on_player_died(): + print("game over") + playing = false get_tree().call_group("enemies", "queue_free") game_over.show() await get_tree().create_timer(2).timeout game_over.hide() start_button.show() +func new_game(): + score = 0 + $CanvasLayer/UI.update_score(score) + $Player.start() + spawn_enemies() + playing = true + func _on_start_pressed(): start_button.hide() new_game() diff --git a/main.tscn b/main.tscn index 3a9c041..b4b9795 100644 --- a/main.tscn +++ b/main.tscn @@ -60,10 +60,7 @@ region_enabled = true region_rect = Rect2(0, 0, 240, 320) [node name="Player" parent="." instance=ExtResource("2_0xm2m")] -position = Vector2(123, 270) -max_shield = null -speed = null -cooldown = null +position = Vector2(123, 272) [node name="AnimationPlayer" type="AnimationPlayer" parent="."] libraries = { diff --git a/player.gd b/player.gd index cb86125..317437e 100644 --- a/player.gd +++ b/player.gd @@ -1,6 +1,6 @@ extends Area2D -signal died + signal damage_taken # signal shield_damage # signal shield_ui @@ -62,14 +62,14 @@ func set_shield(value: int): var old_value: int = shield shield = min(max_shield, value) EventBus.shield_changed.emit(max_shield, old_value, shield) - # shield_damage.emit() # Don't need this anymore since switching to event_bus.gd + print("Shield set to:", shield) if shield <= 0: - set_process(false) - $Ship.hide() - $Explosion.show() - $Explosion/AnimationPlayer.play("explosion-one-shot") - await $Explosion/AnimationPlayer.animation_finished - died.emit() + set_process(false) + $Ship.hide() + $Explosion.show() + $Explosion/AnimationPlayer.play("explosion-one-shot") + await $Explosion/AnimationPlayer.animation_finished + EventBus.player_died.emit() func _on_gun_cooldown_timeout() -> void: can_shoot = true diff --git a/ui.gd b/ui.gd index 0b68d23..7c1ec10 100644 --- a/ui.gd +++ b/ui.gd @@ -17,25 +17,16 @@ func _on_shield_changed(max_value: int, old_value: int, new_value: int) -> void: shield_bar.max_value = max_value shield_bar.value = new_value - - print("update_shield"," ","Current ",(new_value), " ", "(Max ",(max_value),")"," ","Old Value:"," ",(old_value)) - - if new_value >= max_value: - print("No need to tween!") - - else: - print("I should be tweening!") - var shield_depletion = int(old_value - new_value) - print("Shield Depletion:", old_value, "-", new_value, " = ", shield_depletion) - var tween = create_tween() - tween.tween_property(shield_bar, "value", new_value - shield_depletion, .20).set_trans(Tween.TRANS_LINEAR) - _on_shield_ui() + var shield_depletion = int(old_value - new_value) + print("Shield Depletion:", old_value, "-", new_value, " = ", shield_depletion) + var tween = create_tween() + tween.tween_property(shield_bar, "value", new_value - shield_depletion, .20).set_trans(Tween.TRANS_LINEAR) + _on_shield_ui() func _on_shield_ui(): - print("SHIELD FX!") shader_active = true shield_bar.material.set_shader_parameter("toggle", 1.0) await get_tree().create_timer(1).timeout From 485f03d702d6baee97c226e437bbceaa0173a035 Mon Sep 17 00:00:00 2001 From: Henry Date: Wed, 17 Dec 2025 09:19:01 +0000 Subject: [PATCH 08/20] Fixed signals; removed most extra debug output. Still issues with shieldbar showing accurate damage, but functionality of main branch restored. --- enemy.gd | 1 + main.gd | 6 +++++- ui.gd | 4 ++-- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/enemy.gd b/enemy.gd index 06a682b..87972c8 100644 --- a/enemy.gd +++ b/enemy.gd @@ -36,6 +36,7 @@ func _process(delta): func explode(): + print_debug("Enemy died!") speed = 0 $AnimationPlayer.play("explode") set_deferred("monitoring", false) diff --git a/main.gd b/main.gd index 6c64fbb..08652df 100644 --- a/main.gd +++ b/main.gd @@ -10,6 +10,8 @@ var playing = false func _ready(): game_over.hide() start_button.show() + EventBus.player_died.connect(_on_player_died) + EventBus.enemy_died.connect(_on_enemy_died) # spawn_enemies() func spawn_enemies(): @@ -21,12 +23,14 @@ func spawn_enemies(): e.start(pos) EventBus.enemy_died.emit() + + func _on_enemy_died(value): + print_debug("Enemy died!") score += value $CanvasLayer/UI.update_score(score) func _on_player_died(): - print("game over") playing = false get_tree().call_group("enemies", "queue_free") game_over.show() diff --git a/ui.gd b/ui.gd index 7c1ec10..b36b0b2 100644 --- a/ui.gd +++ b/ui.gd @@ -21,12 +21,12 @@ func _on_shield_changed(max_value: int, old_value: int, new_value: int) -> void: print("Shield Depletion:", old_value, "-", new_value, " = ", shield_depletion) var tween = create_tween() tween.tween_property(shield_bar, "value", new_value - shield_depletion, .20).set_trans(Tween.TRANS_LINEAR) - _on_shield_ui() + _on_fx_shield_ui() -func _on_shield_ui(): +func _on_fx_shield_ui(): shader_active = true shield_bar.material.set_shader_parameter("toggle", 1.0) await get_tree().create_timer(1).timeout From 7ef6076edaf31c4efe424dd9db952a960f27eb4b Mon Sep 17 00:00:00 2001 From: Henry Date: Wed, 17 Dec 2025 19:17:46 +0000 Subject: [PATCH 09/20] Removed extraneous enemy_died signal from spawning; used get_nodes_in_group for enemy_count --- enemy.gd | 2 +- event_bus.gd | 2 +- main.gd | 23 ++++++++++++++++++----- player.gd | 2 +- ui.gd | 2 -- 5 files changed, 21 insertions(+), 10 deletions(-) diff --git a/enemy.gd b/enemy.gd index 87972c8..e9e4046 100644 --- a/enemy.gd +++ b/enemy.gd @@ -36,7 +36,7 @@ func _process(delta): func explode(): - print_debug("Enemy died!") + print_debug("Enemy explode!") speed = 0 $AnimationPlayer.play("explode") set_deferred("monitoring", false) diff --git a/event_bus.gd b/event_bus.gd index d2b4464..95a4a10 100644 --- a/event_bus.gd +++ b/event_bus.gd @@ -4,6 +4,6 @@ extends Node signal shield_changed(max_value: int, old_value: int, new_value: int) signal player_died() -signal enemy_died() +signal enemy_died(value: int) @warning_ignore_restore("unused_signal") # put any future signals you add between the two ignore annotations diff --git a/main.gd b/main.gd index 08652df..3c70bcf 100644 --- a/main.gd +++ b/main.gd @@ -3,6 +3,7 @@ extends Node2D var enemy = preload("res://enemy.tscn") var score = 0 var playing = false +var enemy_count: int = 0 @onready var start_button = $CanvasLayer/CenterContainer/Start @onready var game_over = $CanvasLayer/CenterContainer/GameOver @@ -15,20 +16,25 @@ func _ready(): # spawn_enemies() func spawn_enemies(): + for x in range(9): - for y in range(3): + for y in range(3): var e = enemy.instantiate() var pos = Vector2(x * (16 + 8) + 24, 16 * 4 + y * 16) add_child(e) e.start(pos) - EventBus.enemy_died.emit() + enemy_count = get_tree().get_nodes_in_group("enemies").size() + print(enemy_count) - -func _on_enemy_died(value): - print_debug("Enemy died!") +func _on_enemy_died(value: int): score += value + enemy_count -= 1 $CanvasLayer/UI.update_score(score) + print_debug(enemy_count) + if enemy_count == 0: + print("All enemies defeated!") + win_game() func _on_player_died(): playing = false @@ -48,3 +54,10 @@ func new_game(): func _on_start_pressed(): start_button.hide() new_game() + +func win_game(): + playing = false + game_over.show() + await get_tree().create_timer(2).timeout + game_over.hide() + start_button.show() diff --git a/player.gd b/player.gd index 317437e..c52128b 100644 --- a/player.gd +++ b/player.gd @@ -77,7 +77,7 @@ func _on_gun_cooldown_timeout() -> void: func _on_area_entered(area): if area.is_in_group("enemies"): area.explode() - shield -= max_shield / 2 + shield -= int(max_shield / 2) damage_taken.emit() if area.is_in_group("enemy_bullets"): damage_taken.emit() diff --git a/ui.gd b/ui.gd index b36b0b2..633abf8 100644 --- a/ui.gd +++ b/ui.gd @@ -24,8 +24,6 @@ func _on_shield_changed(max_value: int, old_value: int, new_value: int) -> void: _on_fx_shield_ui() - - func _on_fx_shield_ui(): shader_active = true shield_bar.material.set_shader_parameter("toggle", 1.0) From dec3cbe595e028bfeb18838d1b9d27046fe0dd24 Mon Sep 17 00:00:00 2001 From: Henry Date: Sat, 20 Dec 2025 09:15:59 +0000 Subject: [PATCH 10/20] Set up new signals in EventBus; preparing to restructure game start code. --- enemy.gd | 4 ++++ event_bus.gd | 2 ++ global.gd | 6 ++++++ global.gd.uid | 1 + main.gd | 10 +++++----- player.gd | 11 +++++++---- project.godot | 1 + ui.gd | 12 ++++++++---- ui.tscn | 1 - 9 files changed, 34 insertions(+), 14 deletions(-) create mode 100644 global.gd create mode 100644 global.gd.uid diff --git a/enemy.gd b/enemy.gd index e9e4046..75cfd78 100644 --- a/enemy.gd +++ b/enemy.gd @@ -4,6 +4,8 @@ var bullet_scene = preload("res://enemy_bullet.tscn") var start_pos = Vector2.ZERO var speed = 0 +var exploding = false + @onready var screensize = get_viewport_rect().size func start(pos): @@ -36,6 +38,8 @@ func _process(delta): func explode(): + if exploding: return + exploding = true print_debug("Enemy explode!") speed = 0 $AnimationPlayer.play("explode") diff --git a/event_bus.gd b/event_bus.gd index 95a4a10..ff7fa67 100644 --- a/event_bus.gd +++ b/event_bus.gd @@ -5,5 +5,7 @@ extends Node signal shield_changed(max_value: int, old_value: int, new_value: int) signal player_died() signal enemy_died(value: int) +signal initialize_shieldbar() +signal start_game() @warning_ignore_restore("unused_signal") # put any future signals you add between the two ignore annotations diff --git a/global.gd b/global.gd new file mode 100644 index 0000000..34798f8 --- /dev/null +++ b/global.gd @@ -0,0 +1,6 @@ +extends Node + +# Global Game variables +var score: int = 0 +var new_game = true +var playing = false diff --git a/global.gd.uid b/global.gd.uid new file mode 100644 index 0000000..73ebf5f --- /dev/null +++ b/global.gd.uid @@ -0,0 +1 @@ +uid://dhfukspc2nyu0 diff --git a/main.gd b/main.gd index 3c70bcf..301ffc1 100644 --- a/main.gd +++ b/main.gd @@ -1,7 +1,6 @@ extends Node2D var enemy = preload("res://enemy.tscn") -var score = 0 var playing = false var enemy_count: int = 0 @@ -28,9 +27,9 @@ func spawn_enemies(): func _on_enemy_died(value: int): - score += value + Global.score += value enemy_count -= 1 - $CanvasLayer/UI.update_score(score) + $CanvasLayer/UI.update_score(Global.score) print_debug(enemy_count) if enemy_count == 0: print("All enemies defeated!") @@ -45,8 +44,9 @@ func _on_player_died(): start_button.show() func new_game(): - score = 0 - $CanvasLayer/UI.update_score(score) + Global.score = 0 + EventBus.initialize_shieldbar.emit() + $CanvasLayer/UI.update_score(Global.score) $Player.start() spawn_enemies() playing = true diff --git a/player.gd b/player.gd index c52128b..bea960e 100644 --- a/player.gd +++ b/player.gd @@ -14,6 +14,7 @@ var shield: int = max_shield: var can_shoot = true var shader_active = false +var clamp_shield = clamp(shield, 0, max_shield) @onready var screensize = get_viewport_rect().size @onready var explosion = $Explosion @@ -27,8 +28,10 @@ func start(): set_process(true) $Ship.show() position = Vector2(screensize.x / 2, screensize.y - 64) - shield = max_shield $GunCooldown.wait_time = cooldown + var old_value = 0 + set_shield(max_shield) + EventBus.shield_changed.emit(max_shield, old_value, shield) func _process(delta): var input = Input.get_vector("left", "right", "up", "down") @@ -59,17 +62,17 @@ func shoot(): tween.tween_property($Ship, "position:y", 0, 0.05) func set_shield(value: int): - var old_value: int = shield - shield = min(max_shield, value) + var old_value = shield + shield = clamp(value, 0, max_shield) EventBus.shield_changed.emit(max_shield, old_value, shield) print("Shield set to:", shield) if shield <= 0: + EventBus.player_died.emit() set_process(false) $Ship.hide() $Explosion.show() $Explosion/AnimationPlayer.play("explosion-one-shot") await $Explosion/AnimationPlayer.animation_finished - EventBus.player_died.emit() func _on_gun_cooldown_timeout() -> void: can_shoot = true diff --git a/project.godot b/project.godot index d690f5a..e8ea034 100644 --- a/project.godot +++ b/project.godot @@ -17,6 +17,7 @@ config/icon="res://icon.svg" [autoload] EventBus="*res://event_bus.gd" +Global="*res://global.gd" [display] diff --git a/ui.gd b/ui.gd index 633abf8..9cc4abe 100644 --- a/ui.gd +++ b/ui.gd @@ -8,19 +8,17 @@ var shader_active = false func _ready(): # get_node("Player.Ship").node_ready.connect("shield_ui", self, "_on_shield_ui") EventBus.shield_changed.connect(_on_shield_changed) + EventBus.initialize_shieldbar.connect(_on_initialize_shieldbar) func update_score(value): score_counter.display_digits(value) func _on_shield_changed(max_value: int, old_value: int, new_value: int) -> void: - shield_bar.max_value = max_value shield_bar.value = new_value - var shield_depletion = int(old_value - new_value) - print("Shield Depletion:", old_value, "-", new_value, " = ", shield_depletion) var tween = create_tween() - tween.tween_property(shield_bar, "value", new_value - shield_depletion, .20).set_trans(Tween.TRANS_LINEAR) + tween.tween_property(shield_bar, "value", new_value, 3).set_trans(Tween.TRANS_LINEAR) _on_fx_shield_ui() @@ -30,3 +28,9 @@ func _on_fx_shield_ui(): await get_tree().create_timer(1).timeout shader_active = false shield_bar.material.set_shader_parameter("toggle", 0.0) + +func _on_initialize_shieldbar(): + print("Shieldbar Initializing!") + # var tween = create_tween() + # tween.tween_property(shield_bar, "value", 10, 3).set_trans(Tween.TRANS_LINEAR) + # print("Tweens played!") diff --git a/ui.tscn b/ui.tscn index 8729dae..0e897c0 100644 --- a/ui.tscn +++ b/ui.tscn @@ -29,7 +29,6 @@ material = SubResource("ShaderMaterial_n5ude") custom_minimum_size = Vector2(80, 16) layout_mode = 2 step = 0.0 -value = 100.0 nine_patch_stretch = true stretch_margin_left = 3 stretch_margin_top = 3 From 099440d27fecc57c335e0b02ef2d4bdd0262accb Mon Sep 17 00:00:00 2001 From: Henry Date: Sat, 20 Dec 2025 19:37:32 +0000 Subject: [PATCH 11/20] Player now comes up from the bottom of the screen on a new game. --- main.gd | 2 +- player.gd | 21 +++++++++++++-------- ui.gd | 10 ++++++---- 3 files changed, 20 insertions(+), 13 deletions(-) diff --git a/main.gd b/main.gd index 301ffc1..d24ef2c 100644 --- a/main.gd +++ b/main.gd @@ -46,8 +46,8 @@ func _on_player_died(): func new_game(): Global.score = 0 EventBus.initialize_shieldbar.emit() - $CanvasLayer/UI.update_score(Global.score) $Player.start() + $CanvasLayer/UI.update_score(Global.score) spawn_enemies() playing = true diff --git a/player.gd b/player.gd index bea960e..20da701 100644 --- a/player.gd +++ b/player.gd @@ -9,7 +9,7 @@ signal damage_taken @export var cooldown: float = 0.25 @export var bullet_scene : PackedScene @export var max_shield: int = 10 -var shield: int = max_shield: +var shield: int = 0: set = set_shield var can_shoot = true @@ -22,16 +22,21 @@ var clamp_shield = clamp(shield, 0, max_shield) @onready var ship = $Ship func _ready(): - start() + print(shield) + $Ship.hide() + # start() func start(): + print(shield) set_process(true) $Ship.show() - position = Vector2(screensize.x / 2, screensize.y - 64) + position = Vector2(screensize.x / 2, screensize.y + 32) + var tween = create_tween() + tween.tween_property($Ship, "position:y", 32 * -1, .25) $GunCooldown.wait_time = cooldown - var old_value = 0 set_shield(max_shield) - EventBus.shield_changed.emit(max_shield, old_value, shield) + print(shield) + # EventBus.shield_changed.emit(max_shield, old_value, shield) func _process(delta): var input = Input.get_vector("left", "right", "up", "down") @@ -56,10 +61,10 @@ func shoot(): $GunCooldown.start() var b = bullet_scene.instantiate() get_tree().root.add_child(b) - b.start(position + Vector2(0, -8)) + b.start(position + $Ship.position + Vector2(0, -1)) var tween = create_tween().set_parallel(false) - tween.tween_property($Ship, "position:y", 1, 0.1) - tween.tween_property($Ship, "position:y", 0, 0.05) + tween.tween_property($Ship, "position:y", 1, 0.1).as_relative() + tween.tween_property($Ship, "position:y", 0, 0.05).as_relative() func set_shield(value: int): var old_value = shield diff --git a/ui.gd b/ui.gd index 9cc4abe..0f935d4 100644 --- a/ui.gd +++ b/ui.gd @@ -18,7 +18,8 @@ func _on_shield_changed(max_value: int, old_value: int, new_value: int) -> void: shield_bar.max_value = max_value shield_bar.value = new_value var tween = create_tween() - tween.tween_property(shield_bar, "value", new_value, 3).set_trans(Tween.TRANS_LINEAR) + print_debug("Tweening shield bar") + tween.tween_property(shield_bar, "value", new_value, .25).set_trans(Tween.TRANS_LINEAR) _on_fx_shield_ui() @@ -31,6 +32,7 @@ func _on_fx_shield_ui(): func _on_initialize_shieldbar(): print("Shieldbar Initializing!") - # var tween = create_tween() - # tween.tween_property(shield_bar, "value", 10, 3).set_trans(Tween.TRANS_LINEAR) - # print("Tweens played!") + var tween = create_tween() + tween.tween_property(shield_bar, "value", 100, .25).set_trans(Tween.TRANS_LINEAR) + print_debug("Tweens played!") + return From ec7a84c2521c8accae6be99ea4946cff761e628e Mon Sep 17 00:00:00 2001 From: Henry Date: Tue, 23 Dec 2025 10:38:27 +0000 Subject: [PATCH 12/20] Added shoot-to-start game code, re-ordered starting sequence using "playing" variable. --- main.gd | 14 ++++++++++++-- main.tscn | 4 ++-- player.gd | 25 ++++++++++++++++++------- ui.gd | 1 + 4 files changed, 33 insertions(+), 11 deletions(-) diff --git a/main.gd b/main.gd index d24ef2c..b85b6a3 100644 --- a/main.gd +++ b/main.gd @@ -12,6 +12,8 @@ func _ready(): start_button.show() EventBus.player_died.connect(_on_player_died) EventBus.enemy_died.connect(_on_enemy_died) + + # spawn_enemies() func spawn_enemies(): @@ -36,21 +38,28 @@ func _on_enemy_died(value: int): win_game() func _on_player_died(): - playing = false get_tree().call_group("enemies", "queue_free") game_over.show() await get_tree().create_timer(2).timeout game_over.hide() start_button.show() + playing = false func new_game(): Global.score = 0 - EventBus.initialize_shieldbar.emit() + # EventBus.initialize_shieldbar.emit() $Player.start() $CanvasLayer/UI.update_score(Global.score) spawn_enemies() playing = true + +func _input(EventInput): + if EventInput.is_action_pressed("shoot") and playing == false: + print("Input detected!") + start_button.hide() + new_game() + func _on_start_pressed(): start_button.hide() new_game() @@ -58,6 +67,7 @@ func _on_start_pressed(): func win_game(): playing = false game_over.show() + $Player._on_game_over() await get_tree().create_timer(2).timeout game_over.hide() start_button.show() diff --git a/main.tscn b/main.tscn index b4b9795..6c0c919 100644 --- a/main.tscn +++ b/main.tscn @@ -59,8 +59,8 @@ centered = false region_enabled = true region_rect = Rect2(0, 0, 240, 320) -[node name="Player" parent="." instance=ExtResource("2_0xm2m")] -position = Vector2(123, 272) +[node name="Player" parent="." groups=["ship"] instance=ExtResource("2_0xm2m")] +position = Vector2(123, 254) [node name="AnimationPlayer" type="AnimationPlayer" parent="."] libraries = { diff --git a/player.gd b/player.gd index 20da701..7674c32 100644 --- a/player.gd +++ b/player.gd @@ -12,7 +12,7 @@ signal damage_taken var shield: int = 0: set = set_shield -var can_shoot = true +var can_shoot = false var shader_active = false var clamp_shield = clamp(shield, 0, max_shield) @@ -22,20 +22,24 @@ var clamp_shield = clamp(shield, 0, max_shield) @onready var ship = $Ship func _ready(): + set_process(false) print(shield) $Ship.hide() # start() func start(): print(shield) - set_process(true) + $Ship.frame = 1 $Ship.show() - position = Vector2(screensize.x / 2, screensize.y + 32) + position = Vector2(screensize.x / 2, screensize.y) var tween = create_tween() - tween.tween_property($Ship, "position:y", 32 * -1, .25) + tween.tween_property(self, "position:y", 32 * -1, .25).as_relative() $GunCooldown.wait_time = cooldown set_shield(max_shield) print(shield) + await get_tree().create_timer(2).timeout + set_process(true) + can_shoot = true # EventBus.shield_changed.emit(max_shield, old_value, shield) func _process(delta): @@ -61,10 +65,10 @@ func shoot(): $GunCooldown.start() var b = bullet_scene.instantiate() get_tree().root.add_child(b) - b.start(position + $Ship.position + Vector2(0, -1)) + b.start(position + ship.position + Vector2(0, -1)) var tween = create_tween().set_parallel(false) - tween.tween_property($Ship, "position:y", 1, 0.1).as_relative() - tween.tween_property($Ship, "position:y", 0, 0.05).as_relative() + tween.tween_property(ship, "position:y", 1, 0.1) + tween.tween_property(ship, "position:y", 0, 0.05) func set_shield(value: int): var old_value = shield @@ -98,3 +102,10 @@ func _on_damage_taken() -> void: await get_tree().create_timer(1).timeout shader_active = false $Ship.material.set_shader_parameter("toggle", 0.0) + +func _on_game_over() -> void: + set_process(false) + $Ship.frame = 1 + await get_tree().create_timer(2).timeout + var tween = create_tween() + tween.tween_property(self, "position:y", 60 * -1, .25).set_ease(tween.EASE_IN) diff --git a/ui.gd b/ui.gd index 0f935d4..fda5c37 100644 --- a/ui.gd +++ b/ui.gd @@ -34,5 +34,6 @@ func _on_initialize_shieldbar(): print("Shieldbar Initializing!") var tween = create_tween() tween.tween_property(shield_bar, "value", 100, .25).set_trans(Tween.TRANS_LINEAR) + await tween.finished print_debug("Tweens played!") return From a20e496c2e248e95be1bab6746ee42f9e63c7a8e Mon Sep 17 00:00:00 2001 From: Henry Date: Tue, 23 Dec 2025 14:28:35 +0000 Subject: [PATCH 13/20] Enemies now stay on screen after player dies, until start of new game. --- enemy.gd | 6 ++++++ event_bus.gd | 1 + main.gd | 6 +++++- player.gd | 7 +++++-- 4 files changed, 17 insertions(+), 3 deletions(-) diff --git a/enemy.gd b/enemy.gd index 75cfd78..d2966b5 100644 --- a/enemy.gd +++ b/enemy.gd @@ -8,6 +8,9 @@ var exploding = false @onready var screensize = get_viewport_rect().size +func _ready() -> void: + EventBus.enemy_win.connect(_on_enemy_win) + func start(pos): speed = 0 position = Vector2(pos.x, -pos.y) @@ -21,6 +24,9 @@ func start(pos): $ShootTimer.wait_time = randf_range(4, 20) $ShootTimer.start() +func _on_enemy_win() -> void: + print("Enemy win!") + func _on_timer_timeout() -> void: speed = randf_range(75, 100) diff --git a/event_bus.gd b/event_bus.gd index ff7fa67..dac12af 100644 --- a/event_bus.gd +++ b/event_bus.gd @@ -5,6 +5,7 @@ extends Node signal shield_changed(max_value: int, old_value: int, new_value: int) signal player_died() signal enemy_died(value: int) +signal enemy_win() signal initialize_shieldbar() signal start_game() diff --git a/main.gd b/main.gd index b85b6a3..ec31202 100644 --- a/main.gd +++ b/main.gd @@ -38,7 +38,10 @@ func _on_enemy_died(value: int): win_game() func _on_player_died(): - get_tree().call_group("enemies", "queue_free") + # get_tree().call_group("enemies", "queue_free") + EventBus.enemy_win.emit() + # $Player.set_process(false) + # $Player.monitoring = false game_over.show() await get_tree().create_timer(2).timeout game_over.hide() @@ -46,6 +49,7 @@ func _on_player_died(): playing = false func new_game(): + get_tree().call_group("enemies", "queue_free") Global.score = 0 # EventBus.initialize_shieldbar.emit() $Player.start() diff --git a/player.gd b/player.gd index 7674c32..d282dc3 100644 --- a/player.gd +++ b/player.gd @@ -28,6 +28,7 @@ func _ready(): # start() func start(): + monitoring = true print(shield) $Ship.frame = 1 $Ship.show() @@ -91,7 +92,7 @@ func _on_area_entered(area): area.explode() shield -= int(max_shield / 2) damage_taken.emit() - if area.is_in_group("enemy_bullets"): + if area.is_in_group("enemy_bullets") and self.monitoring == true: damage_taken.emit() @@ -104,7 +105,9 @@ func _on_damage_taken() -> void: $Ship.material.set_shader_parameter("toggle", 0.0) func _on_game_over() -> void: - set_process(false) + print("Game over!") + # set_process(false) + monitoring = false $Ship.frame = 1 await get_tree().create_timer(2).timeout var tween = create_tween() From a007b08b839ff50626c3f0f518906657f128fe6d Mon Sep 17 00:00:00 2001 From: Henry Date: Tue, 23 Dec 2025 16:27:48 +0000 Subject: [PATCH 14/20] Removed Player from the Main scene in favor of instantiatiating Player during the start of a new game. --- main.gd | 11 +++++++---- main.tscn | 6 +----- player.gd | 2 +- 3 files changed, 9 insertions(+), 10 deletions(-) diff --git a/main.gd b/main.gd index ec31202..86f67fe 100644 --- a/main.gd +++ b/main.gd @@ -1,6 +1,8 @@ extends Node2D var enemy = preload("res://enemy.tscn") +var player = preload("res://player.tscn") +var instance = null var playing = false var enemy_count: int = 0 @@ -14,8 +16,6 @@ func _ready(): EventBus.enemy_died.connect(_on_enemy_died) -# spawn_enemies() - func spawn_enemies(): for x in range(9): @@ -41,7 +41,7 @@ func _on_player_died(): # get_tree().call_group("enemies", "queue_free") EventBus.enemy_win.emit() # $Player.set_process(false) - # $Player.monitoring = false + instance.queue_free() game_over.show() await get_tree().create_timer(2).timeout game_over.hide() @@ -50,8 +50,11 @@ func _on_player_died(): func new_game(): get_tree().call_group("enemies", "queue_free") + # get_node("player").start() Global.score = 0 - # EventBus.initialize_shieldbar.emit() + instance = player.instantiate() + add_child(instance) + $Player.shader_active = false $Player.start() $CanvasLayer/UI.update_score(Global.score) spawn_enemies() diff --git a/main.tscn b/main.tscn index 6c0c919..519e986 100644 --- a/main.tscn +++ b/main.tscn @@ -1,8 +1,7 @@ -[gd_scene load_steps=11 format=3 uid="uid://cc2dnhuv4qx7m"] +[gd_scene load_steps=10 format=3 uid="uid://cc2dnhuv4qx7m"] [ext_resource type="Script" uid="uid://c51huloycn5as" path="res://main.gd" id="1_h2yge"] [ext_resource type="Texture2D" uid="uid://jj8b7vqj3ihx" path="res://Mini Pixel Pack 3/Space_BG (2 frames) (64 x 64).png" id="1_ig7tw"] -[ext_resource type="PackedScene" uid="uid://pyuorpwb7lpe" path="res://player.tscn" id="2_0xm2m"] [ext_resource type="PackedScene" uid="uid://s6wf3egdqtmh" path="res://ui.tscn" id="4_1bvp3"] [ext_resource type="Texture2D" uid="uid://bonoqs5pisflo" path="res://Mini Pixel Pack 3/UI objects/START (48 x 8).png" id="5_lquwl"] [ext_resource type="Texture2D" uid="uid://bubqwoum50gf8" path="res://Mini Pixel Pack 3/UI objects/GAME_OVER (72 x 8).png" id="6_7mycd"] @@ -59,9 +58,6 @@ centered = false region_enabled = true region_rect = Rect2(0, 0, 240, 320) -[node name="Player" parent="." groups=["ship"] instance=ExtResource("2_0xm2m")] -position = Vector2(123, 254) - [node name="AnimationPlayer" type="AnimationPlayer" parent="."] libraries = { &"": SubResource("AnimationLibrary_lquwl") diff --git a/player.gd b/player.gd index d282dc3..ded8652 100644 --- a/player.gd +++ b/player.gd @@ -101,8 +101,8 @@ func _on_damage_taken() -> void: shader_active = true $Ship.material.set_shader_parameter("toggle", 1.0) await get_tree().create_timer(1).timeout - shader_active = false $Ship.material.set_shader_parameter("toggle", 0.0) + shader_active = false func _on_game_over() -> void: print("Game over!") From aa7cdc90d680bc96148258c26b30e26080ca3831 Mon Sep 17 00:00:00 2001 From: Henry Date: Tue, 23 Dec 2025 18:48:49 +0000 Subject: [PATCH 15/20] Trying to sort shield issues. --- main.gd | 5 +++++ player.gd | 1 - ui.gd | 1 - 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/main.gd b/main.gd index 86f67fe..8bac3fe 100644 --- a/main.gd +++ b/main.gd @@ -50,8 +50,11 @@ func _on_player_died(): func new_game(): get_tree().call_group("enemies", "queue_free") + get_tree().call_group("enemy_bullets", "queue_free") # get_node("player").start() Global.score = 0 + $CanvasLayer/UI.update_score(Global.score) + EventBus.initialize_shieldbar.emit() instance = player.instantiate() add_child(instance) $Player.shader_active = false @@ -59,6 +62,8 @@ func new_game(): $CanvasLayer/UI.update_score(Global.score) spawn_enemies() playing = true + print("New game started!") + func _input(EventInput): diff --git a/player.gd b/player.gd index ded8652..5fb3bb3 100644 --- a/player.gd +++ b/player.gd @@ -28,7 +28,6 @@ func _ready(): # start() func start(): - monitoring = true print(shield) $Ship.frame = 1 $Ship.show() diff --git a/ui.gd b/ui.gd index fda5c37..738a21e 100644 --- a/ui.gd +++ b/ui.gd @@ -36,4 +36,3 @@ func _on_initialize_shieldbar(): tween.tween_property(shield_bar, "value", 100, .25).set_trans(Tween.TRANS_LINEAR) await tween.finished print_debug("Tweens played!") - return From be3919acd777247c236a7626f47a8d563e52f9a9 Mon Sep 17 00:00:00 2001 From: Henry Date: Wed, 24 Dec 2025 13:29:59 +0000 Subject: [PATCH 16/20] Commented main game's functionality to better track what's happening. --- main.gd | 26 ++++++++++++++++++-------- player.gd | 18 +++++++++++------- 2 files changed, 29 insertions(+), 15 deletions(-) diff --git a/main.gd b/main.gd index 8bac3fe..13f955d 100644 --- a/main.gd +++ b/main.gd @@ -17,7 +17,7 @@ func _ready(): func spawn_enemies(): - + get_tree().call_group("enemies", "queue_free") for x in range(9): for y in range(3): var e = enemy.instantiate() @@ -25,7 +25,7 @@ func spawn_enemies(): add_child(e) e.start(pos) enemy_count = get_tree().get_nodes_in_group("enemies").size() - print(enemy_count) + print("Remaining enemies: ", enemy_count) func _on_enemy_died(value: int): @@ -41,6 +41,7 @@ func _on_player_died(): # get_tree().call_group("enemies", "queue_free") EventBus.enemy_win.emit() # $Player.set_process(false) + # get_tree().call_group("enemies", "set_process", false) instance.queue_free() game_over.show() await get_tree().create_timer(2).timeout @@ -49,23 +50,32 @@ func _on_player_died(): playing = false func new_game(): + # Ensure enemies are cleared. + enemy_count = 0 get_tree().call_group("enemies", "queue_free") get_tree().call_group("enemy_bullets", "queue_free") - # get_node("player").start() + print("Number of enemies at new_game: ",enemy_count) + + # Reset score. Global.score = 0 $CanvasLayer/UI.update_score(Global.score) - EventBus.initialize_shieldbar.emit() + + # instantiate the Player instance = player.instantiate() add_child(instance) - $Player.shader_active = false $Player.start() - $CanvasLayer/UI.update_score(Global.score) + + # Tell the shield to recharge. + EventBus.initialize_shieldbar.emit() + + # Tell the enemies to spawn! spawn_enemies() + + # Tell the game we're playing. playing = true print("New game started!") - func _input(EventInput): if EventInput.is_action_pressed("shoot") and playing == false: print("Input detected!") @@ -79,7 +89,7 @@ func _on_start_pressed(): func win_game(): playing = false game_over.show() - $Player._on_game_over() + $Player._on_player_victory() await get_tree().create_timer(2).timeout game_over.hide() start_button.show() diff --git a/player.gd b/player.gd index 5fb3bb3..11696ed 100644 --- a/player.gd +++ b/player.gd @@ -9,7 +9,7 @@ signal damage_taken @export var cooldown: float = 0.25 @export var bullet_scene : PackedScene @export var max_shield: int = 10 -var shield: int = 0: +var shield: int = 1: set = set_shield var can_shoot = false @@ -24,11 +24,11 @@ var clamp_shield = clamp(shield, 0, max_shield) func _ready(): set_process(false) print(shield) - $Ship.hide() # start() func start(): print(shield) + shader_active = false $Ship.frame = 1 $Ship.show() position = Vector2(screensize.x / 2, screensize.y) @@ -76,12 +76,14 @@ func set_shield(value: int): EventBus.shield_changed.emit(max_shield, old_value, shield) print("Shield set to:", shield) if shield <= 0: + print("Shader deactivated!") EventBus.player_died.emit() set_process(false) $Ship.hide() $Explosion.show() $Explosion/AnimationPlayer.play("explosion-one-shot") await $Explosion/AnimationPlayer.animation_finished + shader_active = false func _on_gun_cooldown_timeout() -> void: can_shoot = true @@ -96,18 +98,20 @@ func _on_area_entered(area): func _on_damage_taken() -> void: - # emit_signal("shield_ui") shader_active = true + print("Shader active!") $Ship.material.set_shader_parameter("toggle", 1.0) await get_tree().create_timer(1).timeout $Ship.material.set_shader_parameter("toggle", 0.0) shader_active = false + print("Shader deactivated!") -func _on_game_over() -> void: - print("Game over!") - # set_process(false) - monitoring = false +func _on_player_victory() -> void: + print("Victory!") + set_process(false) $Ship.frame = 1 await get_tree().create_timer(2).timeout var tween = create_tween() tween.tween_property(self, "position:y", 60 * -1, .25).set_ease(tween.EASE_IN) + await tween.finished + queue_free() From 25a489769723369ae6398e4ff1c405ccfed23231 Mon Sep 17 00:00:00 2001 From: Henry Date: Wed, 24 Dec 2025 15:59:15 +0000 Subject: [PATCH 17/20] Tracking down the spawning of extra enemies; removed extraneous enemy counting and queue_free of enemies. --- enemy.gd | 4 ---- event_bus.gd | 1 - main.gd | 13 +++++++++---- player.gd | 9 ++++++--- 4 files changed, 15 insertions(+), 12 deletions(-) diff --git a/enemy.gd b/enemy.gd index d2966b5..088c688 100644 --- a/enemy.gd +++ b/enemy.gd @@ -8,8 +8,6 @@ var exploding = false @onready var screensize = get_viewport_rect().size -func _ready() -> void: - EventBus.enemy_win.connect(_on_enemy_win) func start(pos): speed = 0 @@ -24,8 +22,6 @@ func start(pos): $ShootTimer.wait_time = randf_range(4, 20) $ShootTimer.start() -func _on_enemy_win() -> void: - print("Enemy win!") func _on_timer_timeout() -> void: speed = randf_range(75, 100) diff --git a/event_bus.gd b/event_bus.gd index dac12af..ff7fa67 100644 --- a/event_bus.gd +++ b/event_bus.gd @@ -5,7 +5,6 @@ extends Node signal shield_changed(max_value: int, old_value: int, new_value: int) signal player_died() signal enemy_died(value: int) -signal enemy_win() signal initialize_shieldbar() signal start_game() diff --git a/main.gd b/main.gd index 13f955d..4950c43 100644 --- a/main.gd +++ b/main.gd @@ -17,7 +17,6 @@ func _ready(): func spawn_enemies(): - get_tree().call_group("enemies", "queue_free") for x in range(9): for y in range(3): var e = enemy.instantiate() @@ -39,7 +38,7 @@ func _on_enemy_died(value: int): func _on_player_died(): # get_tree().call_group("enemies", "queue_free") - EventBus.enemy_win.emit() + enemy_win() # $Player.set_process(false) # get_tree().call_group("enemies", "set_process", false) instance.queue_free() @@ -51,16 +50,18 @@ func _on_player_died(): func new_game(): # Ensure enemies are cleared. - enemy_count = 0 get_tree().call_group("enemies", "queue_free") get_tree().call_group("enemy_bullets", "queue_free") - print("Number of enemies at new_game: ",enemy_count) + # print("Number of enemies at new_game: ",enemy_count) + await get_tree().process_frame # Reset score. Global.score = 0 $CanvasLayer/UI.update_score(Global.score) + # instantiate the Player + # await get_tree().create_timer(1).timeout instance = player.instantiate() add_child(instance) $Player.start() @@ -69,6 +70,7 @@ func new_game(): EventBus.initialize_shieldbar.emit() # Tell the enemies to spawn! + #await get_tree().create_timer(.5).timeout spawn_enemies() # Tell the game we're playing. @@ -93,3 +95,6 @@ func win_game(): await get_tree().create_timer(2).timeout game_over.hide() start_button.show() + +func enemy_win() -> void: + print("Enemy win!") diff --git a/player.gd b/player.gd index 11696ed..f7c688f 100644 --- a/player.gd +++ b/player.gd @@ -30,15 +30,17 @@ func start(): print(shield) shader_active = false $Ship.frame = 1 + $Ship/Boosters.hide() $Ship.show() position = Vector2(screensize.x / 2, screensize.y) var tween = create_tween() - tween.tween_property(self, "position:y", 32 * -1, .25).as_relative() + tween.tween_property(self, "position:y", 48 * -1, .75).as_relative() $GunCooldown.wait_time = cooldown set_shield(max_shield) print(shield) await get_tree().create_timer(2).timeout set_process(true) + $Ship/Boosters.show() can_shoot = true # EventBus.shield_changed.emit(max_shield, old_value, shield) @@ -77,13 +79,14 @@ func set_shield(value: int): print("Shield set to:", shield) if shield <= 0: print("Shader deactivated!") - EventBus.player_died.emit() set_process(false) $Ship.hide() + shader_active = false $Explosion.show() $Explosion/AnimationPlayer.play("explosion-one-shot") await $Explosion/AnimationPlayer.animation_finished - shader_active = false + EventBus.player_died.emit() + func _on_gun_cooldown_timeout() -> void: can_shoot = true From dac1601f4afb9e9e1eecee9963b6c1ae68abf1a3 Mon Sep 17 00:00:00 2001 From: Henry Date: Wed, 24 Dec 2025 16:48:40 +0000 Subject: [PATCH 18/20] Troubleshooting enemy count. --- main.gd | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/main.gd b/main.gd index 4950c43..486cca8 100644 --- a/main.gd +++ b/main.gd @@ -4,7 +4,12 @@ var enemy = preload("res://enemy.tscn") var player = preload("res://player.tscn") var instance = null var playing = false -var enemy_count: int = 0 +var enemy_count: int = 0: + set(value): + if value < 0: + print_debug("Enemy value set to below zero: ", get_stack()) + enemy_count = value + @onready var start_button = $CanvasLayer/CenterContainer/Start @onready var game_over = $CanvasLayer/CenterContainer/GameOver @@ -17,14 +22,17 @@ func _ready(): func spawn_enemies(): + # enemy_count = get_tree().get_nodes_in_group("enemies").size() + # print("Remaining enemies: ", enemy_count) + # await get_tree().process_frame + get_tree().get_nodes_in_group("enemies").size() for x in range(9): for y in range(3): var e = enemy.instantiate() var pos = Vector2(x * (16 + 8) + 24, 16 * 4 + y * 16) add_child(e) e.start(pos) - enemy_count = get_tree().get_nodes_in_group("enemies").size() - print("Remaining enemies: ", enemy_count) + print_debug("Remaining enemies: ", enemy_count, ", ", get_tree().get_nodes_in_group("enemies").size()) func _on_enemy_died(value: int): @@ -33,8 +41,8 @@ func _on_enemy_died(value: int): $CanvasLayer/UI.update_score(Global.score) print_debug(enemy_count) if enemy_count == 0: - print("All enemies defeated!") - win_game() + print_debug("Remaining enemies: ", enemy_count, ", ", get_tree().get_nodes_in_group("enemies").size()) + win_game() func _on_player_died(): # get_tree().call_group("enemies", "queue_free") From c8d578af045fd940b964dd3389d93f2bb970569f Mon Sep 17 00:00:00 2001 From: Henry Date: Sat, 27 Dec 2025 10:08:30 +0000 Subject: [PATCH 19/20] Enemy spawning code now reference COLS and ROWS constants; removed extraneous enemy_count removal. --- enemy.gd | 3 ++- event_bus.gd | 3 ++- main.gd | 24 ++++++++++++++++-------- 3 files changed, 20 insertions(+), 10 deletions(-) diff --git a/enemy.gd b/enemy.gd index 088c688..f2a5df3 100644 --- a/enemy.gd +++ b/enemy.gd @@ -43,9 +43,10 @@ func explode(): if exploding: return exploding = true print_debug("Enemy explode!") + EventBus.enemy_hit.emit(5) speed = 0 $AnimationPlayer.play("explode") set_deferred("monitoring", false) - EventBus.enemy_died.emit(5) await $AnimationPlayer.animation_finished queue_free() + EventBus.enemy_died.emit() diff --git a/event_bus.gd b/event_bus.gd index ff7fa67..8327477 100644 --- a/event_bus.gd +++ b/event_bus.gd @@ -4,7 +4,8 @@ extends Node signal shield_changed(max_value: int, old_value: int, new_value: int) signal player_died() -signal enemy_died(value: int) +signal enemy_died() +signal enemy_hit(value: int) signal initialize_shieldbar() signal start_game() diff --git a/main.gd b/main.gd index 486cca8..92826d5 100644 --- a/main.gd +++ b/main.gd @@ -8,8 +8,12 @@ var enemy_count: int = 0: set(value): if value < 0: print_debug("Enemy value set to below zero: ", get_stack()) + if value > 27: + print_debug("Enemy value set to above 27!: ", get_stack()) enemy_count = value +const COLS: int = 9 +const ROWS: int = 3 @onready var start_button = $CanvasLayer/CenterContainer/Start @onready var game_over = $CanvasLayer/CenterContainer/GameOver @@ -19,36 +23,39 @@ func _ready(): start_button.show() EventBus.player_died.connect(_on_player_died) EventBus.enemy_died.connect(_on_enemy_died) + EventBus.enemy_hit.connect(_on_enemy_hit) func spawn_enemies(): - # enemy_count = get_tree().get_nodes_in_group("enemies").size() # print("Remaining enemies: ", enemy_count) # await get_tree().process_frame - get_tree().get_nodes_in_group("enemies").size() - for x in range(9): - for y in range(3): + for x in range(COLS): + for y in range(ROWS): var e = enemy.instantiate() var pos = Vector2(x * (16 + 8) + 24, 16 * 4 + y * 16) add_child(e) e.start(pos) + enemy_count = ROWS * COLS + await get_tree().process_frame print_debug("Remaining enemies: ", enemy_count, ", ", get_tree().get_nodes_in_group("enemies").size()) -func _on_enemy_died(value: int): - Global.score += value +func _on_enemy_died(): enemy_count -= 1 - $CanvasLayer/UI.update_score(Global.score) print_debug(enemy_count) if enemy_count == 0: print_debug("Remaining enemies: ", enemy_count, ", ", get_tree().get_nodes_in_group("enemies").size()) win_game() +func _on_enemy_hit(value: int): + Global.score += value + $CanvasLayer/UI.update_score(Global.score) + func _on_player_died(): # get_tree().call_group("enemies", "queue_free") - enemy_win() # $Player.set_process(false) # get_tree().call_group("enemies", "set_process", false) + enemy_win() instance.queue_free() game_over.show() await get_tree().create_timer(2).timeout @@ -61,6 +68,7 @@ func new_game(): get_tree().call_group("enemies", "queue_free") get_tree().call_group("enemy_bullets", "queue_free") # print("Number of enemies at new_game: ",enemy_count) + enemy_count = 0 await get_tree().process_frame # Reset score. From b5d97c0ffb062210cd6a1ea725c978008e45f0a8 Mon Sep 17 00:00:00 2001 From: Henry Date: Sat, 27 Dec 2025 16:25:06 +0000 Subject: [PATCH 20/20] Fixed shield issue by removing old experiments and ensuring the right values were being used! --- main.gd | 6 +++--- player.gd | 44 ++++++++++++++++++++++++++++---------------- ui.gd | 2 +- 3 files changed, 32 insertions(+), 20 deletions(-) diff --git a/main.gd b/main.gd index 92826d5..c91f8de 100644 --- a/main.gd +++ b/main.gd @@ -75,6 +75,9 @@ func new_game(): Global.score = 0 $CanvasLayer/UI.update_score(Global.score) + # Tell the shield to recharge. + # EventBus.initialize_shieldbar.emit() + # await EventBus.initialize_shieldbar # instantiate the Player # await get_tree().create_timer(1).timeout @@ -82,9 +85,6 @@ func new_game(): add_child(instance) $Player.start() - # Tell the shield to recharge. - EventBus.initialize_shieldbar.emit() - # Tell the enemies to spawn! #await get_tree().create_timer(.5).timeout spawn_enemies() diff --git a/player.gd b/player.gd index f7c688f..0f483bd 100644 --- a/player.gd +++ b/player.gd @@ -9,11 +9,18 @@ signal damage_taken @export var cooldown: float = 0.25 @export var bullet_scene : PackedScene @export var max_shield: int = 10 -var shield: int = 1: +var shield: int = 0: set = set_shield + var can_shoot = false -var shader_active = false +var shader_active: bool = false: + set(value): + if value == true: + print_debug("Shader active!", get_stack()) + else: + print_debug("Shader inactive!", get_stack()) + var clamp_shield = clamp(shield, 0, max_shield) @onready var screensize = get_viewport_rect().size @@ -35,10 +42,11 @@ func start(): position = Vector2(screensize.x / 2, screensize.y) var tween = create_tween() tween.tween_property(self, "position:y", 48 * -1, .75).as_relative() + await tween.finished $GunCooldown.wait_time = cooldown set_shield(max_shield) print(shield) - await get_tree().create_timer(2).timeout + await get_tree().create_timer(1).timeout set_process(true) $Ship/Boosters.show() can_shoot = true @@ -74,11 +82,11 @@ func shoot(): func set_shield(value: int): var old_value = shield - shield = clamp(value, 0, max_shield) + # shield = clamp(value, 0, max_shield) + shield = min(max_shield, value) EventBus.shield_changed.emit(max_shield, old_value, shield) print("Shield set to:", shield) if shield <= 0: - print("Shader deactivated!") set_process(false) $Ship.hide() shader_active = false @@ -93,27 +101,31 @@ func _on_gun_cooldown_timeout() -> void: func _on_area_entered(area): if area.is_in_group("enemies"): - area.explode() shield -= int(max_shield / 2) - damage_taken.emit() + # damage_taken.emit() + area.explode() if area.is_in_group("enemy_bullets") and self.monitoring == true: damage_taken.emit() -func _on_damage_taken() -> void: - shader_active = true - print("Shader active!") - $Ship.material.set_shader_parameter("toggle", 1.0) - await get_tree().create_timer(1).timeout - $Ship.material.set_shader_parameter("toggle", 0.0) - shader_active = false - print("Shader deactivated!") +func _on_damage_taken(): + + if shield == 0: + shader_active = false + return + + else: + shader_active = true + $Ship.material.set_shader_parameter("toggle", 1.0) + await get_tree().create_timer(1).timeout + $Ship.material.set_shader_parameter("toggle", 0.0) + shader_active = false func _on_player_victory() -> void: print("Victory!") set_process(false) $Ship.frame = 1 - await get_tree().create_timer(2).timeout + await get_tree().create_timer(1).timeout var tween = create_tween() tween.tween_property(self, "position:y", 60 * -1, .25).set_ease(tween.EASE_IN) await tween.finished diff --git a/ui.gd b/ui.gd index 738a21e..2b67631 100644 --- a/ui.gd +++ b/ui.gd @@ -16,7 +16,7 @@ func update_score(value): func _on_shield_changed(max_value: int, old_value: int, new_value: int) -> void: shield_bar.max_value = max_value - shield_bar.value = new_value + shield_bar.value = old_value var tween = create_tween() print_debug("Tweening shield bar") tween.tween_property(shield_bar, "value", new_value, .25).set_trans(Tween.TRANS_LINEAR)