fuzzyworld

godot-shooter / commit

Fixed issue with enemies not following the player.

4c85b9c36c1306300d853a7dcbb1f7a51c755b79 · Pavel Safronov · 2023-11-29 13:32:59 -0800 · parents 62151b90dd17

Fixed issue with enemies not following the player.
 README.md         |  7 ++++---
 actors/Enemy.gd   | 18 ++++++++++++------
 actors/Enemy.tscn |  5 ++---
 scenes/World.gd   |  3 +--
 scenes/World.tscn |  2 --
 5 files changed, 19 insertions(+), 16 deletions(-)

diff --git a/README.md b/README.md
index 401373b..e21818c 100644
--- a/README.md
+++ b/README.md
@@ -14,6 +14,7 @@ Tap on the screen or move the mouse to set the destination of the ship. The ship
 ## TODOs
 
 1. Add shields
-2. Add powerups
-3. Add more enemies
-4. Add shooting enemies
+2. Add more enemies
+3. Add shooting enemies
+4. Add beam attack, [from here](https://www.youtube.com/watch?v=dg0CQ6NPDn8)
+5. Add navigation logic so actors can move around without colliding with each other
diff --git a/actors/Enemy.gd b/actors/Enemy.gd
index cbf76fe..8dfed65 100644
--- a/actors/Enemy.gd
+++ b/actors/Enemy.gd
@@ -10,11 +10,13 @@ const Damage = preload("res://effects/Damage.tscn")
 const Constants = preload("res://utils/Constants.gd")
 
 export var move_speed = Constants.SPEED * 1.05
-export var turn_rate = 0.01
+export var turn_rate = 0.03
 export var health = -1
 export var max_health = 100
 export var is_targeted = false
 export var is_invincible = false
+export var target: Vector2
+export var follow_target = false
 signal enemy_killed(position)
 
 var velocity = Vector2.ZERO
@@ -54,6 +56,13 @@ func _physics_process(_delta: float) -> void:
 		
 	velocity = move_and_slide(velocity)
 	global_rotation = velocity.angle() + PI/2.0
+	
+	if self.follow_target:
+		var to_dir = (target - global_position).normalized()
+		var curr_dir = velocity.normalized()
+		var dir_diff = to_dir - curr_dir
+		var change = dir_diff * turn_rate * move_speed
+		velocity = (velocity + change).normalized() * move_speed
 
 	var ray_length = ray_cast_2d.cast_to.length()
 	if ray_cast_2d.is_colliding():
@@ -68,11 +77,8 @@ func _physics_process(_delta: float) -> void:
 			kill()
 
 func turn_towards(pos: Vector2):
-	var to_dir = (pos - global_position).normalized()
-	var curr_dir = velocity.normalized()
-	var dir_diff = to_dir - curr_dir
-	var change = dir_diff * turn_rate * move_speed
-	velocity = (velocity + change).normalized() * move_speed
+	self.target = pos
+	self.follow_target = true
 
 func _ensure_smoke_exists() -> void:
 	var max_smoke_count = $DamagePoints.get_child_count()
diff --git a/actors/Enemy.tscn b/actors/Enemy.tscn
index f887843..6246ee2 100644
--- a/actors/Enemy.tscn
+++ b/actors/Enemy.tscn
@@ -19,7 +19,6 @@ length = 3.0
 
 [sub_resource type="Animation" id=3]
 resource_name = "fade_in"
-length = 3.0
 tracks/0/type = "value"
 tracks/0/path = NodePath(".:modulate")
 tracks/0/interp = 1
@@ -27,7 +26,7 @@ tracks/0/loop_wrap = true
 tracks/0/imported = false
 tracks/0/enabled = true
 tracks/0/keys = {
-"times": PoolRealArray( 0, 3 ),
+"times": PoolRealArray( 0, 1 ),
 "transitions": PoolRealArray( 1, 1 ),
 "update": 0,
 "values": [ Color( 1, 1, 1, 0 ), Color( 1, 1, 1, 1 ) ]
@@ -39,7 +38,7 @@ tracks/1/loop_wrap = true
 tracks/1/imported = false
 tracks/1/enabled = true
 tracks/1/keys = {
-"times": PoolRealArray( -0.2, 3 ),
+"times": PoolRealArray( -0.2, 1 ),
 "transitions": PoolRealArray( 1, 1 ),
 "update": 0,
 "values": [ Vector2( 0.01, 0.01 ), Vector2( 1, 1 ) ]
diff --git a/scenes/World.gd b/scenes/World.gd
index 3ccf6fe..8765773 100644
--- a/scenes/World.gd
+++ b/scenes/World.gd
@@ -24,7 +24,6 @@ var is_dragging = false
 
 func enemy_killed(_position: Vector2):
 	player.score += 5
-	player.show_message("Enemy killed!", 1)
 func health_consumed(_data):
 	player.heal(10)
 	player.score += 1
@@ -222,7 +221,7 @@ func _on_UpdateTimer_timeout() -> void:
 	var filteredEnemies = Utils.filter(funcref(self,"filter_invalid_enemies"), enemies)
 	for e in filteredEnemies:
 		var enemy: Enemy = e
-		enemy.set_target($Player.position)
+		enemy.turn_towards($Player.position)
 		var diff = enemy.global_position - player.global_position
 		var dist = diff.length()
 		var is_too_far = dist > item_replacement_distance
diff --git a/scenes/World.tscn b/scenes/World.tscn
index dcd0cf3..5fe84f8 100644
--- a/scenes/World.tscn
+++ b/scenes/World.tscn
@@ -76,8 +76,6 @@ antialiased = true
 wait_time = 0.1
 autostart = true
 
-[node name="NavigationPolygonInstance" type="NavigationPolygonInstance" parent="."]
-
 [connection signal="body_entered" from="Destination" to="." method="_on_Destination_body_entered"]
 [connection signal="debug" from="Player" to="." method="_on_Player_debug"]
 [connection signal="destination_set" from="Player" to="." method="_on_Player_destination_set"]