From 6785e5ae8798a21d4b3e928021e000e6c14259a6 Mon Sep 17 00:00:00 2001 From: Varylios Date: Wed, 3 Sep 2025 20:52:14 +0200 Subject: [PATCH] wip: GUI for upgrade --- Globals/EventBus.gd | 21 +++--- Globals/Game.gd | 4 +- Tiles/cube.gd | 2 +- Towers/TowerManager.gd | 50 ++++++--------- UI/GameStyleBoxFlat.gd | 7 ++ UI/cube_integrity.gd | 9 --- UI/cube_integrity.gd.uid | 1 - UI/gui.gd | 20 +++++- UI/gui.tscn | 135 ++++++++++++++++++++++++++++++--------- UI/gui_button.gd | 3 +- 10 files changed, 163 insertions(+), 89 deletions(-) delete mode 100644 UI/cube_integrity.gd delete mode 100644 UI/cube_integrity.gd.uid diff --git a/Globals/EventBus.gd b/Globals/EventBus.gd index deac667..7d45a6c 100644 --- a/Globals/EventBus.gd +++ b/Globals/EventBus.gd @@ -18,8 +18,8 @@ signal tower_upgraded(towerType : Tower.TYPE, upgrade : TowerUpgrade) ## [b]Emitter[/b] : [TheCube][br] -## [b]Subscriber[/b] : cube_integrity.gd -signal cube_integrity_changed(_value : int, _max_value : int) +## [b]Subscriber[/b] : gui.gd +signal cube_integrity_changed(newHealth : int) ## [b]Emitter[/b] : [TheCube][br] @@ -41,10 +41,10 @@ signal tower_count_changed(count : int) ## [b]Subscriber[/b] : gui.gd signal team_in_action_changed(count : int) -## [b]Emitter[/b] : [TowerManager][br] -## [b]Subscriber[/b] : gui.gd, [TheCube] -signal team_in_rest_changed(count : int) +## [b]Emitter[/b] : [TowerManager][br] +## [b]Subscriber[/b] : gui.gd +signal team_in_rest_changed(count : int) ## [b]Emitter[/b] : [Projectile][br] @@ -61,30 +61,27 @@ signal money_received(amount : int) ## [b]Subscriber[/b] : [TheCube] signal money_spent(amount : int) + ## [b]Emitter[/b] : [WorldManager][br] ## [b]Subscriber[/b] : [TheCube] signal player_has_won() + ## [b]Emitter[/b] : [TheCube][br] ## [b]Subscriber[/b] : [WorldManager] signal player_defeated() -## [b]Emitter[/b] : [TowerManager][br] -## [b]Subscriber[/b] : [code]null[/code] -signal open_shop() - -## [b]Emitter[/b] : [TowerManager][br] -## [b]Subscriber[/b] : [code]null[/code] -signal close_shop() ## [b]Emitter[/b] : [Tower][br] ## [b]Subscriber[/b] : [GuiButton] signal energy_has_changed(tower : Tower) + ## [b]Emitter[/b] : [WorldManager], [Level][br] ## [b]Subscriber[/b] : gui.gd signal allowedTowerHasChange(allowedTowers : Array[Tower.TYPE]) + ## [b]Emitter[/b] : [WorldManager][br] ## [b]Subscriber[/b] : [code]null[/code] signal waveHasChange(waveNumber : int) diff --git a/Globals/Game.gd b/Globals/Game.gd index 6adad79..5f61677 100644 --- a/Globals/Game.gd +++ b/Globals/Game.gd @@ -5,13 +5,14 @@ class_name Game ## COLORS ## -enum COLOR { HEALTH, ENERGY, SELECTED, SECONDARY } +enum COLOR { HEALTH, ENERGY, SELECTED, SECONDARY, BACKGROUND_PANEL } const COLOR_HEALTH : Color = Color(0.921569, 0.419608, 0.415686, 1) const COLOR_ENERGY : Color = Color(0.921569, 0.890196, 0.415686, 1) const COLOR_SELECTED : Color = Color(0.721569, 0.600196, 0.355686, 1) const COLOR_SECONDARY : Color = Color(0.341, 0.082, 0.094, 0.0) +const COLOR_BACKGROUND_PANEL : Color = Color(0.933, 0.933, 0.933, 1) const COLOR_FALLBACK : Color = Color(0.341176, 0.0823529, 0.0941176, 0) @@ -21,6 +22,7 @@ static func getColor(color : COLOR) -> Color : COLOR.ENERGY : return COLOR_ENERGY COLOR.SELECTED : return COLOR_SELECTED COLOR.SECONDARY : return COLOR_SECONDARY + COLOR.BACKGROUND_PANEL : return COLOR_BACKGROUND_PANEL _: return COLOR_FALLBACK diff --git a/Tiles/cube.gd b/Tiles/cube.gd index 99b190b..a824906 100644 --- a/Tiles/cube.gd +++ b/Tiles/cube.gd @@ -6,7 +6,7 @@ class_name TheCube var health : int = max_health : set(value): health = value - EventBus.cube_integrity_changed.emit(health, max_health) + EventBus.cube_integrity_changed.emit(health) if health <= 0: death() diff --git a/Towers/TowerManager.gd b/Towers/TowerManager.gd index 7ef9310..e17ee29 100644 --- a/Towers/TowerManager.gd +++ b/Towers/TowerManager.gd @@ -5,15 +5,16 @@ class_name TowerManager enum STATE { IDLE, PLACING } var _state : int = STATE.IDLE -var selected_tower : Tower = null -var selected_tower_type : Tower.TYPE = Tower.TYPE.NONE -var the_cube : TheCube @onready var cam : Camera3D = $"../Camera3D" @onready var selection_icon : Sprite3D = $Sprite3DSelection + var towers : Dictionary var selected_collider : CollisionObject3D +var selected_tower : Tower = null +var the_cube : TheCube + func _ready() -> void: EventBus.tower_selected.connect(selectTower) @@ -26,18 +27,15 @@ func _process(_delta: float) -> void: if not selected_collider: return - if selected_collider.collision_layer == 1: + if selected_collider is Tower && selected_collider != selected_tower: + EventBus.tower_selected.emit(selected_collider.tower_type) + elif selected_collider.collision_layer == 1: build_tower() - if selected_collider is TheCube: - EventBus.open_shop.emit() - else: - EventBus.close_shop.emit() if Input.is_action_just_pressed("rest"): if _state == STATE.PLACING: quit_placing() - EventBus.close_shop.emit() if selected_collider is Tower: selected_collider.is_rest = true selected_collider.global_position = Vector3.ZERO @@ -72,14 +70,6 @@ func handle_player_controls() -> void: selected_tower.sprite.modulate = "61ff45c8" #If the tower can be placed he is green -func place_tower() -> void: - _state = STATE.PLACING - - selected_tower = Game.towers.get(selected_tower_type).instantiate() - towers.set(selected_tower_type, selected_tower) - selected_tower.collision_layer = 0 - add_child(selected_tower) - func quit_placing() -> void: _state = STATE.IDLE @@ -102,31 +92,27 @@ func build_tower() -> void: quit_placing() selected_tower.is_rest = false - move_tower() + selected_tower.global_position = global_position emitTeamChanges() -func selectTower(towerType : Tower.TYPE): +func selectTower(towerType: Tower.TYPE): + # Hide current not builded tower if selected_tower && not selected_tower.builded: selected_tower.visible = false - if towerType == selected_tower_type || towerType == Tower.TYPE.NONE: + _state = STATE.IDLE + if selected_tower && selected_tower.tower_type == towerType || towerType == Tower.TYPE.NONE: selected_tower = null - selected_tower_type = Tower.TYPE.NONE - _state = STATE.IDLE - return - - selected_tower_type = towerType - if towers.has(towerType): - _state = STATE.IDLE + elif towers.has(towerType): selected_tower = towers.get(towerType) selected_tower.visible = true else: - place_tower() - - -func move_tower(): - selected_tower.global_position = global_position + _state = STATE.PLACING + selected_tower = Game.towers.get(towerType).instantiate() + towers.set(towerType, selected_tower) + selected_tower.collision_layer = 0 + add_child(selected_tower) func emitTeamChanges() -> void: diff --git a/UI/GameStyleBoxFlat.gd b/UI/GameStyleBoxFlat.gd index bc1cb24..e727aa1 100644 --- a/UI/GameStyleBoxFlat.gd +++ b/UI/GameStyleBoxFlat.gd @@ -7,3 +7,10 @@ class_name GameStyleBoxFlat set(value): color = value bg_color = Game.getColor(color) + + +static func createWithColor(_color : Game.COLOR) -> GameStyleBoxFlat: + var instance : GameStyleBoxFlat = GameStyleBoxFlat.new() + instance.bg_color = Game.getColor(_color) + + return instance diff --git a/UI/cube_integrity.gd b/UI/cube_integrity.gd deleted file mode 100644 index e8f7766..0000000 --- a/UI/cube_integrity.gd +++ /dev/null @@ -1,9 +0,0 @@ -extends ProgressBar - -func _ready() -> void: - EventBus.cube_integrity_changed.connect(_on_EventBus_cube_integrity_changed) - value = 100 - - -func _on_EventBus_cube_integrity_changed(_value, _max_value) -> void: - set_value(float(_value)/float(_max_value) * 100.0) diff --git a/UI/cube_integrity.gd.uid b/UI/cube_integrity.gd.uid deleted file mode 100644 index c9014fb..0000000 --- a/UI/cube_integrity.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://dmcgoepvytnn diff --git a/UI/gui.gd b/UI/gui.gd index 6e47c54..e236ae6 100644 --- a/UI/gui.gd +++ b/UI/gui.gd @@ -1,7 +1,7 @@ @tool extends Control -const BUTTON_QTY = 12 +const BUTTON_QTY = 8 const guiButton : PackedScene = preload("res://UI/gui_button.tscn") @@ -9,27 +9,41 @@ const guiButton : PackedScene = preload("res://UI/gui_button.tscn") @onready var moneyLabel = %LabelMoney @onready var towerInCubeLabel = %LabelTowerInCube @onready var towerOnTerrainLabel = %LabelTowerOnTerrain +@onready var cubeIntegrity = %CubeIntegrity +var theCube : TheCube var allowedTowers : Array[Tower.TYPE] func _ready() -> void: addTowerButtonNodes() + EventBus.cube_ready.connect(cubeReady) EventBus.allowedTowerHasChange.connect(allowedTowerHasChange) EventBus.money_changed.connect(func(amount): moneyLabel.text = str(amount) + " €") EventBus.team_in_rest_changed.connect(func(count): towerInCubeLabel.text = str(count) + " x Zzz") EventBus.team_in_action_changed.connect(func(count): towerOnTerrainLabel.text = str(count) + " in action") + EventBus.cube_integrity_changed.connect(updateCubeLife) func _on_button_cube_pressed() -> void: pass # Replace with function body. -func _on_button_quit_level_pressed() -> void: +func cubeReady(cube: TheCube) -> void: + theCube = cube + cubeIntegrity.max_value = theCube.max_health + + + +func updateCubeLife(newHealth : int) -> void: + cubeIntegrity.value = float(newHealth) / float(theCube.max_health) * 100.0 + + +func quitLevel() -> void: Transition.goto("res://UI/start_menu.tscn") -func _on_button_quit_game_pressed() -> void: +func quitGame() -> void: get_tree().quit() diff --git a/UI/gui.tscn b/UI/gui.tscn index f7007f3..aea1094 100644 --- a/UI/gui.tscn +++ b/UI/gui.tscn @@ -1,12 +1,13 @@ -[gd_scene load_steps=13 format=3 uid="uid://p6a6rb7sgeqd"] +[gd_scene load_steps=14 format=3 uid="uid://p6a6rb7sgeqd"] [ext_resource type="Script" uid="uid://bhylcok1l6eke" path="res://UI/gui.gd" id="2_sac4j"] -[ext_resource type="Script" uid="uid://dmcgoepvytnn" path="res://UI/cube_integrity.gd" id="2_sj6ny"] +[ext_resource type="Script" uid="uid://blnmjxmusrsa7" path="res://UI/GameStyleBoxFlat.gd" id="4_h4fn5"] [ext_resource type="Theme" uid="uid://bbp4qcbwkeg7x" path="res://default_theme.tres" id="5_wpcnu"] [ext_resource type="Texture2D" uid="uid://csl43eb7qjhe4" path="res://Assets/Icones/dog-house.svg" id="7_fffne"] [ext_resource type="PackedScene" uid="uid://dqb5o8w7u50hc" path="res://UI/gui_button.tscn" id="7_parkk"] [ext_resource type="Texture2D" uid="uid://dfnf26suc8yb6" path="res://Assets/Icones/sideswipe.svg" id="8_ay13l"] [ext_resource type="Texture2D" uid="uid://dootdihg7gkoj" path="res://Assets/Icones/exit-door.svg" id="8_decjp"] +[ext_resource type="Script" uid="uid://dyhtr6g7kd1g2" path="res://UI/gui_button.gd" id="9_h4fn5"] [ext_resource type="Texture2D" uid="uid://b4m5ejfdrm8s0" path="res://Assets/Icones/power-button.svg" id="9_reygo"] [sub_resource type="StyleBoxFlat" id="StyleBoxFlat_h4fn5"] @@ -20,7 +21,10 @@ border_color = Color(0.099986, 0.099986, 0.0999859, 1) bg_color = Color(0.727498, 0.222072, 0.249347, 1) [sub_resource type="StyleBoxFlat" id="StyleBoxFlat_3lugd"] -bg_color = Color(0.933333, 0.933333, 0.933333, 1) +bg_color = Color(0.933, 0.933, 0.933, 1) +script = ExtResource("4_h4fn5") +color = 4 +metadata/_custom_type_script = "uid://blnmjxmusrsa7" [node name="GUI" type="Control"] layout_mode = 3 @@ -40,24 +44,19 @@ anchor_left = 1.0 anchor_top = 1.0 anchor_right = 1.0 anchor_bottom = 1.0 -offset_left = -357.0 -offset_top = -352.0 +offset_left = -562.0 +offset_top = -268.0 grow_horizontal = 0 grow_vertical = 0 theme_override_constants/separation = 0 -[node name="InfoPanel" type="Panel" parent="HBoxContainer"] -custom_minimum_size = Vector2(189, 0) +[node name="InfoPanel" type="PanelContainer" parent="HBoxContainer"] +custom_minimum_size = Vector2(200, 0) layout_mode = 2 theme_override_styles/panel = SubResource("StyleBoxFlat_h4fn5") [node name="MarginContainer" type="MarginContainer" parent="HBoxContainer/InfoPanel"] -layout_mode = 1 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 +layout_mode = 2 theme_override_constants/margin_left = 10 theme_override_constants/margin_top = 10 theme_override_constants/margin_right = 10 @@ -96,6 +95,7 @@ text = "0" horizontal_alignment = 2 [node name="CubeIntegrity" type="ProgressBar" parent="HBoxContainer"] +unique_name_in_owner = true custom_minimum_size = Vector2(10, 5) layout_mode = 2 size_flags_vertical = 1 @@ -105,25 +105,15 @@ theme_override_styles/fill = SubResource("StyleBoxFlat_epgl5") value = 50.0 fill_mode = 3 show_percentage = false -script = ExtResource("2_sj6ny") -[node name="ControlPanelBase" type="Panel" parent="HBoxContainer"] -custom_minimum_size = Vector2(352, 352) +[node name="ControlPanelBase" type="PanelContainer" parent="HBoxContainer"] layout_mode = 2 -theme = ExtResource("5_wpcnu") +size_flags_horizontal = 3 +size_flags_vertical = 8 theme_override_styles/panel = SubResource("StyleBoxFlat_3lugd") [node name="MarginContainer" type="MarginContainer" parent="HBoxContainer/ControlPanelBase"] -layout_mode = 1 -anchors_preset = 3 -anchor_left = 1.0 -anchor_top = 1.0 -anchor_right = 1.0 -anchor_bottom = 1.0 -offset_left = -352.0 -offset_top = -352.0 -grow_horizontal = 0 -grow_vertical = 0 +layout_mode = 2 theme_override_constants/margin_left = 10 theme_override_constants/margin_top = 10 theme_override_constants/margin_right = 10 @@ -132,6 +122,8 @@ theme_override_constants/margin_bottom = 10 [node name="ButtonContainer" type="GridContainer" parent="HBoxContainer/ControlPanelBase/MarginContainer"] unique_name_in_owner = true layout_mode = 2 +size_flags_horizontal = 0 +size_flags_vertical = 0 columns = 4 [node name="CubeBtn" parent="HBoxContainer/ControlPanelBase/MarginContainer/ButtonContainer" instance=ExtResource("7_parkk")] @@ -150,6 +142,91 @@ texture = ExtResource("9_reygo") layout_mode = 2 texture = ExtResource("8_ay13l") +[node name="TowerInfoPanel" type="HBoxContainer" parent="."] +visible = false +layout_mode = 1 +anchors_preset = 2 +anchor_top = 1.0 +anchor_bottom = 1.0 +offset_top = -268.0 +offset_right = 552.0 +grow_vertical = 0 +theme_override_constants/separation = 0 + +[node name="InfoPanel" type="PanelContainer" parent="TowerInfoPanel"] +custom_minimum_size = Vector2(200, 0) +layout_mode = 2 +theme_override_styles/panel = SubResource("StyleBoxFlat_h4fn5") + +[node name="MarginContainer" type="MarginContainer" parent="TowerInfoPanel/InfoPanel"] +layout_mode = 2 +theme_override_constants/margin_left = 10 +theme_override_constants/margin_top = 10 +theme_override_constants/margin_right = 10 +theme_override_constants/margin_bottom = 10 + +[node name="VBoxContainer" type="VBoxContainer" parent="TowerInfoPanel/InfoPanel/MarginContainer"] +layout_mode = 2 + +[node name="LabelMoney" type="Label" parent="TowerInfoPanel/InfoPanel/MarginContainer/VBoxContainer"] +layout_mode = 2 +size_flags_vertical = 1 +tooltip_text = "La thune." +mouse_filter = 1 +theme_override_colors/font_color = Color(0.2, 0.2, 0.2, 1) +text = "1'000'000 €" +horizontal_alignment = 2 +vertical_alignment = 2 + +[node name="LabelTowerInCube" type="Label" parent="TowerInfoPanel/InfoPanel/MarginContainer/VBoxContainer"] +layout_mode = 2 +tooltip_text = "Le nombre de héros disponible dans le cube !" +mouse_filter = 1 +theme_override_colors/font_color = Color(0.2, 0.2, 0.2, 1) +text = "0" +horizontal_alignment = 2 + +[node name="LabelTowerOnTerrain" type="Label" parent="TowerInfoPanel/InfoPanel/MarginContainer/VBoxContainer"] +layout_mode = 2 +tooltip_text = "Le nombre de héros en action sur le terrain !" +mouse_filter = 1 +theme_override_colors/font_color = Color(0.2, 0.2, 0.2, 1) +text = "0" +horizontal_alignment = 2 + +[node name="TowerInfoPanel" type="PanelContainer" parent="TowerInfoPanel"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 8 +theme_override_styles/panel = SubResource("StyleBoxFlat_3lugd") + +[node name="MarginContainer" type="MarginContainer" parent="TowerInfoPanel/TowerInfoPanel"] +layout_mode = 2 +theme_override_constants/margin_left = 10 +theme_override_constants/margin_top = 10 +theme_override_constants/margin_right = 10 +theme_override_constants/margin_bottom = 10 + +[node name="ButtonContainer" type="GridContainer" parent="TowerInfoPanel/TowerInfoPanel/MarginContainer"] +layout_mode = 2 +size_flags_horizontal = 0 +size_flags_vertical = 0 +columns = 4 + +[node name="Button" type="Button" parent="TowerInfoPanel/TowerInfoPanel/MarginContainer/ButtonContainer"] +layout_mode = 2 +theme_override_font_sizes/font_size = 20 +text = "Améliorer" +script = ExtResource("9_h4fn5") +metadata/_custom_type_script = "uid://dyhtr6g7kd1g2" + [connection signal="pressed" from="HBoxContainer/ControlPanelBase/MarginContainer/ButtonContainer/CubeBtn" to="." method="_on_button_cube_pressed"] -[connection signal="pressed" from="HBoxContainer/ControlPanelBase/MarginContainer/ButtonContainer/QuitLevelBtn" to="." method="_on_button_quit_level_pressed"] -[connection signal="pressed" from="HBoxContainer/ControlPanelBase/MarginContainer/ButtonContainer/QuitGameBtn" to="." method="_on_button_quit_game_pressed"] +[connection signal="pressed" from="HBoxContainer/ControlPanelBase/MarginContainer/ButtonContainer/QuitLevelBtn" to="." method="quitLevel"] +[connection signal="pressed" from="HBoxContainer/ControlPanelBase/MarginContainer/ButtonContainer/QuitGameBtn" to="." method="quitGame"] +[connection signal="toggled" from="HBoxContainer/ControlPanelBase/MarginContainer/ButtonContainer/TowerButton" to="HBoxContainer/ControlPanelBase/MarginContainer/ButtonContainer/TowerButton" method="buttonToggled"] +[connection signal="toggled" from="HBoxContainer/ControlPanelBase/MarginContainer/ButtonContainer/@Button@65726" to="HBoxContainer/ControlPanelBase/MarginContainer/ButtonContainer/@Button@65726" method="buttonToggled"] +[connection signal="toggled" from="HBoxContainer/ControlPanelBase/MarginContainer/ButtonContainer/@Button@65727" to="HBoxContainer/ControlPanelBase/MarginContainer/ButtonContainer/@Button@65727" method="buttonToggled"] +[connection signal="toggled" from="HBoxContainer/ControlPanelBase/MarginContainer/ButtonContainer/@Button@65728" to="HBoxContainer/ControlPanelBase/MarginContainer/ButtonContainer/@Button@65728" method="buttonToggled"] +[connection signal="toggled" from="HBoxContainer/ControlPanelBase/MarginContainer/ButtonContainer/@Button@65729" to="HBoxContainer/ControlPanelBase/MarginContainer/ButtonContainer/@Button@65729" method="buttonToggled"] +[connection signal="toggled" from="HBoxContainer/ControlPanelBase/MarginContainer/ButtonContainer/@Button@65730" to="HBoxContainer/ControlPanelBase/MarginContainer/ButtonContainer/@Button@65730" method="buttonToggled"] +[connection signal="toggled" from="HBoxContainer/ControlPanelBase/MarginContainer/ButtonContainer/@Button@65731" to="HBoxContainer/ControlPanelBase/MarginContainer/ButtonContainer/@Button@65731" method="buttonToggled"] diff --git a/UI/gui_button.gd b/UI/gui_button.gd index b96e5ec..eb1b285 100644 --- a/UI/gui_button.gd +++ b/UI/gui_button.gd @@ -16,9 +16,10 @@ var towerType : Tower.TYPE : type = TYPE.TOWER toggle_mode = true $EnergyBar.visible = true + add_theme_stylebox_override("pressed", GameStyleBoxFlat.createWithColor(Game.COLOR.SELECTED)) EventBus.energy_has_changed.connect(towerChanged) EventBus.tower_builded.connect(towerChanged) - EventBus.tower_selected.connect(func(type): set_pressed_no_signal(type == towerType)) + EventBus.tower_selected.connect(func(_type): set_pressed_no_signal(_type == towerType)) @export var texture : Texture2D :