fuzzyworld

godot-shooter / godot-4-testing / files / Enemy.gd

Branch godot-4-testing · default branch · all branches

Enemy.gd

Blame: the commit that last changed each line · file · history

11a2e1d9 2023-10-31 Pavel Safronov1extends CharacterBody2D
b856550a 2023-10-30 Pavel Safronov2
11a2e1d9 2023-10-31 Pavel Safronov3@onready var ray_cast_2d: RayCast2D = $RayCast2D
4@onready var scene_tree: SceneTree = get_tree()
614e7fb1 2023-10-31 Pavel Safronov5const utils = preload("res://Utils.gd")
c6faad15 2023-10-31 Pavel Safronov6var Explosion = preload("res://Explosion.tscn")
b856550a 2023-10-30 Pavel Safronov7
11a2e1d9 2023-10-31 Pavel Safronov8@export var move_speed = 100
9@export var health: int = randi() % 8 + 2
10@export var max_health = 10
b856550a 2023-10-30 Pavel Safronov11
12var dead = false
13
614e7fb1 2023-10-31 Pavel Safronov14func _process(delta: float) -> void:
15 $Graphics/Alive/Container/HealthLabel.text = "%s / %s" % [health, max_health]
16 $Graphics/Alive/Container.global_rotation = 0
17
b856550a 2023-10-30 Pavel Safronov18func _physics_process(delta: float) -> void:
19 if dead:
20 return
21 var players = scene_tree.get_nodes_in_group("player")
11a2e1d9 2023-10-31 Pavel Safronov22 var player: CharacterBody2D = players[0]
b856550a 2023-10-30 Pavel Safronov23 var dist_to_player = global_position.distance_to(player.global_position)
24
25 var dir_to_player = global_position.direction_to(player.global_position)
26 var angle_to_player = dir_to_player.angle() + PI / 2.0
614e7fb1 2023-10-31 Pavel Safronov27 var vel = dir_to_player * move_speed
b856550a 2023-10-30 Pavel Safronov28 global_rotation = angle_to_player
11a2e1d9 2023-10-31 Pavel Safronov29 move_and_slide()
b856550a 2023-10-30 Pavel Safronov30
11a2e1d9 2023-10-31 Pavel Safronov31 var ray_length = ray_cast_2d.target_position.length()
b856550a 2023-10-30 Pavel Safronov32 if ray_cast_2d.is_colliding() and ray_cast_2d.get_collider() == player and dist_to_player < (ray_length + 5):
33 player.hurt()
11a2e1d9 2023-10-31 Pavel Safronov34 var push = to_global(ray_cast_2d.target_position) - to_global(Vector2.ZERO)
b856550a 2023-10-30 Pavel Safronov35 player.position += (push * 2)
11a2e1d9 2023-10-31 Pavel Safronov36 player.move_and_slide()
b856550a 2023-10-30 Pavel Safronov37
38func hurt():
39 if dead:
40 return
614e7fb1 2023-10-31 Pavel Safronov41 utils.log("zombie is hurt, health was ", health)
b856550a 2023-10-30 Pavel Safronov42 health -= 1
43 if health <= 0:
44 kill()
45
46func kill():
47 if dead:
48 return
614e7fb1 2023-10-31 Pavel Safronov49 utils.log("zombie is dead")
b856550a 2023-10-30 Pavel Safronov50 dead = true
51 $Graphics/Alive.hide()
11a2e1d9 2023-10-31 Pavel Safronov52 var explosion = Explosion.instantiate()
53 explosion.connect("explosion_done", Callable(self, "_on_death_explosion_finished"))
c6faad15 2023-10-31 Pavel Safronov54 $Graphics.add_child(explosion)
b856550a 2023-10-30 Pavel Safronov55 $CollisionPolygon2D.disabled = true
56 z_index = -1
c6faad15 2023-10-31 Pavel Safronov57
58func _on_death_explosion_finished():
59 utils.log("removing zombie after explosion finished")
b856550a 2023-10-30 Pavel Safronov60 queue_free()