godot-shooter / commit
Moved the "player shoots at nearest enemy" logic into the Player class.
actors/Player.gd | 29 +++++++++++++++++++++++++++++ actors/Player.tscn | 12 ++++++++++++ scenes/Scores.gd | 2 -- scenes/World.gd | 21 --------------------- scenes/World.tscn | 12 ------------ 5 files changed, 41 insertions(+), 35 deletions(-) diff --git a/actors/Player.gd b/actors/Player.gd index 2d3dd1c..2d7c4de 100644 --- a/actors/Player.gd +++ b/actors/Player.gd @@ -35,6 +35,7 @@ onready var trails = $Graphics/Alive/Trails onready var shot_timer = $ShotTimer onready var death_screen = $UI/DeathScreen onready var final_score_label = $UI/DeathScreen/CenterContainer/PanelContainer/VBoxContainer/FinalScoreLabel +onready var player_to_target = $Graphics/Alive/PlayerToTarget const Utils = preload("res://utils/Utils.gd") const PopupControl = preload("res://utils/Popup.tscn") @@ -45,6 +46,11 @@ var velocity: Vector2 = Vector2.UP * move_speed var can_fire = true var settings: Settings +func filter_invalid_enemies(enemy: Enemy) -> bool: + if enemy.dead: + return false + return true + func create_default_weapon() -> Weapon: return Weapons.create_basic_gun() @@ -82,6 +88,29 @@ func _process(_delta: float) -> void: # set HUD info, like score and current weapon hud.set_current_weapon(weapon) hud.score = score + + # shoot at closest enemy + var enemies = get_tree().get_nodes_in_group("enemies") + for e in enemies: + var enemy: Enemy = e + enemy.is_targeted = false + + var filteredEnemies = Utils.filter(funcref(self,"filter_invalid_enemies"), enemies) + if filteredEnemies.size() > 0: + filteredEnemies.sort_custom(self, "sort_enemies_ascending_distance") + var closest_enemy: Enemy = filteredEnemies[0] + var dist = closest_enemy.global_position.distance_to(self.global_position) + if dist < self.weapon.shooting_range: + closest_enemy.is_targeted = true + self.shoot_at(closest_enemy.global_position) + player_to_target.points[0] = self.global_position + player_to_target.points[1] = closest_enemy.global_position + +func sort_enemies_ascending_distance(a: Enemy,b: Enemy): + var distA = self.global_position.distance_to(a.global_position) + var distB = self.global_position.distance_to(b.global_position) + var result = distA < distB + return result func _physics_process(delta: float) -> void: if dead: diff --git a/actors/Player.tscn b/actors/Player.tscn index f4b9b28..9735896 100644 --- a/actors/Player.tscn +++ b/actors/Player.tscn @@ -101,6 +101,18 @@ percent_visible = false modulate = Color( 1, 0, 0, 1 ) gradient = SubResource( 1 ) +[node name="PlayerToTarget" type="Line2D" parent="Graphics/Alive"] +visible = false +modulate = Color( 1, 0.984314, 0, 1 ) +points = PoolVector2Array( 2085.69, 283.505, 2067.82, 274.471 ) +width = 3.0 +default_color = Color( 1, 0.976471, 0.4, 1 ) +joint_mode = 1 +begin_cap_mode = 2 +end_cap_mode = 2 +round_precision = 13 +antialiased = true + [node name="Dead" type="Node2D" parent="Graphics"] visible = false diff --git a/scenes/Scores.gd b/scenes/Scores.gd index 6ad2e20..2173b2f 100644 --- a/scenes/Scores.gd +++ b/scenes/Scores.gd @@ -11,10 +11,8 @@ func _ready() -> void: if settings.high_scores.size() > 0: Utils.remove_all_children(scores_list) settings.high_scores.sort_custom(self, "sort_high_scores") - var index = 0 var now = Time.get_datetime_dict_from_system() for hs in settings.high_scores: - index += 1 var label = Label.new() var date_dict = hs.date var date_diff_secs = Utils.time_diff_secs(date_dict, now) diff --git a/scenes/World.gd b/scenes/World.gd index 16da310..64748d1 100644 --- a/scenes/World.gd +++ b/scenes/World.gd @@ -160,12 +160,6 @@ func _on_Destination_body_entered(body: Node) -> void: if body == player: player.clear_destination() -func sort_enemies_ascending_distance(a: Enemy,b: Enemy): - var distA = player.global_position.distance_to(a.global_position) - var distB = player.global_position.distance_to(b.global_position) - var result = distA < distB - return result - func filter_invalid_enemies(enemy: Enemy) -> bool: if enemy.dead: return false @@ -174,21 +168,6 @@ func filter_invalid_enemies(enemy: Enemy) -> bool: func _on_ShootTimer_timeout() -> void: if player.dead: return - var enemies = get_tree().get_nodes_in_group("enemies") - for e in enemies: - var enemy: Enemy = e - enemy.is_targeted = false - - var filteredEnemies = Utils.filter(funcref(self,"filter_invalid_enemies"), enemies) - if filteredEnemies.size() > 0: - filteredEnemies.sort_custom(self, "sort_enemies_ascending_distance") - var closest_enemy: Enemy = filteredEnemies[0] - var dist = closest_enemy.global_position.distance_to($Player.global_position) - if dist < player.weapon.shooting_range: - closest_enemy.is_targeted = true - player.shoot_at(closest_enemy.global_position) - $PlayerToTarget.points[0] = player.global_position - $PlayerToTarget.points[1] = closest_enemy.global_position func _on_Button_pressed() -> void: get_tree().paused = false diff --git a/scenes/World.tscn b/scenes/World.tscn index 5fe84f8..abee8e7 100644 --- a/scenes/World.tscn +++ b/scenes/World.tscn @@ -60,18 +60,6 @@ process_mode = 0 wait_time = 0.05 autostart = true -[node name="PlayerToTarget" type="Line2D" parent="."] -visible = false -modulate = Color( 1, 0.984314, 0, 1 ) -points = PoolVector2Array( 2085.69, 283.505, 2067.82, 274.471 ) -width = 3.0 -default_color = Color( 1, 0.976471, 0.4, 1 ) -joint_mode = 1 -begin_cap_mode = 2 -end_cap_mode = 2 -round_precision = 13 -antialiased = true - [node name="UpdateTimer" type="Timer" parent="."] wait_time = 0.1 autostart = true