fuzzyworld

godot-shooter / commit

Enemies now avoid colliding with each other and with the player.

6ad40cea47bdbcdf1965e97f79ecc51c56321b51 · Pavel Safronov · 2023-11-30 17:02:56 -0800 · parents 7929daa82fa1

Enemies now avoid colliding with each other and with the player.
Other changes:
- changed the "enemy rams player and destroys itself, dealing damage to player", since soon the enemies will be shooting the player (and maybe close proximity will just cause an explosion of enemy)
- the target on the enemies is now faded
- removed a bunch of log calls
 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"]