godot-shooter / commit
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