GUI building tower

This commit is contained in:
Daydreel 2025-08-27 13:27:32 +02:00
parent 5b994b91d1
commit 58f7a7c48e
16 changed files with 127 additions and 74 deletions

View file

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

View file

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

View file

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

1
Tests/test_enviroment.gd Normal file
View file

@ -0,0 +1 @@
extends Node3D

View file

@ -0,0 +1 @@
uid://dcssahwfr5irf

View file

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

2
Tiles/tile.gd Normal file
View file

@ -0,0 +1,2 @@
extends StaticBody3D
class_name BuildTile

1
Tiles/tile.gd.uid Normal file
View file

@ -0,0 +1 @@
uid://ypfplijax7cd

View file

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

2
Towers/pierre.gd Normal file
View file

@ -0,0 +1,2 @@
extends Tower
class_name Pierre

1
Towers/pierre.gd.uid Normal file
View file

@ -0,0 +1 @@
uid://q4o384wv3ijj

18
Towers/pierre.tscn Normal file
View file

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

View file

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

View file

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

View file

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

View file

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