fuzzyworld

godot-shooter / commit

Standardize how power-ups (items that can be picked up by player) are done. Keep just one class that implements it, and allow customization through this control.

11ed9f7abc79b7365dc45a80fffcd090e6ce03a1 · Pavel Safronov · 2023-11-07 16:48:46 -0800 · parents ddae17d79405

Standardize how power-ups (items that can be picked up by player) are done. Keep just one class that implements it, and allow customization through this control.
Updated the enemy "enemy_killed" signal to also include the position of the just-killed enemy.
Temporarily removed the speed power-up from the game.
 Enemy.gd                          |   4 +-
 Enemy.tscn                        |   6 +--
 HUD.tscn                          |   2 -
 HealPowerUp.gd                    |  13 -----
 HealPowerUp.tscn                  | 109 --------------------------------------
 Player.tscn                       |   2 +-
 PowerUp.gd                        |  18 +++++++
 SpeedPowerUp.tscn => PowerUp.tscn |  12 ++---
 SpeedPowerUp.gd                   |  13 -----
 World.gd                          |  33 +++++++++---
 World.tscn                        |   2 +-
 11 files changed, 56 insertions(+), 158 deletions(-)

diff --git a/Enemy.gd b/Enemy.gd
index 0ab9ecc..c155da3 100644
--- a/Enemy.gd
+++ b/Enemy.gd
@@ -13,7 +13,7 @@ export var health = -1
 export var max_health = 10
 export var is_targeted = false
 export var is_invincible = false
-signal enemy_killed
+signal enemy_killed(position)
 
 var velocity = Vector2.ZERO
 var dead = false
@@ -82,7 +82,7 @@ func kill():
 	explosion.connect("explosion_done", self, "_on_death_explosion_finished")
 	$Graphics.add_child(explosion)
 	z_index = -1
-	emit_signal("enemy_killed")
+	emit_signal("enemy_killed", global_position)
 
 func _on_death_explosion_finished():
 	$AnimationPlayer.play("fade_out")
diff --git a/Enemy.tscn b/Enemy.tscn
index d9770a2..e68c8db 100644
--- a/Enemy.tscn
+++ b/Enemy.tscn
@@ -95,10 +95,10 @@ texture = ExtResource( 1 )
 [node name="Container" type="Node2D" parent="Graphics/Alive"]
 
 [node name="HealthLabel" type="Label" parent="Graphics/Alive/Container"]
-margin_left = -25.0
+margin_left = -48.0
 margin_top = 37.0
-margin_right = 25.0
-margin_bottom = 51.0
+margin_right = 49.0
+margin_bottom = 72.0
 theme = ExtResource( 4 )
 text = "HEALTH"
 
