fuzzyworld

godot-shooter / commit

Added a small explosion that appears when a bullet hits a body and does damage.

236d1677823a738e568579977344510fb80c8f31 · Pavel Safronov · 2023-11-01 10:30:44 -0700 · parents c727f3b081be

Added a small explosion that appears when a bullet hits a body and does damage.
 Bullet.gd           | 12 ++++++++----
 Enemy.gd            |  6 +++---
 Player.gd           |  4 ++--
 SmallExplosion.gd   | 10 ++++++++++
 SmallExplosion.tscn | 38 ++++++++++++++++++++++++++++++++++++++
 World.tscn          |  5 +++--
 6 files changed, 64 insertions(+), 11 deletions(-)

diff --git a/Bullet.gd b/Bullet.gd
index 1b28d88..0b18d56 100644
--- a/Bullet.gd
+++ b/Bullet.gd
@@ -1,19 +1,20 @@
 extends Area2D
 
-const utils = preload("res://Utils.gd")
+const Utils = preload("res://Utils.gd")
+const SmallExplosion = preload("res://SmallExplosion.tscn")
 export var lifetime_seconds = 2
 export var speed = 300
 
 func _ready() -> void:
 	$Timer.wait_time = lifetime_seconds
 	$Timer.start()
-	utils.log("timer", $Timer)
+	Utils.log("timer", $Timer)
 
 func _physics_process(delta: float) -> void:
 	position += transform.y * speed * delta
 	
 func on_expiration():
-	utils.log("killing bullet")
+	Utils.log("killing bullet")
 	queue_free()
 
 func on_bullet_body_entered(body):
@@ -21,6 +22,9 @@ func on_bullet_body_entered(body):
 	var players = tree.get_nodes_in_group("player")
 	var player = players[0]
 	if body.has_method("hurt") && body != player:
-		utils.log("removing bullet")
+		Utils.log("removing bullet")
 		body.hurt()
+		var se = SmallExplosion.instance()
+		get_parent().add_child(se)
+		se.transform = transform
 		queue_free()
diff --git a/Enemy.gd b/Enemy.gd
index 9deefe7..b84d1c3 100644
--- a/Enemy.gd
+++ b/Enemy.gd
@@ -13,11 +13,11 @@ var velocity = Vector2.ZERO
 
 var dead = false
 
-func _process(delta: float) -> void:
+func _process(_delta: float) -> void:
 	$Graphics/Alive/Container/HealthLabel.text = "%s / %s" % [health, max_health]
 	$Graphics/Alive/Container.global_rotation = 0
 
-func _physics_process(delta: float) -> void:
+func _physics_process(_delta: float) -> void:
 	if dead:
 		return
 	var players = scene_tree.get_nodes_in_group("player")
@@ -54,7 +54,7 @@ func kill():
 	var explosion = Explosion.instance()
 	explosion.connect("explosion_done", self, "_on_death_explosion_finished")
 	$Graphics.add_child(explosion)
-	$CollisionPolygon2D.disabled = true
+	$CollisionPolygon2D.set_deferred("diabled", true)
 	z_index = -1
 
 func _on_death_explosion_finished():
diff --git a/Player.gd b/Player.gd
index 7cc0481..6c672e1 100644
--- a/Player.gd
+++ b/Player.gd
@@ -13,7 +13,7 @@ var velocity = Vector2.ZERO
 var can_fire = true
 
 
-func _process(delta: float) -> void:
+func _process(_delta: float) -> void:
 	if Input.is_action_just_pressed("exit"):
 		if OS.get_name() == "OSX":
 			get_tree().quit()
@@ -36,7 +36,7 @@ func _physics_process(delta: float) -> void:
 	velocity = move_and_slide(velocity)
 
 func restart():
-	get_tree().reload_current_scene()
+	var _error = get_tree().reload_current_scene()
 
 func handle_mouse_controls(delta: float) -> void:
 	global_rotation = global_position.direction_to(get_global_mouse_position()).angle() + PI/2.0
diff --git a/SmallExplosion.gd b/SmallExplosion.gd
new file mode 100644
index 0000000..4a9bbc0
--- /dev/null
+++ b/SmallExplosion.gd
@@ -0,0 +1,10 @@
+extends CPUParticles2D
+
+signal explosion_done
+
+func _ready() -> void:
+	one_shot = true
+
+func _on_Timer_timeout() -> void:
+	emit_signal("explosion_done")
+	queue_free()
diff --git a/SmallExplosion.tscn b/SmallExplosion.tscn
new file mode 100644
index 0000000..4c66bfd
--- /dev/null
+++ b/SmallExplosion.tscn
@@ -0,0 +1,38 @@
+[gd_scene load_steps=5 format=2]
+
+[ext_resource path="res://kenney_simple-space/PNG/Default/star_small.png" type="Texture" id=1]
+[ext_resource path="res://SmallExplosion.gd" type="Script" id=2]
+
+[sub_resource type="Curve" id=1]
+_data = [ Vector2( 0, 1 ), 0.0, 0.0, 0, 0, Vector2( 1, 0 ), 0.0, 0.0, 0, 0 ]
+
+[sub_resource type="Gradient" id=4]
+offsets = PoolRealArray( 0, 0.941935, 1 )
+colors = PoolColorArray( 1, 1, 1, 1, 1, 0.0580645, 0.0580645, 1, 1, 0, 0, 1 )
+
+[node name="SmallExplosion" type="CPUParticles2D"]
+amount = 25
+lifetime = 0.5
+explosiveness = 1.0
+texture = ExtResource( 1 )
+emission_shape = 1
+emission_sphere_radius = 0.01
+spread = 180.0
+gravity = Vector2( 0, 0 )
+initial_velocity = 200.0
+initial_velocity_random = 0.52
+damping = 1000.0
+angle = 306.5
+angle_random = 0.4
+scale_amount = 0.5
+scale_amount_random = 1.0
+scale_amount_curve = SubResource( 1 )
+color_ramp = SubResource( 4 )
+script = ExtResource( 2 )
+
+[node name="Timer" type="Timer" parent="."]
+wait_time = 0.5
+one_shot = true
+autostart = true
+
+[connection signal="timeout" from="Timer" to="." method="_on_Timer_timeout"]
diff --git a/World.tscn b/World.tscn
index d5e6f6e..a771bfe 100644
--- a/World.tscn
+++ b/World.tscn
@@ -8,9 +8,10 @@
 [node name="Environment" type="Node2D" parent="."]
 
 [node name="Player" parent="." groups=["player"] instance=ExtResource( 2 )]
+position = Vector2( 513, 302 )
 
 [node name="Enemy" parent="." instance=ExtResource( 1 )]
-position = Vector2( 295, 109 )
+position = Vector2( 876, 491 )
 
 [node name="Enemy2" parent="." instance=ExtResource( 1 )]
-position = Vector2( 218, -94 )
+position = Vector2( 149, 475 )