fuzzyworld

godot-shooter / commit

Player and enemies now turn slowly toward their goals: destination for player, player for enemies.

e496c548f4658064717ad64cfacdfd8a9564d6ce · Pavel Safronov · 2023-11-06 11:27:07 -0800 · parents 12be4538730b

Player and enemies now turn slowly toward their goals: destination for player, player for enemies.
Also removed some logging calls.
 Enemy.gd  | 26 +++++++++++++++-----------
 Player.gd | 12 ++++++++++--
 World.gd  | 14 +++++++-------
 3 files changed, 32 insertions(+), 20 deletions(-)

diff --git a/Enemy.gd b/Enemy.gd
index 27cdc9b..e5e6494 100644
--- a/Enemy.gd
+++ b/Enemy.gd
@@ -8,6 +8,7 @@ const Explosion = preload("res://Explosion.tscn")
 const Smoke = preload("res://Smoke.tscn")
 
 export var move_speed = 40
+export var turn_rate = 0.3
 export var health = -1
 export var max_health = 10
 export var is_targeted = false
@@ -34,19 +35,15 @@ func _process(_delta: float) -> void:
 func _physics_process(_delta: float) -> void:
 	if dead:
 		return
-	var players = get_tree().get_nodes_in_group("player")
-	var player: Player = players[0]
-	if player.dead:
-		return
-	var dist_to_player = global_position.distance_to(player.global_position)
-	var dir_to_player = global_position.direction_to(player.global_position)
-	var angle_to_player = dir_to_player.angle() + PI / 2.0
-	var vel = dir_to_player * move_speed
-	global_rotation = angle_to_player
-	velocity = move_and_slide(vel)
-	
+		
+	velocity = move_and_slide(velocity)
+	global_rotation = velocity.angle() + PI/2.0
+
 	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: 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(2)
 			var explosion = Explosion.instance()
@@ -54,6 +51,13 @@ func _physics_process(_delta: float) -> void:
 			get_parent().add_child(explosion)
 			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.normalized() * turn_rate
+	velocity = (velocity + change).normalized() * move_speed
+
 func hurt():
 	if dead || is_invincible:
 		return
diff --git a/Player.gd b/Player.gd
index 7a01135..2cf1d89 100644
--- a/Player.gd
+++ b/Player.gd
@@ -7,11 +7,12 @@ export var max_health = 10
 export var shot_period_seconds = .5
 export var bullet: PackedScene
 export var is_invincible = false
+export var turn_rate = 0.3
 
 var PopupControl = preload("res://Popup.tscn")
 
 var dead = false
-var velocity = Vector2.ZERO
+var velocity = Vector2.UP * move_speed
 var can_fire = true
 var destination: Vector2
 var is_destination_set = false
@@ -25,8 +26,8 @@ func _process(_delta: float) -> void:
 func _physics_process(_delta: float) -> void:
 	if dead:
 		return
-	global_rotation = global_position.direction_to(get_global_mouse_position()).angle() + PI/2.0
 	velocity = move_and_slide(velocity)
+	global_rotation = velocity.angle() + PI/2.0
 
 func restart():
 	var _error = get_tree().reload_current_scene()
@@ -47,6 +48,13 @@ func hurt(damage_amount: int = 1):
 	if health <= 0:
 		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.normalized() * turn_rate
+	velocity = (velocity + change).normalized() * move_speed
+
 func shoot():
 	if !can_fire:
 		return
diff --git a/World.gd b/World.gd
index 18aa88a..3fdda0a 100644
--- a/World.gd
+++ b/World.gd
@@ -37,15 +37,12 @@ func _input(event: InputEvent) -> void:
 		
 	if event is InputEventScreenTouch && event.pressed:
 		var result = event.position + $Player.position - Vector2(500, 300)
-		Utils.log("set1", result)
 		set_destination(result)
 	if event is InputEventScreenDrag:
 		var result = event.position + $Player.position - Vector2(500, 300)
-		Utils.log("set2", result)
 		set_destination(result)
 	if event is InputEventMouseMotion:
 		var result = event.position + $Player.position - Vector2(500, 300)
-		Utils.log("set3", result)
 		set_destination(result)
 
 func _process(_delta: float) -> void:
@@ -55,19 +52,22 @@ func _process(_delta: float) -> void:
 		$CanvasLayer/PauseMenu.show()
 
 	if is_destination_set:
-		var diff = destination - $Player.global_position
-		var unit = diff.normalized()
-		$Player.velocity = unit * $Player.move_speed
+		$Player.turn_towards(destination)
 		$Destination.visible = true
 	else:
 		$Destination.visible = false
+	
+	var enemies = get_tree().get_nodes_in_group("enemies")
+	var filteredEnemies = Utils.filter(funcref(self,"filter_invalid_enemies"), enemies)
+	for e in filteredEnemies:
+		var enemy: Enemy = e
+		enemy.turn_towards($Player.position)
 
 func set_destination(pos: Vector2) -> void:
 	destination = pos
 	is_destination_set = true
 	$Destination.global_position = pos
 	$Destination.visible = true
-	$Player.	global_rotation = global_position.direction_to(pos).angle() + PI/2.0
 
 func _on_Destination_body_entered(body: Node) -> void:
 	if body == $Player: