godot-shooter / commit
Player and enemies now turn slowly toward their goals: destination for player, player for enemies.
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: