From 9f2148cb5b6843097d0b5d3d5a6b7c2f18abf53e Mon Sep 17 00:00:00 2001 From: Varylios Date: Tue, 26 Aug 2025 13:03:22 +0200 Subject: [PATCH] refactor: extra PlayerManager from world.gd --- Globals/EventBus.gd | 10 ++- Levels/world.gd | 156 -------------------------------------------- Levels/world.tscn | 23 ++++++- Towers/tower.gd | 10 ++- game_menu.gd | 16 +++-- 5 files changed, 46 insertions(+), 169 deletions(-) diff --git a/Globals/EventBus.gd b/Globals/EventBus.gd index eec4b3c..6e3cd38 100644 --- a/Globals/EventBus.gd +++ b/Globals/EventBus.gd @@ -3,7 +3,7 @@ extends Node #Emitter : TowerButton.gd #Subscriber : World.gd -signal tower_selected(tower : PackedScene, tower_button : TowerButton) +signal tower_selected(tower : PackedScene) #Emitter : World.gd @@ -53,3 +53,11 @@ signal money_spent(_value : int) #Emitter : spawner.gd #Subscriber : cube.gd signal player_has_won() + +#Emitter : PlayerManager.gd +#Subscriber : game_menu.gd +signal open_shop() + +#Emitter : PlayerManager.gd +#Subscriber : game_menu.gd +signal close_shop() diff --git a/Levels/world.gd b/Levels/world.gd index 213f67a..c156813 100644 --- a/Levels/world.gd +++ b/Levels/world.gd @@ -1,162 +1,6 @@ extends Node3D -#TODO Get rid of tower_blueprint, remake player controler -@onready var tower_blueprint = preload("res://Towers/tower.tscn") - - -@onready var selected_tower : Tower -@onready var selected_tower_button : TowerButton = $CanvasLayer/GameMenu/VBoxContainer/PierreButton - -@onready var cam : Camera3D = $Camera3D -@onready var selector : Node3D = $Selector -@onready var the_cube : TheCube = %TheCube - -var tower_count : int = 0: - set(value): - tower_count = value - EventBus.tower_count_changed.emit(tower_count) - - -var team_in_action : Array[Tower]: - set(value): - team_in_action = value - EventBus.team_in_action_changed.emit(team_in_action) - - -var team_in_rest : Array[Tower] -var target_tower : Tower -var in_build_menu : bool = false - var selected_collider : CollisionObject3D func _ready() -> void: $Spawner.spawn_next_wave() - $CanvasLayer/GameMenu.visible = in_build_menu - EventBus.tower_selected.connect(_on_EventBus_tower_selected) - - -func _process(delta: float) -> void: - handle_player_controls() - if Input.is_action_just_pressed("build"): - if not selected_collider: - return - - if selected_collider.collision_layer == 1: - build_tower(tower_blueprint) - if selected_collider is TheCube: - open_shop() - else: - close_shop() - - if Input.is_action_just_pressed("rest"): - close_shop() - if target_tower: - send_to_rest(target_tower) - - -func handle_player_controls() -> void: - var space_state : PhysicsDirectSpaceState3D = get_world_3d().direct_space_state - var mouse_pos : Vector2 = get_viewport().get_mouse_position() - - var origin : Vector3 = cam.project_ray_origin(mouse_pos) - var end : Vector3 = origin + cam.project_ray_normal(mouse_pos) * 100 - var ray : PhysicsRayQueryParameters3D = PhysicsRayQueryParameters3D.create(origin, end) - ray.collide_with_bodies = true - - var ray_result : Dictionary = space_state.intersect_ray(ray) - - if ray_result.is_empty(): - selector.visible = false - selected_collider = null - return - - var collider : CollisionObject3D = ray_result.get("collider") - selected_collider = collider - - selector.visible = true - selector.global_position = collider.global_position - selector.global_position += Vector3(0.0,0.2,0.0) - - if selected_collider is Tower: - target_tower = collider - else: - target_tower = null - -# Refactoriser ce code -func build_tower(scene : PackedScene) -> void: - if !selector.visible: - return - - var temp_tower : Tower = scene.instantiate() - - - #Move existing tower - for tower : Tower in team_in_action: - if tower.tower_name == temp_tower.tower_name: - move_tower(tower) - return - - #Send to action a resting tower - for tower : Tower in team_in_rest: - if tower.tower_name == temp_tower.tower_name: - move_tower(tower) - send_to_action(tower) - return - - #Build Tower - if temp_tower.price < the_cube.money: - #Can't build - print("Too costly") - return - else : - #Can build - EventBus.money_spent.emit(temp_tower.price) - temp_tower.tower_button = selected_tower_button - tower_count += 1 - $Towers.add_child(temp_tower) - EventBus.tower_builded.emit(temp_tower) - selected_tower_button.tower_in_game = temp_tower - send_to_action(temp_tower) - move_tower(temp_tower) - - - -func move_tower(tower : Tower): - tower.global_position = selector.global_position - - -func send_to_rest(tower : Tower): - team_in_action.erase(tower) - team_in_rest.append(tower) - tower.is_rest = true - EventBus.team_in_action_changed.emit(team_in_action) - - -func send_to_action(tower : Tower): - team_in_rest.erase(tower) - team_in_action.append(tower) - tower.is_rest = false - EventBus.team_in_action_changed.emit(team_in_action) - -func open_shop(): - if in_build_menu: - close_shop() - return - - in_build_menu = true - $CanvasLayer/GameMenu.visible = in_build_menu - - - -func close_shop(): - in_build_menu = false - $CanvasLayer/GameMenu.visible = in_build_menu - - -func _on_EventBus_tower_selected(tower : PackedScene, tower_button : TowerButton): - tower_blueprint = tower - selected_tower_button = tower_button - - -func _on_cube_icon_pressed() -> void: - open_shop() diff --git a/Levels/world.tscn b/Levels/world.tscn index a45fee8..c88dec7 100644 --- a/Levels/world.tscn +++ b/Levels/world.tscn @@ -1,7 +1,8 @@ -[gd_scene load_steps=18 format=3 uid="uid://ky0uewndeuwv"] +[gd_scene load_steps=20 format=3 uid="uid://ky0uewndeuwv"] [ext_resource type="Script" uid="uid://qqid42jkpkmv" path="res://Levels/world.gd" id="1_fj7yv"] [ext_resource type="PackedScene" uid="uid://d1f6m15niwgt" path="res://Tiles/tile.tscn" id="3_aqk2v"] +[ext_resource type="Script" uid="uid://caf3yamufmhd4" path="res://Scripts/PlayerManager.gd" id="3_ju8gl"] [ext_resource type="PackedScene" uid="uid://d17sleiqkdoo2" path="res://Assets/GLB format/selection-a.glb" id="3_tlwt5"] [ext_resource type="PackedScene" uid="uid://do7gm1gjhu1t5" path="res://Tiles/road.tscn" id="4_036b0"] [ext_resource type="Script" uid="uid://tpon511km4al" path="res://spawner.gd" id="5_036b0"] @@ -35,14 +36,31 @@ adjustment_enabled = true adjustment_contrast = 1.3 adjustment_saturation = 1.2 +[sub_resource type="GDScript" id="GDScript_ju8gl"] +script/source = "extends Node3D + +class_name TowerList + +func _ready() -> void: + child_entered_tree.connect(_on_child_entered_tree) + child_exiting_tree.connect(_on_child_exiting_tree) + +func _on_child_entered_tree(child): + EventBus.tower_count_changed.emit(get_children().count()) + +func _on_child_exiting_tree(child): + EventBus.team_in_action_changed.emit(get_children().count()) +" + [node name="World" type="Node3D"] script = ExtResource("1_fj7yv") [node name="Camera3D" type="Camera3D" parent="."] transform = Transform3D(-0.992981, -0.0586822, 0.10269, -0.00234758, 0.877843, 0.478943, -0.118251, 0.47534, -0.871819, 5.87173, 2.81458, -3.88415) -[node name="Selector" parent="." instance=ExtResource("3_tlwt5")] +[node name="PlayerManager" parent="." instance=ExtResource("3_tlwt5")] visible = false +script = ExtResource("3_ju8gl") [node name="Map" type="Node3D" parent="."] @@ -198,5 +216,6 @@ transform = Transform3D(-0.0471892, 0, 1.99944, 0, 2, 0, -1.99944, 0, -0.0471892 transform = Transform3D(1.08365, 0, 1.68098, 0, 2, 0, -1.68098, 0, 1.08365, 1.44235, 0, 4.63481) [node name="Towers" type="Node3D" parent="."] +script = SubResource("GDScript_ju8gl") [connection signal="timeout" from="Spawner/SpawnTimer" to="Spawner" method="_on_spawn_timer_timeout"] diff --git a/Towers/tower.gd b/Towers/tower.gd index 6ab2e4d..ed4dbd4 100644 --- a/Towers/tower.gd +++ b/Towers/tower.gd @@ -24,8 +24,6 @@ var bullet : PackedScene = preload("res://Bullets/bullet.tscn") @export var energy_cost : float = 50.0 @onready var energy_bar : EnergyBar3D = $EnergyBar3D -var tower_button : TowerButton = null - var energy : float = max_energy: set(value): energy = clampf(value, 0.0, max_energy) @@ -63,7 +61,7 @@ func get_available_upgrades() -> Array[TowerUpgrade]: continue else: # If they have a condition, check for the previously bought upgrades - for owned_upgrade in tower_upgrades: #Check + for owned_upgrade in tower_upgrades: #Check if shop_upgrade.condition == owned_upgrade: available_upgrades.append(shop_upgrade) return available_upgrades @@ -84,7 +82,7 @@ func _ready() -> void: func _process(delta: float) -> void: if is_rest: return - + if is_instance_valid(current): if can_shoot && not is_exhausted: shoot() @@ -97,7 +95,7 @@ func _process(delta: float) -> void: func shoot() -> void: energy -= energy_cost - + var temp_bullet : Bullet = bullet.instantiate() temp_bullet.target = current temp_bullet.bullet_damage = bullet_damage @@ -129,7 +127,7 @@ func choose_target(_current_targets : Array) -> void: else: if i.get_parent().get_progress() > current_target.get_parent().get_progress(): current_target = i - + current = current_target diff --git a/game_menu.gd b/game_menu.gd index 9d000d5..3f0fae8 100644 --- a/game_menu.gd +++ b/game_menu.gd @@ -4,19 +4,27 @@ var selected_tower func _ready() -> void: EventBus.tower_selected.connect(_on_EventBus_tower_selected) + EventBus.open_shop.connect(open_shop) + EventBus.close_shop.connect(close_shop) +func open_shop(): + if visible: + close_shop() + return -func _on_EventBus_tower_selected(tower : PackedScene, tower_button : TowerButton): + visible = true + +func close_shop(): + visible = false + +func _on_EventBus_tower_selected(tower : PackedScene): selected_tower = tower - func _on_button_return_desktop_pressed() -> void: get_tree().quit() - func _on_button_back_to_start_screen_pressed() -> void: Transition.goto("res://UI/start_menu.tscn") - func _on_button_continue_pressed() -> void: visible = false