refactor: extract PlayerManager from world.gd

This commit is contained in:
Varylios 2025-08-26 13:03:22 +02:00
parent 64565eab8b
commit 02ea306ff1
5 changed files with 46 additions and 169 deletions

View file

@ -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()

View file

@ -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()

View file

@ -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"]

View file

@ -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)

View file

@ -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