diff --git a/HUD.tscn b/HUD.tscn
index adf5367..419374c 100644
--- a/HUD.tscn
+++ b/HUD.tscn
@@ -46,8 +46,6 @@ margin_right = 40.0
 margin_bottom = 40.0
 
 [node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer"]
-margin_left = 20.0
-margin_top = 20.0
 margin_right = 278.0
 margin_bottom = 74.0
 
diff --git a/HealPowerUp.gd b/HealPowerUp.gd
deleted file mode 100644
index e4601d3..0000000
--- a/HealPowerUp.gd
+++ /dev/null
@@ -1,13 +0,0 @@
-extends Node2D
-
-export var heal_amount = 1
-signal consumed
-
-func _ready() -> void:
-	$AnimationPlayer.play("fade_in")
-
-func _on_Area2D_body_entered(body: Node) -> void:
-	if body.has_method("heal"):
-		body.heal(heal_amount)
-		$AnimationPlayer.play("fade_out")
-		emit_signal("consumed")
diff --git a/HealPowerUp.tscn b/HealPowerUp.tscn
deleted file mode 100644
index 64c39c9..0000000
--- a/HealPowerUp.tscn
+++ /dev/null
@@ -1,109 +0,0 @@
-[gd_scene load_steps=8 format=2]
-
-[ext_resource path="res://HealPowerUp.gd" type="Script" id=1]
-[ext_resource path="res://assets/kenney_simple-space/PNG/Retina/star_tiny.png" type="Texture" id=2]
-[ext_resource path="res://CharacterTheme.tres" type="Theme" id=3]
-
-[sub_resource type="RectangleShape2D" id=4]
-extents = Vector2( 27, 32.5 )
-
-[sub_resource type="Animation" id=1]
-length = 0.001
-tracks/0/type = "value"
-tracks/0/path = NodePath(".:modulate")
-tracks/0/interp = 1
-tracks/0/loop_wrap = true
-tracks/0/imported = false
-tracks/0/enabled = true
-tracks/0/keys = {
-"times": PoolRealArray( 0 ),
-"transitions": PoolRealArray( 1 ),
-"update": 0,
-"values": [ Color( 1, 1, 1, 1 ) ]
-}
-
-[sub_resource type="Animation" id=3]
-resource_name = "fade_in"
-length = 3.0
-tracks/0/type = "value"
-tracks/0/path = NodePath(".:modulate")
-tracks/0/interp = 1
-tracks/0/loop_wrap = true
-tracks/0/imported = false
-tracks/0/enabled = true
-tracks/0/keys = {
-"times": PoolRealArray( 0, 3 ),
-"transitions": PoolRealArray( 1, 1 ),
-"update": 0,
-"values": [ Color( 1, 1, 1, 0 ), Color( 1, 1, 1, 1 ) ]
-}
-tracks/1/type = "value"
-tracks/1/path = NodePath(".:scale")
-tracks/1/interp = 1
-tracks/1/loop_wrap = true
-tracks/1/imported = false
-tracks/1/enabled = true
-tracks/1/keys = {
-"times": PoolRealArray( -0.2, 3 ),
-"transitions": PoolRealArray( 1, 1 ),
-"update": 0,
-"values": [ Vector2( 0.01, 0.01 ), Vector2( 1, 1 ) ]
-}
-
-[sub_resource type="Animation" id=2]
-resource_name = "fade_out"
-tracks/0/type = "value"
-tracks/0/path = NodePath(".:modulate")
-tracks/0/interp = 1
-tracks/0/loop_wrap = true
-tracks/0/imported = false
-tracks/0/enabled = true
-tracks/0/keys = {
-"times": PoolRealArray( 0, 1 ),
-"transitions": PoolRealArray( 1, 1 ),
-"update": 0,
-"values": [ Color( 1, 1, 1, 1 ), Color( 1, 1, 1, 0 ) ]
-}
-tracks/1/type = "method"
-tracks/1/path = NodePath(".")
-tracks/1/interp = 1
-tracks/1/loop_wrap = true
-tracks/1/imported = false
-tracks/1/enabled = true
-tracks/1/keys = {
-"times": PoolRealArray( 1.3 ),
-"transitions": PoolRealArray( 1 ),
-"values": [ {
-"args": [  ],
-"method": "queue_free"
-} ]
-}
-
-[node name="HealPowerUp" type="Node2D"]
-script = ExtResource( 1 )
-
-[node name="Area2D" type="Area2D" parent="."]
-
-[node name="CollisionShape2D" type="CollisionShape2D" parent="Area2D"]
-position = Vector2( 0, 14.5 )
-shape = SubResource( 4 )
-
-[node name="Sprite" type="Sprite" parent="Area2D"]
-modulate = Color( 0, 1, 0.0156863, 1 )
-texture = ExtResource( 2 )
-
-[node name="Label" type="Label" parent="Area2D"]
-margin_left = -26.0
-margin_top = 17.0
-margin_right = 27.0
-margin_bottom = 52.0
-theme = ExtResource( 3 )
-text = "+HP"
-align = 1
-
-[node name="AnimationPlayer" type="AnimationPlayer" parent="."]
-anims/RESET = SubResource( 1 )
-anims/fade_in = SubResource( 3 )
-anims/fade_out = SubResource( 2 )
-
-[connection signal="body_entered" from="Area2D" to="." method="_on_Area2D_body_entered"]
diff --git a/Player.tscn b/Player.tscn
index 07c50e0..801bcd1 100644
--- a/Player.tscn
+++ b/Player.tscn
@@ -10,7 +10,7 @@
 [sub_resource type="Gradient" id=1]
 colors = PoolColorArray( 0, 0, 0, 0, 0, 1, 0, 1 )
 
-[node name="Player" type="KinematicBody2D"]
+[node name="Player" type="KinematicBody2D" groups=["player"]]
 rotation = -0.000165944
 script = ExtResource( 3 )
 bullet = ExtResource( 4 )
diff --git a/PowerUp.gd b/PowerUp.gd
new file mode 100644
index 0000000..64628f5
--- /dev/null
+++ b/PowerUp.gd
@@ -0,0 +1,18 @@
+extends Node2D
+
+export var label = "+SP"
+export var color = Color.gold
+signal consumed
+const Utils = preload("res://Utils.gd")
+
+func _ready() -> void:
+	$AnimationPlayer.play("fade_in")
+	$Area2D/Label.text = label
+	$Area2D/Sprite.modulate = color
+
+func _on_Area2D_body_entered(body: Node) -> void:
+	var players = get_tree().get_nodes_in_group("player")
+	var player = players[0]
+	if body == player:
+		$AnimationPlayer.play("fade_out")
+		emit_signal("consumed")
diff --git a/SpeedPowerUp.tscn b/PowerUp.tscn
similarity index 90%
rename from SpeedPowerUp.tscn
rename to PowerUp.tscn
index 6c461dd..6286a67 100644
--- a/SpeedPowerUp.tscn
+++ b/PowerUp.tscn
@@ -1,8 +1,8 @@
 [gd_scene load_steps=8 format=2]
 
-[ext_resource path="res://SpeedPowerUp.gd" type="Script" id=1]
+[ext_resource path="res://CharacterTheme.tres" type="Theme" id=1]
 [ext_resource path="res://assets/kenney_simple-space/PNG/Retina/star_tiny.png" type="Texture" id=2]
-[ext_resource path="res://CharacterTheme.tres" type="Theme" id=3]
+[ext_resource path="res://PowerUp.gd" type="Script" id=3]
 
 [sub_resource type="RectangleShape2D" id=4]
 extents = Vector2( 26, 32 )
@@ -79,14 +79,12 @@ tracks/1/keys = {
 } ]
 }
 
