fuzzyworld

godot-shooter / commit

Got the object avoidance working for a single enemy.

1702bad9cb166166164d8a384945480be0d6233a · Pavel Safronov · 2023-11-30 14:12:41 -0800 · parents de59c0517b6a

Got the object avoidance working for a single enemy.
 actors/Enemy.gd   | 28 +++++++++++++---------------
 actors/Enemy.tscn |  9 +++++----
 project.godot     |  2 ++
 scenes/World.gd   |  1 +
 scenes/World.tscn |  1 +
 5 files changed, 22 insertions(+), 19 deletions(-)

diff --git a/actors/Enemy.gd b/actors/Enemy.gd
index 7f086a8..f33fa8b 100644
--- a/actors/Enemy.gd
+++ b/actors/Enemy.gd
@@ -27,7 +27,6 @@ func _ready() -> void:
 	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")
-#	navigation_agent.set_navigation_map()
 	
 	$AnimationPlayer.play("fade_in")
 	if health < 0 or health > max_health:
@@ -39,15 +38,16 @@ func _ready() -> void:
 			hurt()
 
 func path_changed() -> void:
-#	Utils.log("path changed", navigation_agent.get_nav_path())
+	Utils.log("path changed", navigation_agent.get_nav_path())
 	pass
 
 func velocity_computed(new_vel: Vector2) -> void:
-#	Utils.log("velocity computed", new_vel)
+	Utils.log("velocity computed", new_vel)
+	velocity = move_and_slide(new_vel)
 	pass
 
 func target_reached() -> void:
-#	Utils.log("target reached")
+	Utils.log("target reached")
 	pass
 
 func _process(_delta: float) -> void:
@@ -65,6 +65,7 @@ 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:
 	if dead:
@@ -73,15 +74,13 @@ func _physics_process(_delta: float) -> void:
 	# navigate to the next position
 	var current_pos = global_position
 	var next_pos = navigation_agent.get_next_location()
-	var path = navigation_agent.get_nav_path()
-#	Utils.log("next nav pos", next_pos, "current pos", current_pos, "nav finished", navigation_agent.is_navigation_finished(), "path", path)
-	var new_vel: Vector2 = next_pos - current_pos
-	new_vel = new_vel.normalized()
-	new_vel = new_vel * move_speed
-	velocity = new_vel
-	
-	velocity = move_and_slide(velocity)
-	global_rotation = velocity.angle() + PI/2.0
+	var diff: Vector2 = next_pos - current_pos
+	var dir = diff.normalized()
+	var 	new_vel = dir * move_speed
+	if navigation_agent.avoidance_enabled:
+		navigation_agent.set_velocity(new_vel)
+	else:
+		velocity = move_and_slide(new_vel)
 
 	var ray_length = ray_cast_2d.cast_to.length()
 	if ray_cast_2d.is_colliding():
@@ -101,10 +100,9 @@ func set_target(pos: Vector2):
 #	var dir_diff = to_dir - curr_dir
 #	var change = dir_diff * turn_rate * move_speed
 #	velocity = (velocity + change).normalized() * move_speed
-	var nav_map = navigation_agent.get_navigation_map()
+#	var nav_map = navigation_agent.get_navigation_map()
 #	Utils.log("setting target location", pos, "map", nav_map)
 	navigation_agent.set_target_location(pos)
-	
 
 func _ensure_smoke_exists() -> void:
 	var max_smoke_count = $DamagePoints.get_child_count()
diff --git a/actors/Enemy.tscn b/actors/Enemy.tscn
index 390be18..25c4250 100644
--- a/actors/Enemy.tscn
+++ b/actors/Enemy.tscn
@@ -145,11 +145,12 @@ 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 = 100.0
+path_desired_distance = 10.0
 target_desired_distance = 10.0
-avoidance_enabled = true
-radius = 100.0
-max_speed = 100.0
+navigation_layers = 2
diff --git a/project.godot b/project.godot
index 23b7065..a27c543 100644
--- a/project.godot
+++ b/project.godot
@@ -132,6 +132,8 @@ debug_action={
 2d_physics/layer_2="enemies"
 2d_physics/layer_3="power_ups"
 2d_physics/layer_4="bullets"
+2d_navigation/layer_1="player"
+2d_navigation/layer_2="enemies"
 
 [network]
 
diff --git a/scenes/World.gd b/scenes/World.gd
index ba73d04..3b297f4 100644
--- a/scenes/World.gd
+++ b/scenes/World.gd
@@ -9,6 +9,7 @@ const PowerUp = preload("res://items/PowerUp.tscn")
 const Settings = preload("res://utils/Settings.gd")
 onready var player: Player = $Player
 onready var update_timer = $UpdateTimer
+onready var navigation_polygon: NavigationPolygonInstance = $NavigationPolygonInstance
 
 var generators = [
 	ConstantItemGenerator.new("create_enemy", self, "enemies", 5),
diff --git a/scenes/World.tscn b/scenes/World.tscn
index ba2b7f4..38f71e2 100644
--- a/scenes/World.tscn
+++ b/scenes/World.tscn
@@ -83,6 +83,7 @@ autostart = true
 
 [node name="NavigationPolygonInstance" type="NavigationPolygonInstance" parent="."]
 navpoly = SubResource( 2 )
+navigation_layers = 3
 
 [connection signal="body_entered" from="Destination" to="." method="_on_Destination_body_entered"]
 [connection signal="debug" from="Player" to="." method="_on_Player_debug"]