From 58f7a7c48e92e8cefb6acc1a1edc9a5bf021d2e9 Mon Sep 17 00:00:00 2001 From: Daydreel Date: Wed, 27 Aug 2025 13:27:32 +0200 Subject: [PATCH] GUI building tower --- Globals/EventBus.gd | 9 +++-- Levels/world.tscn | 7 ++-- Scripts/PlayerManager.gd | 44 +++++++++++++++++++++-- Tests/test_enviroment.gd | 1 + Tests/test_enviroment.gd.uid | 1 + Tests/test_enviroment.tscn | 67 ++---------------------------------- Tiles/tile.gd | 2 ++ Tiles/tile.gd.uid | 1 + Tiles/tile.tscn | 4 ++- Towers/pierre.gd | 2 ++ Towers/pierre.gd.uid | 1 + Towers/pierre.tscn | 18 ++++++++++ Towers/tower.gd | 12 ++++++- Towers/tower.tscn | 5 +++ UI/gui.gd | 24 +++++++++++++ UI/gui.tscn | 3 ++ 16 files changed, 127 insertions(+), 74 deletions(-) create mode 100644 Tests/test_enviroment.gd create mode 100644 Tests/test_enviroment.gd.uid create mode 100644 Tiles/tile.gd create mode 100644 Tiles/tile.gd.uid create mode 100644 Towers/pierre.gd create mode 100644 Towers/pierre.gd.uid create mode 100644 Towers/pierre.tscn diff --git a/Globals/EventBus.gd b/Globals/EventBus.gd index 5eb5c09..f529a16 100644 --- a/Globals/EventBus.gd +++ b/Globals/EventBus.gd @@ -6,10 +6,13 @@ extends Node signal tower_selected(tower : PackedScene) -#Emitter : World.gd -#Subscriber : HeroIcon.gd -signal tower_builded(tower : PackedScene) +#Emitter : +#Subscriber : +signal tower_builded(tower : Tower) +#Emitter : gui.gd +#Subscriber : PlayerManager.gd +signal tower_to_build(packed_tower : PackedScene) #Emitter : UpgradeButton.gd #Subscriber : tower.gd diff --git a/Levels/world.tscn b/Levels/world.tscn index 96f4e4e..9ed880e 100644 --- a/Levels/world.tscn +++ b/Levels/world.tscn @@ -9,10 +9,10 @@ [ext_resource type="PackedScene" uid="uid://dpjfo15otkfru" path="res://Tiles/cube.tscn" id="5_wse8f"] [ext_resource type="Script" uid="uid://chu8s12rtdeqx" path="res://Scripts/Wave.gd" id="6_gbfbk"] [ext_resource type="Resource" uid="uid://dkbuy7fetnihs" path="res://Waves/wave_1.tres" id="7_ioo17"] -[ext_resource type="PackedScene" uid="uid://djyye2otjju2d" path="res://game_menu.tscn" id="9_44brb"] [ext_resource type="Script" uid="uid://blxx3vs2wnfet" path="res://Scripts/Troop.gd" id="10_oyb16"] [ext_resource type="PackedScene" uid="uid://dknt1oiyei5e5" path="res://enemies/enemy-a.tscn" id="11_43wwi"] [ext_resource type="PackedScene" uid="uid://c54881eookjth" path="res://Assets/Meshes/SM_B26.glb" id="12_44brb"] +[ext_resource type="PackedScene" uid="uid://p6a6rb7sgeqd" path="res://UI/gui.tscn" id="12_ikoig"] [ext_resource type="Script" uid="uid://xkk2pxkrwsq8" path="res://bullet_container.gd" id="12_k3n1d"] [ext_resource type="PackedScene" uid="uid://dxeb1kk5ieix2" path="res://Assets/Meshes/SM_MiniHouse.glb" id="13_ju8gl"] [ext_resource type="PackedScene" uid="uid://3u5ds5imu6d7" path="res://Assets/Meshes/SM_Minoterie.glb" id="14_4eob5"] @@ -210,8 +210,7 @@ light_energy = 0.0 [node name="CanvasLayer" type="CanvasLayer" parent="."] -[node name="GameMenu" parent="CanvasLayer" instance=ExtResource("9_44brb")] -visible = false +[node name="GUI" parent="CanvasLayer" instance=ExtResource("12_ikoig")] [node name="BulletContainer" type="Node3D" parent="."] script = ExtResource("12_k3n1d") @@ -237,3 +236,5 @@ transform = Transform3D(1.08365, 0, 1.68098, 0, 2, 0, -1.68098, 0, 1.08365, 1.44 [connection signal="timeout" from="WaveManager/WaveTimer" to="WaveManager" method="_on_wave_timer_timeout"] [connection signal="timeout" from="WaveManager/TroopTimer" to="WaveManager" method="_on_troop_timer_timeout"] + +[editable path="PlayerManager"] diff --git a/Scripts/PlayerManager.gd b/Scripts/PlayerManager.gd index a8796a3..cd87214 100644 --- a/Scripts/PlayerManager.gd +++ b/Scripts/PlayerManager.gd @@ -1,16 +1,19 @@ extends Node3D class_name PlayerManager - +enum STATE {IDLE,PLACING} +var _state = STATE.IDLE #TODO Get rid of tower_blueprint -@onready var tower_blueprint = preload("res://Towers/tower.tscn") +@onready var tower_blueprint : PackedScene @onready var selected_tower : Tower = null @onready var cam : Camera3D = $"../Camera3D" @onready var the_cube : TheCube = %TheCube +@onready var towers : Array[Tower] + var tower_count : int = 0: set(value): tower_count = value @@ -34,6 +37,7 @@ var selected_collider : CollisionObject3D func _ready() -> void: EventBus.tower_selected.connect(_on_EventBus_tower_selected) + EventBus.tower_to_build.connect(_on_EventBus_tower_to_build) func _process(delta: float) -> void: handle_player_controls() @@ -49,6 +53,9 @@ func _process(delta: float) -> void: EventBus.close_shop.emit() if Input.is_action_just_pressed("rest"): + if _state == STATE.PLACING: + quit_placing() + EventBus.close_shop.emit() if target_tower: send_to_rest() @@ -73,6 +80,7 @@ func handle_player_controls() -> void: selected_collider = collider visible = true + $"selection-a".visible = true global_position = collider.global_position global_position += Vector3(0.0,0.2,0.0) @@ -80,9 +88,33 @@ func handle_player_controls() -> void: target_tower = collider else: target_tower = null + + if _state == STATE.PLACING: + tower_to_place.sprite.modulate = "ff4545c8" #If the tower can't be placed he is red + $"selection-a".visible = false + if selected_collider is BuildTile: #if we are placing a tower, hide the selector model + tower_to_place.sprite.modulate = "61ff45c8" #If the tower can be placed he is green + + +var tower_to_place : Tower #It is freed in the build_tower() +func place_tower() -> void: + _state = STATE.PLACING + tower_to_place = tower_blueprint.instantiate() + add_child(tower_to_place) + tower_to_place.can_shoot = false + tower_to_place.collision_layer = 0 + tower_to_place.sprite.modulate = "ffffffc8" + tower_to_place.show_price_tag() + +func quit_placing() -> void: + _state = STATE.IDLE + tower_to_place.queue_free() # Refactoriser ce code func build_tower() -> void: + if tower_blueprint == null: + return + if !visible: return @@ -109,10 +141,14 @@ func build_tower() -> void: return else : #Can build + quit_placing() #Destroy the tower placeholder + EventBus.money_spent.emit(temp_tower.price) tower_count += 1 $"../Towers".add_child(temp_tower) EventBus.tower_builded.emit(temp_tower) + towers.append(temp_tower) + tower_blueprint == null selected_tower = temp_tower send_to_action() move_tower() @@ -146,3 +182,7 @@ func _on_EventBus_tower_selected(tower : PackedScene): func _on_cube_icon_pressed() -> void: pass #open_shop() + +func _on_EventBus_tower_to_build(packed_tower : PackedScene) -> void: + tower_blueprint = packed_tower + place_tower() diff --git a/Tests/test_enviroment.gd b/Tests/test_enviroment.gd new file mode 100644 index 0000000..67e954f --- /dev/null +++ b/Tests/test_enviroment.gd @@ -0,0 +1 @@ +extends Node3D diff --git a/Tests/test_enviroment.gd.uid b/Tests/test_enviroment.gd.uid new file mode 100644 index 0000000..a51d508 --- /dev/null +++ b/Tests/test_enviroment.gd.uid @@ -0,0 +1 @@ +uid://dcssahwfr5irf diff --git a/Tests/test_enviroment.tscn b/Tests/test_enviroment.tscn index 6db15e4..e807d77 100644 --- a/Tests/test_enviroment.tscn +++ b/Tests/test_enviroment.tscn @@ -1,67 +1,6 @@ -[gd_scene load_steps=15 format=3 uid="uid://ukt2r8vmpj00"] +[gd_scene load_steps=2 format=3 uid="uid://ukt2r8vmpj00"] -[ext_resource type="PackedScene" uid="uid://c6ceaa6x357bb" path="res://Assets/Meshes/SM_Cube.glb" id="1_bk1pw"] -[ext_resource type="PackedScene" uid="uid://c54881eookjth" path="res://Assets/Meshes/SM_B26.glb" id="2_r8lby"] -[ext_resource type="PackedScene" uid="uid://dxeb1kk5ieix2" path="res://Assets/Meshes/SM_MiniHouse.glb" id="3_0qotu"] -[ext_resource type="PackedScene" uid="uid://3u5ds5imu6d7" path="res://Assets/Meshes/SM_Minoterie.glb" id="4_twuly"] -[ext_resource type="PackedScene" uid="uid://trsvfgyds26p" path="res://Assets/Meshes/SM_Polyson.glb" id="5_d84uc"] -[ext_resource type="PackedScene" uid="uid://c8qg6bkxv643o" path="res://Assets/Meshes/SM_Studio24.glb" id="6_47v0e"] -[ext_resource type="PackedScene" uid="uid://do60hy3251c0m" path="res://Assets/Meshes/SM_TNP.glb" id="7_o4hcd"] -[ext_resource type="Shader" uid="uid://de7bad0qu56fl" path="res://Assets/Shaders/sky.gdshader" id="8_shjfl"] -[ext_resource type="Texture2D" uid="uid://drkxt6okkevle" path="res://Assets/Skybox/strange_night.jpg" id="9_fnc5e"] - -[sub_resource type="Curve" id="Curve_t3m1v"] -_data = [Vector2(0.119342, 0), 0.0, 0.0, 0, 0, Vector2(0.502058, 0.269663), 0.0, 0.0, 0, 0, Vector2(0.917696, 0), 0.0, 0.0, 0, 0] -point_count = 3 - -[sub_resource type="CurveTexture" id="CurveTexture_3jcr0"] -curve = SubResource("Curve_t3m1v") - -[sub_resource type="ShaderMaterial" id="ShaderMaterial_1yhx5"] -shader = ExtResource("8_shjfl") -shader_parameter/sky_tex = ExtResource("9_fnc5e") -shader_parameter/energy = 2.0 -shader_parameter/gamma = 1.5 -shader_parameter/tint_ramp = SubResource("CurveTexture_3jcr0") -shader_parameter/scale = Vector3(0.5, 0.5, 0.5) -shader_parameter/triplanar_blend_power = 20.0 -shader_parameter/seamless_blend = 0.1 - -[sub_resource type="Sky" id="Sky_ls68a"] -sky_material = SubResource("ShaderMaterial_1yhx5") - -[sub_resource type="Environment" id="Environment_8tkh1"] -background_mode = 2 -sky = SubResource("Sky_ls68a") -ambient_light_source = 3 +[ext_resource type="Script" uid="uid://dcssahwfr5irf" path="res://Tests/test_enviroment.gd" id="1_37o1p"] [node name="TestEnviroment" type="Node3D"] - -[node name="SM_Cube" parent="." instance=ExtResource("1_bk1pw")] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.364047, 0, 0.441566) - -[node name="SM_B26" parent="." instance=ExtResource("2_r8lby")] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.12279, 0, 0.850057) - -[node name="SM_MiniHouse" parent="." instance=ExtResource("3_0qotu")] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.181508, 0, 2.29622) - -[node name="SM_Minoterie" parent="." instance=ExtResource("4_twuly")] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.34223, 0, -0.243607) - -[node name="SM_Polyson" parent="." instance=ExtResource("5_d84uc")] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.64868, 0, -1.9913) - -[node name="SM_Studio24" parent="." instance=ExtResource("6_47v0e")] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.637257, 0, -2.4217) - -[node name="SM_TNP" parent="." instance=ExtResource("7_o4hcd")] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.95593, 0, -5.94892) - -[node name="WorldEnvironment" type="WorldEnvironment" parent="."] -environment = SubResource("Environment_8tkh1") - -[node name="DirectionalLight3D" type="DirectionalLight3D" parent="."] -transform = Transform3D(1, 0, 0, 0, 0.955505, 0.294974, 0, -0.294974, 0.955505, 0, 4.83978, 0) -light_color = Color(0.779275, 0.87651, 0.94841, 1) -light_energy = 2.0 +script = ExtResource("1_37o1p") diff --git a/Tiles/tile.gd b/Tiles/tile.gd new file mode 100644 index 0000000..d9cf5af --- /dev/null +++ b/Tiles/tile.gd @@ -0,0 +1,2 @@ +extends StaticBody3D +class_name BuildTile diff --git a/Tiles/tile.gd.uid b/Tiles/tile.gd.uid new file mode 100644 index 0000000..1432083 --- /dev/null +++ b/Tiles/tile.gd.uid @@ -0,0 +1 @@ +uid://ypfplijax7cd diff --git a/Tiles/tile.tscn b/Tiles/tile.tscn index 68a66a2..af9aa3c 100644 --- a/Tiles/tile.tscn +++ b/Tiles/tile.tscn @@ -1,5 +1,6 @@ -[gd_scene load_steps=3 format=3 uid="uid://d1f6m15niwgt"] +[gd_scene load_steps=4 format=3 uid="uid://d1f6m15niwgt"] +[ext_resource type="Script" uid="uid://ypfplijax7cd" path="res://Tiles/tile.gd" id="1_2ljfi"] [ext_resource type="PackedScene" uid="uid://p67ggbkjfwm1" path="res://Assets/GLB format/tile.glb" id="1_71op4"] [sub_resource type="ConcavePolygonShape3D" id="ConcavePolygonShape3D_71op4"] @@ -11,6 +12,7 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.5, 0, 0.5) [node name="tile2" parent="." instance=ExtResource("1_71op4")] [node name="StaticBody3D" type="StaticBody3D" parent="."] +script = ExtResource("1_2ljfi") [node name="CollisionShape3D" type="CollisionShape3D" parent="StaticBody3D"] shape = SubResource("ConcavePolygonShape3D_71op4") diff --git a/Towers/pierre.gd b/Towers/pierre.gd new file mode 100644 index 0000000..6ac640c --- /dev/null +++ b/Towers/pierre.gd @@ -0,0 +1,2 @@ +extends Tower +class_name Pierre diff --git a/Towers/pierre.gd.uid b/Towers/pierre.gd.uid new file mode 100644 index 0000000..8eb0835 --- /dev/null +++ b/Towers/pierre.gd.uid @@ -0,0 +1 @@ +uid://q4o384wv3ijj diff --git a/Towers/pierre.tscn b/Towers/pierre.tscn new file mode 100644 index 0000000..52382d3 --- /dev/null +++ b/Towers/pierre.tscn @@ -0,0 +1,18 @@ +[gd_scene load_steps=4 format=3 uid="uid://bj6srer7ghf7p"] + +[ext_resource type="PackedScene" uid="uid://trg7ag3dqr2l" path="res://Towers/tower.tscn" id="1_7f7qx"] +[ext_resource type="Script" uid="uid://q4o384wv3ijj" path="res://Towers/pierre.gd" id="1_v16mf"] +[ext_resource type="Script" uid="uid://bg0x4egeu17qb" path="res://Scripts/Upgrades/TowerUpgrade.gd" id="3_v16mf"] + +[node name="Pierre" instance=ExtResource("1_7f7qx")] +script = ExtResource("1_v16mf") +icone = null +bio = "" +bullet_damage = 1 +tower_shop = Array[ExtResource("3_v16mf")]([]) + +[node name="Sprite3D" parent="." index="6"] +modulate = Color(0.3795, 1, 0.27, 0.784314) + +[node name="EnergyBar3D" parent="." index="7"] +visible = true diff --git a/Towers/tower.gd b/Towers/tower.gd index ed4dbd4..b45bcb7 100644 --- a/Towers/tower.gd +++ b/Towers/tower.gd @@ -19,10 +19,10 @@ var bullet : PackedScene = preload("res://Bullets/bullet.tscn") @export var max_energy : float = 100.0: set(value): max_energy = value - energy_bar.set_max_value(max_energy) @export var energy_regen : float = 10.0 @export var energy_cost : float = 50.0 @onready var energy_bar : EnergyBar3D = $EnergyBar3D +@onready var sprite : Sprite3D = $Sprite3D var energy : float = max_energy: set(value): @@ -77,6 +77,7 @@ func apply_upgrade(upgrade : TowerUpgrade): func _ready() -> void: EventBus.tower_upgraded.connect(_on_EventBus_tower_upgraded) energy_bar.set_up(energy, max_energy) + energy_bar.set_max_value(max_energy) $Cooldown.wait_time = action_cooldown func _process(delta: float) -> void: @@ -131,6 +132,15 @@ func choose_target(_current_targets : Array) -> void: current = current_target +func show_price_tag()-> void: + $PriceTag.text = str(price) +" €" + visible = true + + +func hide_price_tag()-> void: + visible = false + + func _on_range_body_entered(body: Node3D) -> void: if body is Enemy: current_targets.append(body) diff --git a/Towers/tower.tscn b/Towers/tower.tscn index d4b27a5..ea4341e 100644 --- a/Towers/tower.tscn +++ b/Towers/tower.tscn @@ -57,6 +57,11 @@ frame = 75 [node name="EnergyBar3D" parent="." instance=ExtResource("3_pajr1")] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.44473, 0) +visible = false + +[node name="PriceTag" type="Label3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.06776, 0) +billboard = 2 [connection signal="input_event" from="." to="." method="_on_input_event"] [connection signal="body_entered" from="Range" to="." method="_on_range_body_entered"] diff --git a/UI/gui.gd b/UI/gui.gd index 86662c3..d2decc1 100644 --- a/UI/gui.gd +++ b/UI/gui.gd @@ -1,5 +1,29 @@ extends Control +@onready var player_manager : PlayerManager = $"../../PlayerManager" + +func _ready() -> void: + pass func _on_button_cube_pressed() -> void: pass # Replace with function body. + + +func _on_button_quit_level_pressed() -> void: + Transition.goto("res://UI/start_menu.tscn") + + +func _on_button_quit_game_pressed() -> void: + get_tree().quit() + + +func _on_button_pierre_pressed() -> void: + var can_build = true + for tower in player_manager.towers: + if tower is Pierre: + can_build = false + player_manager.selected_tower = tower #If can't build, tower is selected + + if can_build: #If Pierre is not builded then build it ! + print("can build !") + EventBus.tower_to_build.emit(load("res://Towers/pierre.tscn")) diff --git a/UI/gui.tscn b/UI/gui.tscn index a6f27db..f3d9bb3 100644 --- a/UI/gui.tscn +++ b/UI/gui.tscn @@ -331,3 +331,6 @@ layout_mode = 2 mouse_default_cursor_shape = 2 [connection signal="pressed" from="HBoxContainer/ControlPanelBase/MarginContainer/GridContainer/ButtonCube" to="." method="_on_button_cube_pressed"] +[connection signal="pressed" from="HBoxContainer/ControlPanelBase/MarginContainer/GridContainer/ButtonQuitLevel" to="." method="_on_button_quit_level_pressed"] +[connection signal="pressed" from="HBoxContainer/ControlPanelBase/MarginContainer/GridContainer/ButtonQuitGame" to="." method="_on_button_quit_game_pressed"] +[connection signal="pressed" from="HBoxContainer/ControlPanelBase/MarginContainer/GridContainer/ButtonPierre" to="." method="_on_button_pierre_pressed"]