-[node name="SpeedPowerUp" type="Node2D"]
-script = ExtResource( 1 )
-speed_amount = 20
+[node name="PowerUp" type="Node2D"]
+script = ExtResource( 3 )
 
 [node name="Area2D" type="Area2D" parent="."]
 
 [node name="Sprite" type="Sprite" parent="Area2D"]
-modulate = Color( 0, 0.462745, 1, 1 )
 texture = ExtResource( 2 )
 
 [node name="CollisionShape2D" type="CollisionShape2D" parent="Area2D"]
@@ -98,7 +96,7 @@ margin_left = -25.0
 margin_top = 19.0
 margin_right = 26.0
 margin_bottom = 54.0
-theme = ExtResource( 3 )
+theme = ExtResource( 1 )
 text = "+SP"
 align = 1
 valign = 1
diff --git a/SpeedPowerUp.gd b/SpeedPowerUp.gd
deleted file mode 100644
index 4c379f5..0000000
--- a/SpeedPowerUp.gd
+++ /dev/null
@@ -1,13 +0,0 @@
-extends Node2D
-
-export var speed_amount = 10
-signal consumed
-
-func _ready() -> void:
-	$AnimationPlayer.play("fade_in")
-
-func _on_Area2D_body_entered(body: Node) -> void:
-	if body.has_method("speed_up"):
-		body.speed_up()
-		$AnimationPlayer.play("fade_out")
-		emit_signal("consumed")
diff --git a/World.gd b/World.gd
index d042020..3e94a61 100644
--- a/World.gd
+++ b/World.gd
@@ -2,23 +2,29 @@ extends Node2D
 
 const Utils = preload("res://Utils.gd")
 const Enemy = preload("res://Enemy.tscn")
-const Health = preload("res://HealPowerUp.tscn")
-const Speed = preload("res://SpeedPowerUp.tscn")
+const PowerUp = preload("res://PowerUp.tscn")
 var destination: Vector2
 var is_destination_set = false
 var min_items_dict = {
 	"create_enemy": 10,
-	"create_health": 2,
-	"create_speed": 2,
+	"create_health": 5,
+#	"create_speed": 2,
+	"create_gold": 5,
 }
 
-func enemy_killed():
+func enemy_killed(position: Vector2):
 	$UI/HUD.score += 1
 	$UI/HUD.show_message("Enemy killed!", .5)
+	create_gold(position)
 func health_consumed():
+	$Player.heal()
 	$UI/HUD.show_message("+1 health", 1)
 func speed_consumed():
+	$Player.speed_up()
 	$UI/HUD.show_message("+10 speed", 1)
+func gold_consumed():
+	$UI/HUD.score += 5
+	$UI/HUD.show_message("+5 points", 1)
 	
 func create_enemy():
 	var enemy = Enemy.instance()
@@ -29,17 +35,30 @@ func create_enemy():
 	$Environment.call_deferred("add_child", enemy)
 
 func create_health():
-	var health = Health.instance()
+	var health = PowerUp.instance()
 	health.position = get_new_item_pos(1 + randf())
 	health.connect("tree_exiting", self, "create_health")
 	health.connect("consumed", self, "health_consumed")
+	health.label = "+HP"
+	health.color = Color.green
 	$Environment.call_deferred("add_child", health)
 
 func create_speed():
-	var speed = Speed.instance()
+	var speed = PowerUp.instance()
 	speed.position = get_new_item_pos(1 + randf())
 	speed.connect("tree_exiting", self, "create_speed")
 	speed.connect("consumed", self, "speed_consumed")
+	speed.label = "+SP"
+	speed.color = Color.blue
+	$Environment.call_deferred("add_child", speed)
+
+func create_gold(pos: Vector2 = get_new_item_pos(1 + randf())):
+	var speed = PowerUp.instance()
+	speed.position = pos
+	speed.connect("tree_exiting", self, "create_gold")
+	speed.connect("consumed", self, "gold_consumed")
+	speed.label = "+5"
+	speed.color = Color.gold
 	$Environment.call_deferred("add_child", speed)
 
 func _ready() -> void:
diff --git a/World.tscn b/World.tscn
index 5374975..698b737 100644
--- a/World.tscn
+++ b/World.tscn
@@ -45,7 +45,7 @@ __meta__ = {
 [node name="StarField2" parent="Background/ParallaxBackground/Background" instance=ExtResource( 5 )]
 visible = false
 
-[node name="Player" parent="." groups=["player"] instance=ExtResource( 2 )]
+[node name="Player" parent="." instance=ExtResource( 2 )]
 position = Vector2( 248, 410 )
 
 [node name="Environment" type="Node2D" parent="."]