fuzzyworld

godot-shooter / commit

Apply smoke on enemy damage.

cf2013fa8637a20ef81e0d780ae73ab92cb6563f · Pavel Safronov · 2023-11-02 12:04:52 -0700 · parents c8fdf5b32eb0

Apply smoke on enemy damage.
 Enemy.gd   | 22 +++++++++++++--
 Enemy.tscn | 90 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---
 2 files changed, 107 insertions(+), 5 deletions(-)

diff --git a/Enemy.gd b/Enemy.gd
index 17be7ba..4465dc2 100644
--- a/Enemy.gd
+++ b/Enemy.gd
@@ -2,8 +2,10 @@ extends KinematicBody2D
 class_name Enemy
 
 onready var ray_cast_2d: RayCast2D = $RayCast2D
+onready var damage_points = $DamagePoints
 const Utils = preload("res://Utils.gd")
 const Explosion = preload("res://Explosion.tscn")
+const Smoke = preload("res://Smoke.tscn")
 
 export var move_speed = 25
 export var health = -1
@@ -14,8 +16,13 @@ var velocity = Vector2.ZERO
 var dead = false
 
 func _ready() -> void:
-	if health < 0:
+	if health < 0 or health > max_health:
 		health = max_health
+	else:
+		var hurt_points = max_health - health
+		health = max_health
+		for i in hurt_points:
+			hurt()
 
 func _process(_delta: float) -> void:
 	$Graphics/Alive/Container/HealthLabel.text = "%s / %s" % [health, max_health]
@@ -49,6 +56,11 @@ func hurt():
 		return
 	Utils.log("zombie is hurt, health was ", health)
 	health -= 1
+	var smoke = Smoke.instance()
+	var smoke_pos = get_damage_point_on_body()
+	Utils.log("smoke pos", smoke_pos)
+	smoke.position = smoke_pos
+	add_child(smoke)
 	if health <= 0:
 		kill()
 
@@ -67,4 +79,10 @@ func kill():
 
 func _on_death_explosion_finished():
 	Utils.log("removing zombie after explosion finished")
-	queue_free()
+	$AnimationPlayer.play("fade_out")
+
+func get_damage_point_on_body() -> Vector2:
+	var child_count = damage_points.get_child_count()
+	var random_index = randi() % child_count
+	var random_child: Position2D = damage_points.get_child(random_index)
+	return random_child.position
diff --git a/Enemy.tscn b/Enemy.tscn
index 0cc1254..0681cae 100644
--- a/Enemy.tscn
+++ b/Enemy.tscn
@@ -1,8 +1,78 @@
-[gd_scene load_steps=3 format=2]
+[gd_scene load_steps=5 format=2]
 
 [ext_resource path="res://assets/kenney_simple-space/PNG/Default/enemy_A.png" type="Texture" id=1]
 [ext_resource path="res://Enemy.gd" type="Script" id=2]
 
+[sub_resource type="Animation" id=1]
+length = 0.001
+tracks/0/type = "bezier"
+tracks/0/path = NodePath(".:modulate:r")
+tracks/0/interp = 1
+tracks/0/loop_wrap = true
+tracks/0/imported = false
+tracks/0/enabled = true
+tracks/0/keys = {
+"points": PoolRealArray( 1, -0.25, 0, 0.25, 0 ),
+"times": PoolRealArray( 0 )
+}
+tracks/1/type = "bezier"
+tracks/1/path = NodePath(".:modulate:g")
+tracks/1/interp = 1
+tracks/1/loop_wrap = true
+tracks/1/imported = false
+tracks/1/enabled = true
+tracks/1/keys = {
+"points": PoolRealArray( 1, -0.25, 0, 0.25, 0 ),
+"times": PoolRealArray( 0 )
+}
+tracks/2/type = "bezier"
+tracks/2/path = NodePath(".:modulate:b")
+tracks/2/interp = 1
+tracks/2/loop_wrap = true
+tracks/2/imported = false
+tracks/2/enabled = true
+tracks/2/keys = {
+"points": PoolRealArray( 1, -0.25, 0, 0.25, 0 ),
+"times": PoolRealArray( 0 )
+}
+tracks/3/type = "bezier"
+tracks/3/path = NodePath(".:modulate:a")
+tracks/3/interp = 1
+tracks/3/loop_wrap = true
+tracks/3/imported = false
+tracks/3/enabled = true
+tracks/3/keys = {
+"points": PoolRealArray( 1, -0.25, 0, 0.25, 0 ),
+"times": PoolRealArray( 0 )
+}
+tracks/4/type = "value"
+tracks/4/path = NodePath(".:modulate")
+tracks/4/interp = 1
+tracks/4/loop_wrap = true
+tracks/4/imported = false
+tracks/4/enabled = true
+tracks/4/keys = {
+"times": PoolRealArray( 0 ),
+"transitions": PoolRealArray( 1 ),
+"update": 0,
+"values": [ Color( 1, 1, 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 ) ]
+}
+
 [node name="Enemy" type="KinematicBody2D"]
 script = ExtResource( 2 )
 max_health = 5
@@ -22,8 +92,22 @@ margin_bottom = 51.0
 text = "HEALTH"
 
 [node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="."]
-visible = false
-polygon = PoolVector2Array( 0, -23, -7, 5, -12, 9, -19, 9, -23, 14, -23, 19, -19, 23, -14, 23, -9, 18, -9, 14, -10, 12, -6, 9, 0, 15, 6, 9, 10, 12, 9, 14, 9, 19, 13, 23, 18, 23, 23, 18, 23, 14, 19, 10, 13, 10, 7, 5 )
+polygon = PoolVector2Array( 0, -23, -7, 5, -12, 9, -19, 9, -23, 14, -23, 19, -19, 23, -14, 23, -9, 19, -9, 14, -10, 12, -6, 9, 0, 15, 6, 9, 10, 12, 9, 14, 9, 19, 13, 23, 18, 23, 23, 18, 23, 14, 19, 10, 13, 10, 7, 5 )
+
+[node name="AnimationPlayer" type="AnimationPlayer" parent="."]
+anims/RESET = SubResource( 1 )
+anims/fade_out = SubResource( 2 )
+
+[node name="DamagePoints" type="Node2D" parent="."]
+
+[node name="Position2D" type="Position2D" parent="DamagePoints"]
+position = Vector2( -16, 16 )
+
+[node name="Position2D4" type="Position2D" parent="DamagePoints"]
+position = Vector2( 0, -13 )
+
+[node name="Position2D2" type="Position2D" parent="DamagePoints"]
+position = Vector2( 16, 16 )
 
 [node name="RayCast2D" type="RayCast2D" parent="."]
 enabled = true