godot-shooter / commit
Enemies now avoid colliding with each other and with the player.
actors/Enemy.gd | 38 +++++++++++++++++--------------------- actors/Enemy.tscn | 18 +++++++----------- actors/Player.tscn | 4 ++++ scenes/World.gd | 13 +++++++------ scenes/World.tscn | 2 +- 5 files changed, 36 insertions(+), 39 deletions(-) diff --git a/actors/Enemy.gd b/actors/Enemy.gd index f33fa8b..f5c9986 100644 --- a/actors/Enemy.gd +++ b/actors/Enemy.gd @@ -1,7 +1,6 @@ extends KinematicBody2D class_name Enemy -onready var ray_cast_2d: RayCast2D = $RayCast2D onready var damage_points = $DamagePoints onready var navigation_agent: NavigationAgent2D = $NavigationAgent2D const Utils = preload("res://utils/Utils.gd") @@ -24,6 +23,7 @@ var health_ratio var health_percentage func _ready() -> void: + navigation_agent.max_speed = move_speed var _err = navigation_agent.connect("path_changed", self, "path_changed") _err = navigation_agent.connect("velocity_computed", self, "velocity_computed") _err = navigation_agent.connect("target_reached", self, "target_reached") @@ -38,16 +38,21 @@ func _ready() -> void: hurt() func path_changed() -> void: - Utils.log("path changed", navigation_agent.get_nav_path()) pass func velocity_computed(new_vel: Vector2) -> void: - Utils.log("velocity computed", new_vel) velocity = move_and_slide(new_vel) + global_rotation = velocity.angle() + PI/2.0 pass func target_reached() -> void: - Utils.log("target reached") + var players = get_tree().get_nodes_in_group("player") + var player = players[0] + player.hurt(25) + var explosion = Explosion.instance() + explosion.transform = transform + get_parent().add_child(explosion) + kill() pass func _process(_delta: float) -> void: @@ -65,9 +70,8 @@ func _process(_delta: float) -> void: $Graphics/Alive/Sprite/Target.visible = is_targeted $Graphics/Alive/Sprite/Target.global_rotation = 0 $Graphics/Alive/Sprite/Trails.add_position(global_position) - global_rotation = velocity.angle() + PI/2.0 -func _physics_process(_delta: float) -> void: +func _physics_process(delta: float) -> void: if dead: return @@ -76,23 +80,15 @@ func _physics_process(_delta: float) -> void: var next_pos = navigation_agent.get_next_location() var diff: Vector2 = next_pos - current_pos var dir = diff.normalized() - var new_vel = dir * move_speed + var desired_vel = dir * navigation_agent.max_speed + var steering = (desired_vel - velocity) * delta * 4 + var new_vel = velocity + steering + velocity = new_vel + if navigation_agent.avoidance_enabled: - navigation_agent.set_velocity(new_vel) + navigation_agent.set_velocity(velocity) else: - velocity = move_and_slide(new_vel) - - var ray_length = ray_cast_2d.cast_to.length() - if ray_cast_2d.is_colliding(): - var players = get_tree().get_nodes_in_group("player") - var player = players[0] - var dist_to_player = global_position.distance_to(player.global_position) - if ray_cast_2d.get_collider() == player and dist_to_player < (ray_length + 5): - player.hurt(25) - var explosion = Explosion.instance() - explosion.transform = transform - get_parent().add_child(explosion) - kill() + velocity_computed(velocity) func set_target(pos: Vector2): # var to_dir = (pos - global_position).normalized() diff --git a/actors/Enemy.tscn b/actors/Enemy.tscn index 25c4250..41b8cfe 100644 --- a/actors/Enemy.tscn +++ b/actors/Enemy.tscn @@ -101,7 +101,7 @@ modulate = Color( 1, 0.470588, 0, 1 ) texture = ExtResource( 4 ) [node name="Target" type="Sprite" parent="Graphics/Alive/Sprite"] -modulate = Color( 1, 0, 0, 1 ) +modulate = Color( 1, 0, 0, 0.643137 ) texture = ExtResource( 5 ) [node name="Trails" parent="Graphics/Alive/Sprite" instance=ExtResource( 2 )] @@ -137,20 +137,16 @@ position = Vector2( 0, -13 ) [node name="Position2D2" type="Position2D" parent="DamagePoints"] position = Vector2( 16, 16 ) -[node name="RayCast2D" type="RayCast2D" parent="."] -visible = false -enabled = true -cast_to = Vector2( 0, -50 ) - [node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="."] 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="NavigationObstacle2D" type="NavigationObstacle2D" parent="CollisionPolygon2D"] -radius = 100.0 - [node name="DamageObjects" type="Node2D" parent="."] [node name="NavigationAgent2D" type="NavigationAgent2D" parent="."] path_desired_distance = 10.0 -target_desired_distance = 10.0 -navigation_layers = 2 +target_desired_distance = 50.0 +navigation_layers = 3 +avoidance_enabled = true +radius = 50.0 +neighbor_dist = 300.0 +max_speed = 50.0 diff --git a/actors/Player.tscn b/actors/Player.tscn index 9319310..5d9591b 100644 --- a/actors/Player.tscn +++ b/actors/Player.tscn @@ -381,6 +381,10 @@ __meta__ = { "_gizmo_extents_": 14.2 } +[node name="NavigationObstacle2D" type="NavigationObstacle2D" parent="."] +estimate_radius = false +radius = 25.0 + [connection signal="debug_signal" from="UI/HUD" to="." method="_on_HUD_debug_signal"] [connection signal="paused" from="UI/HUD" to="." method="_on_HUD_paused"] [connection signal="position_set" from="UI/HUD" to="." method="_on_HUD_position_set"] diff --git a/scenes/World.gd b/scenes/World.gd index d4d5ff1..73c9128 100644 --- a/scenes/World.gd +++ b/scenes/World.gd @@ -49,7 +49,7 @@ func bomb_consumed(data): func create_enemy() -> Enemy: var enemy = Enemy.instance() - enemy.position = get_new_environment_position(.5) + enemy.position = get_new_environment_position(1) enemy.connect("enemy_killed", self, "enemy_killed") return enemy func create_health() -> PowerUp: @@ -124,11 +124,12 @@ func get_new_environment_position(dist_ratio: float = 1.0) -> Vector2: func _ready() -> void: run_generators() - var enemies = get_tree().get_nodes_in_group("enemies") - var enemy1: Enemy = enemies[0] - enemy1.position = Vector2(-100, 300) - var enemy2: Enemy = enemies[1] - enemy2.position = Vector2(100, 300) +# # position first two enemies +# var enemies = get_tree().get_nodes_in_group("enemies") +# var enemy1: Enemy = enemies[0] +# enemy1.position = Vector2(-300, 200) +# var enemy2: Enemy = enemies[1] +# enemy2.position = Vector2(300, 200) pass func run_generators() -> void: diff --git a/scenes/World.tscn b/scenes/World.tscn index 51a7460..aed6610 100644 --- a/scenes/World.tscn +++ b/scenes/World.tscn @@ -83,7 +83,7 @@ autostart = true [node name="NavigationPolygonInstance" type="NavigationPolygonInstance" parent="."] navpoly = SubResource( 2 ) -navigation_layers = 3 +navigation_layers = 2 [connection signal="body_entered" from="Destination" to="." method="_on_Destination_body_entered"] [connection signal="debug" from="Player" to="." method="_on_Player_debug"]