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