From ef089926735d84cabc67a24c72d9469868c4c765 Mon Sep 17 00:00:00 2001 From: Varylios Date: Sat, 13 Sep 2025 16:35:20 +0200 Subject: [PATCH] chore: improve UX + tower hitbox - add tower hitbox - change selector icons - Cube selectable on map --- Assets/Icones/IconsFlat-32.png | Bin 0 -> 6650 bytes Assets/Icones/IconsFlat-32.png.import | 34 +++++++++++++++++++++++ Globals/EventBus.gd | 4 +-- Globals/Helper.gd | 15 +++++++++++ Levels/world_manager.tscn | 18 ++++++------- Towers/TowerManager.gd | 34 ++++++++++++++++------- Towers/tower.tscn | 8 +++++- UI/gui.gd | 37 +++++++++++++------------- UI/gui.tscn | 12 ++++++--- UI/gui_button.gd | 1 + Upgrades/Upgrade.gd | 2 +- 11 files changed, 119 insertions(+), 46 deletions(-) create mode 100644 Assets/Icones/IconsFlat-32.png create mode 100644 Assets/Icones/IconsFlat-32.png.import diff --git a/Assets/Icones/IconsFlat-32.png b/Assets/Icones/IconsFlat-32.png new file mode 100644 index 0000000000000000000000000000000000000000..63877b1b00ff8d5d0037793152ac7a4d9844af4f GIT binary patch literal 6650 zcmZ8l2|UyP|KA*85;;UOLD(bm?O#Z;vQQOQBl%Vtm4Jh3iL%h!AUpU+lPj6?r;tn7MDF7;6PsbTvj zlIAzaf`dswfc4tj6S;&&9-fow(i&R58QENMo=l9gR!x#xv1R4Ld(91Dl$g|XO z%%Oc(#m(W3U0pIgo`Va0PqBg{X8U{6F}b`d)fd0L-#B~tfU!|cb0Y)rh_?(`AXTSj zVgB$vZ99&5lwtt@=yV${=H&N;T3Mj46lv@4VYvW72KNxspR9^BOBrk$mR-X>S-+w` zz87%SeDmA6q_xfKhy0$HqXAW?v7o9qI|WmXx^HG}RZ&snYaQ~$4Ja-cHGTzM9)zEs zf4zj9Ot@rvc5Ziwv?jfD54#yA*cYmB4KSSfhC_MluEo^%%DKX4x?|#vf$YF>WnXMy zk1UZW&D|C3-ce?rBKGEU4PPX-9qEG0CHoG|7ix%5`ub{RG^HyTUWlGg9i-_(WCxyV zLe6K!LQrfp2seZ14|<&lvb?g`_Vs>G?0iBO`k+5d=D{_*0rV#6XC z2KsRFrn^V@)o#1JyD$!GIhk1NpT+(*QJ|kC&^<4@n&<{^OwwMl%p|<*=$xIDz^o(0 z>PFMnORXEC#{hQ|LdCZ7*FnUkLmg#pV?N~Q+V2tOW!1U$VA}e0O8_4Zd$VK zKU0;;NK<<6ShzwzV+A1A;}rvQM*+&oV7Tqk@r#7~xeEHt=^DM-W$EAqq$k9HD7 z@3q{BMK*&eG{&_0ZbO;xIR{$Z<=u%uLl%Z^SV!jWZ457WX`I14lyx-dFROM|8^&!b zRXCM9a33grI`+>m&L#pv%$g*4#~@*d5Z_1~19L-8@d6qJFJKxAt&v5P0gp1}+}pKC z3fQGDDbVARg7u$(;}+lRM#bwRe6d5x1r9pD;|2-oQvp&?M(KTcpL{GUPk+FT6DqfR z*EoAxls*Yr?J1B14+s1Ip3C{w?R?1DMnGe;H89fGOZ(x#r~CGPV{p1fJtL)7NkW^6 z>)Pg2z5=^I;3Y+n3MfXniSYgLdrhqHIw>o4HKF3WZ@>;4jqf-_J06xD)!?b|qnZ;{ z+jkXaQYD50UF9;}wJ{MEat~o))7pQ_^-;qCC)vcXmx2Z9RN>_q8OA-CP=5Vaw9-ye1XTz-=#_!O?FgN^`7UgL_Zpby01KZg)m_7DguwqqJGnikbX0D9* zk+(x`Xd?OeN{ZDZAYd!AR`NVy3}onR(ATXS@uNIBq_+?7Oi>#{`!TWM%{tD4-S^vW-MA(QfwUH zg+|#;#taPou0gb6#%_47clR}nY)s;oBBatCjSw4K!=#YH2%1-}QP!hEmuI-sI*PPb-$4c1iTUA#7dBeMax%PR z#!3f#{scDi@B&hdjDQ~Gb$7)t-@PUG$sLxES3h@Pt>dmt9yL4--xRnCrYgTzJ@-C6 zkNWxVp3Vg*=w>ejRWEL1p7H=F!u*#~u4M=>jrb)OXr_sG4uBZ{IW^ zAfC0t9hIw7f2-WRI1G)?maWqoOAm7!ZY8YNPt5s=nrGx0LiH|m>F8UB(_BKsJ58sG7PR<76m7?V`@ zVeTSn*Lz6*#fTBUP|UFtHA@Dv0&?l%_TAc6SsC5aEiXaqZ_Mr+#^SZ;+Y3#z^UBCY zD+b#WFxkG))&V#myH>sM+EH7TzU_7#`W&Mn-&0=j(W53!c#q9=wu&M}Eeiu!9x`e@ z-AS}ib`P;0?l;n3x#o-cGUC=ct`Zo*u1S~~y84geD|3j@v9uBB?GiMrEPAXS=RgHq zYEyejx#N?{)+_osl<|!)!5O(~AI0cQ0akFu#Q;3Wl>RazNb@55_sEXGLGXwL6SZ(7-R(#*ec@ED!s_HshjXai5l>xm! zCxS`hJZlkN$=^LLH|N4$Q&u#uALb6#g%@X4aCwgMJlE+PLS{G~V^_%y8K*%Qp`S+` zK{Tpyd~TjF}P}95SSFdmtC=7 z{Uw9{N+ZhTnclcI26?8}zuemq!GN`EJfpq|Ix3bA1VC&=e|X7sl-mABof2CB^E2CmvPWzH^e8lvV1H(}Eh#D51q+k_WZAJxI&$Pb|M`Jot%=@Y7hciT;GVqj!OAqX% zE-vujm8)T|Vr&dFph}1^~n$ z{^-uK{ZZ2nh=V78iE4cZ7k#&HxfXVLWTe-%6xqCXtn+#4hAM76Kujd|%Zi35yN+)> zh^$fd5bdE%x@VQ2KD#5_)^+lE8J8#B$un)EU5Iti78dB5BfhoCch)D472tU|78?0E z(;fZ%Uc#?l&&V4f7uU!;a4*$}*IdDPVV|@C*o9F8QietqD(S{_0S1FOsMl=bXZ^Wa zGOS+;Ne64e!^W)SX3ey$c2E9F8hD#;fw}b0xIRrR zHa?=f2LZ6iaHP;I7qk&Ak`Y@dvoUYab?=Ao@Gbu4k0;2gY~x{kG!Mdes^x@0obk<$ zo3@GO)9+g{N)#IW+ z4|a9E)FNdXp1q}a3;g94QIVL&8kEiCP^wt)p#ecG-q!!M1)a3j*RvAbiwaeZD^Rs1 z>{ijW5H`q%Z#QW`))CA=fz#p9`yiR}P4@G-19FE~FY`Wa{cFQR!PlZW+N`7SYd)>XtDT=7X!<#6XT(A7XRcmt zkg51}ozw?zFLk^&0%0dtHi^?JT*SxoSDDdInjdwsR=lZlzgg6r3g4&{gBmC15fS+TRawe(0^h&9mv4Jy zuG*!HkX0!XvhR@gL?bhFvo+y7#wb&qdS!z*+n{Dn^ip+!zW>B4sF&;CaFe&K9UBlso+u4l+0@^Jnes zC}ALn8ZsZaeEy{A1$6#2yDxZ%MAs?k82b9v7#Y!@1mW%V`JQ@EH*&qTNj!I!b#5K` zYr@m`Qi*qSe_Wg4sp9CtRBC!7DndqK$RBJmbKq7#H~kay>K8x=7?PHX7%jMVMM@v*ayEFabyFIqQ9wX z%%?(YXI+wv%Gz?ny*C1`*}G(}`cO|aUOE!UxQ^6IvR@XWyA)E%bChr_QW2E3F z(xgwsA$B>o=N$7a3I9i4L1!pL1QYt|&rHV)U$kyyiNZS|Rewm{oG-Cu{nP%Vd%eUZ zcFi=W@xA|gX{YfBB5tM2rS?3iN*gSXym-9(t?N$K_A9oPQAR{5(*&^3-{CM%Nh?$j z$P#y7l9K3`KvPQ0AgX_EfjixaNbcSK1lfV}B6pb-|L?eO{8dRl(ca2ZE!{xv5M}O8 z+g$D-;Y2X(%I>WFPftrC)xsJEyMBMKuu5xh_*PXnTaESfXRCGFh|QFdl|^o03zL@n zc)eD|mNckXD*~ynK6idF1w3T#kDRc7xWGeVC(?~+9y*1JS3A8XHeQ_1;oeSrz~K14 zU0?mYIM4dH+g}v=ftH(yOC3<8HPljj7hfm*l$f8n4X;_>4j$-k&tylN16np9F5Qf` z$PU5BPiNn#JulWA0WbA#A1I}fa9G35!c9V(3Y&6qpzxt1su=iq`Mg@uZcdckw(9-l z%yF2r-+%dN@%$rq?7k!qzL^bONJJRXH|oqoDno`6KqW|z3$hw%jgX*d&cg;eKTXCZ zi=AR_rtq_SdnPg0eKpZ1Kkg#HF|JZhGm@Cj@P1->r<8RtMdVJaO{ZcO13$}=o5-G zy;K%nwa3jm2K}84QYpH8TyDN1$}b;D$q{Nsd3heFV8H44dAY+8>3CIrdLmV~@=Rkq z^MwD!#*a*mtW_>dUj9W+nA*#roQPpq^aq@_gnqit(v?^$CXpZ=MVAX(^!%9^6`Q2% zwZ1e)nE(79v>z~f-W8@!sdOGhbxtr&lL)o12Z9pPEZTv!Nt2_dqp|k1$HRUKYS^X) zO>*z9Va-}#)$;aW8RteN4_heW>zYD6^NdF?ZJA=DtS;--h!lS<3c^$Bx^53_+WeDO z-W^_FYbnXD{h4^svU<{QaDPgfnk~X&owNdeM7p^}!~eAUW;PqMP6!nX$y}YUur{RC zg$iNIjz&Ajm|DCYPZ#KJ=9!ujt{Tue zNF-E{g1f4;oj2GuQ#2`9-!S{)FF7f{0VIDMXp}JbziIJgdr(-tyK$nyXZ^fT*w9M3 zJtBVam$4FVZ^Q7F-)ZAeM+hGnTyCry9shT7c`3kI;C*^7EYb@ZV`l|&`B7HZ|2;(^ zR#}vQq?~#37XeC2*Y0Jc)QxnXg3ui7o+)?8g@+!n!Ypv-=JT>~lp%KPm)UL2M2jeR zQMR~sk$M{JVL!&GOq<3R%65heBid+XuDSJGDr00U1bXH}>2k#PoI-B?OjR zjOp})RE?Hee(4t_3#8}9&aSZMoCGZ|Voc0RN{Vn12&K!pjvqW$W4mBm!(m!ovs;F5 zr|L1HH~+FP)AM`k*BfVR_I1|g>Ym_HEgIj~JAWkOkF!LUtl@z7hoPLnopvNzX}=UZ zW5q=P7z}k59o5@o{quXvJ^h&w$f*BMvnUr49g4#Sr^bH@=ncn?jp3Yob6;m=iN6@V zI*xek8&NOxk_+}W`5t!E>aD|<75K~o)AjssbMaNll_WJkWNVeVa{1${CxHWa@vN-C z@#>`rSNk4OY?|!EyP&bV^s?znDlJ@yu~W^$tjk-T*^0p)-!UwgN`;=!4Q}s;(Jqlp zkKkL8t^tYkQGysQ-Ai?!3>zEZl@e#+)V*0##{)_~4DGpGreaUoNXd4{-+93}jQ8A! z-p9&LfQuhAINX%OhT3bgO(K%uHiw4uby@%DC6h+GmFa`il?JmP*;*wn zISPGoNY?FS*StN~-4E?f=%VtXNXeiky)L*=0cTs%Jg_exka zuT*%c3488+T)MO~0K-^5@aOzyr*=x@tH)#p-vgaxAO|4C#uNw+YX2z})?TQ>++3C^Vfo7fIsnartSxePUd zo_!Lc_~DzWcG9$03o=wJ!0QwdfUvk~L9b&j!_8WTJ=S*wyH3%uhX`32tlviZrh1jS HPEr2{cj(l8 literal 0 HcmV?d00001 diff --git a/Assets/Icones/IconsFlat-32.png.import b/Assets/Icones/IconsFlat-32.png.import new file mode 100644 index 0000000..7dec384 --- /dev/null +++ b/Assets/Icones/IconsFlat-32.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://7v37noapccnc" +path="res://.godot/imported/IconsFlat-32.png-cbb60368a49eb8516061cb2084e62d5b.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Assets/Icones/IconsFlat-32.png" +dest_files=["res://.godot/imported/IconsFlat-32.png-cbb60368a49eb8516061cb2084e62d5b.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/Globals/EventBus.gd b/Globals/EventBus.gd index 8332af6..9b81764 100644 --- a/Globals/EventBus.gd +++ b/Globals/EventBus.gd @@ -2,8 +2,8 @@ extends Node @warning_ignore_start("unused_signal") -## [b]Emitter[/b] : [param gui.gd], [br] -## [b]Subscriber[/b] : [TowerManager] +## [b]Emitter[/b] : [param gui.gd], [TowerManager][br] +## [b]Subscriber[/b] : [param InfoPanel.gd], [GuiButton], [param gui.gd] signal cube_selected diff --git a/Globals/Helper.gd b/Globals/Helper.gd index 9fa04b8..89d82d2 100644 --- a/Globals/Helper.gd +++ b/Globals/Helper.gd @@ -80,3 +80,18 @@ static func showConfirmPopup( confirmPopup.label.text = text confirmPopup.confirmed.connect(confirmCallback) confirmPopup.canceled.connect(cancelCallback) + + +static func getTopOfHitBox(body : CollisionObject3D) -> float: + if body is GameTile: + return .2 + + if body.has_node("CollisionShape3D"): + var shape : Shape3D = body.shape_owner_get_shape(0, 0) + var transform : Transform3D = body.shape_owner_get_transform(0) + if shape is CapsuleShape3D: + return shape.height + shape.radius + transform.origin.y + if shape is SphereShape3D: + return shape.radius + transform.origin.y + + return 0 diff --git a/Levels/world_manager.tscn b/Levels/world_manager.tscn index 093e526..48802e2 100644 --- a/Levels/world_manager.tscn +++ b/Levels/world_manager.tscn @@ -3,7 +3,6 @@ [ext_resource type="Script" uid="uid://qqid42jkpkmv" path="res://Levels/Scripts/WorldManager.gd" id="1_tk0a6"] [ext_resource type="Script" uid="uid://caf3yamufmhd4" path="res://Towers/TowerManager.gd" id="2_7pixp"] [ext_resource type="Script" uid="uid://wdyg06i1eb6b" path="res://Levels/Scripts/Camera.gd" id="2_c1rgm"] -[ext_resource type="Texture2D" uid="uid://o83munu8dibp" path="res://Assets/Icones/kenney_game_icons_vector.svg" id="3_6dp1o"] [ext_resource type="PackedScene" uid="uid://p6a6rb7sgeqd" path="res://UI/gui.tscn" id="6_ebgat"] [ext_resource type="AudioStream" uid="uid://bdcq7jxg08sih" path="res://Assets/Audio/SFX/Voiceover/final_round.ogg" id="6_ul70d"] [ext_resource type="AudioStream" uid="uid://c3x3krwcm4bbu" path="res://Assets/Audio/SFX/Voiceover/prepare_yourself.ogg" id="7_6yqi7"] @@ -15,6 +14,9 @@ _limits = [-70.0, -20.0, 2.0, 10.0] _data = [Vector2(2, -20), 0.0, -12.5, 0, 1, Vector2(6, -70), 0.0, 0.0, 0, 0, Vector2(10, -70), 0.0, 0.0, 1, 0] point_count = 3 +[sub_resource type="CompressedTexture2D" id="CompressedTexture2D_jh6jd"] +load_path = "res://.godot/imported/IconsFlat-32.png-cbb60368a49eb8516061cb2084e62d5b.ctex" + [sub_resource type="Animation" id="Animation_oyb16"] length = 0.001 tracks/0/type = "value" @@ -78,20 +80,18 @@ curve = SubResource("Curve_c1rgm") [node name="TowerManager" type="Node3D" parent="."] process_mode = 3 -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4.73017, 0.728414, 0) script = ExtResource("2_7pixp") [node name="Sprite3DSelection" type="Sprite3D" parent="TowerManager"] modulate = Color(0.966071, 0.695469, 0, 1) -pixel_size = 0.03 +pixel_size = 0.1 axis = 1 -billboard = 2 alpha_cut = 1 -texture = ExtResource("3_6dp1o") -hframes = 15 -vframes = 7 -frame = 44 -region_rect = Rect2(703, 96, 21, 30) +texture = SubResource("CompressedTexture2D_jh6jd") +hframes = 10 +vframes = 10 +frame = 5 +region_rect = Rect2(1925, 1925, 0, 0) [node name="AnimationPlayer" type="AnimationPlayer" parent="TowerManager"] libraries = { diff --git a/Towers/TowerManager.gd b/Towers/TowerManager.gd index a060cb4..d0670b0 100644 --- a/Towers/TowerManager.gd +++ b/Towers/TowerManager.gd @@ -27,15 +27,27 @@ func _process(_delta: float) -> void: var tower : Tower if collider is GameTile: tower = usedLocations.get(collider.global_position.round()) + selection_icon.frame = 5 + selection_icon.axis = Vector3.Axis.AXIS_Y + selection_icon.pixel_size = .03 + else: + selection_icon.frame = 68 + selection_icon.pixel_size = .02 if collider is Tower else .01 + selection_icon.axis = Vector3.Axis.AXIS_Z + if collider is Tower: + tower = collider if Input.is_action_just_pressed("build"): - if not collider is GameTile || tower == selected_tower: + if tower == selected_tower && selected_tower: return - if isTileFree(collider): + if isTileAndFree(collider): placeTower() elif tower: selectTower(tower.type) + elif collider is TheCube: + selected_tower = null + EventBus.cube_selected.emit() if Input.is_action_just_pressed("rest"): if tower: @@ -45,7 +57,7 @@ func _process(_delta: float) -> void: if Input.is_action_just_pressed("test"): if tower: - tower.disable(3) + tower.disable(2) func _input(event: InputEvent) -> void: @@ -53,7 +65,7 @@ func _input(event: InputEvent) -> void: handleTowerShortCuts(event) -func handle_player_controls() -> Node3D: +func handle_player_controls() -> CollisionObject3D: #If the player has the mouse on the GUI, player can't place tower if is_on_gui: return @@ -71,15 +83,16 @@ func handle_player_controls() -> Node3D: visible = false return null - var collider : Node3D = ray_result.get("collider") + var collider : CollisionObject3D = ray_result.get("collider") visible = true selection_icon.visible = true - global_position = collider.global_position + Vector3(0.0, 0.21, 0.0) + global_position = collider.global_position + global_position.y += Helper.getTopOfHitBox(collider) + .01 if selected_tower && selected_tower.state == Tower.STATE.BLUEPRINT: selected_tower.sprite.modulate = "ff4545c8" # If the tower can't be placed he is red selection_icon.visible = false # If we are placing a tower, hide the selector model - if collider is GameTile && isTileFree(collider): + if isTileAndFree(collider): selected_tower.sprite.modulate = "61ff45c8" # If the tower can be placed he is green return collider @@ -100,9 +113,10 @@ func placeTower() -> void: moveTower(selected_tower, global_position) -func isTileFree(tile: GameTile) -> bool: - return not usedLocations.has(tile.global_position.round()) \ - && tile.type == GameTile.TYPE.TOWER +func isTileAndFree(collider: CollisionObject3D) -> bool: + return collider is GameTile && collider.type == GameTile.TYPE.TOWER \ + && not usedLocations.has(collider.global_position.round()) + ## Set [param toPosition] with [Vector3.INF] to make the tower rest diff --git a/Towers/tower.tscn b/Towers/tower.tscn index 9619c8d..41674fe 100644 --- a/Towers/tower.tscn +++ b/Towers/tower.tscn @@ -1,10 +1,14 @@ -[gd_scene load_steps=8 format=3 uid="uid://trg7ag3dqr2l"] +[gd_scene load_steps=9 format=3 uid="uid://trg7ag3dqr2l"] [ext_resource type="Script" uid="uid://8kpvuurr5h5n" path="res://Towers/Tower.gd" id="1_egfuc"] [ext_resource type="Texture2D" uid="uid://bn6ikwol6x8r0" path="res://Assets/Characters/Male1.png" id="2_egfuc"] [ext_resource type="Texture2D" uid="uid://uptdcefxlv4c" path="res://Assets/Icones/ppdf_bio_image_placeholder_2.png" id="2_mnaic"] [ext_resource type="Script" uid="uid://blnmjxmusrsa7" path="res://UI/GameStyleBoxFlat.gd" id="8_5dr1v"] +[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_ynmsb"] +radius = 0.15 +height = 0.5 + [sub_resource type="ViewportTexture" id="ViewportTexture_jv31o"] viewport_path = NodePath("EnergyBar3D/SubViewport") @@ -28,6 +32,8 @@ icone = ExtResource("2_mnaic") bio = "Aime se promener dans l'herbe et manger des framboises. Sa petite bouille la rend trop mignonne." [node name="CollisionShape3D" type="CollisionShape3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.6, 0) +shape = SubResource("CapsuleShape3D_ynmsb") [node name="Range" type="Area3D" parent="."] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.4, 0) diff --git a/UI/gui.gd b/UI/gui.gd index 8609603..1c331b1 100644 --- a/UI/gui.gd +++ b/UI/gui.gd @@ -5,18 +5,17 @@ const BUTTON_QTY = 4 const guiButton : PackedScene = preload("res://UI/gui_button.tscn") -@onready var buttonContainer = %ButtonContainer -@onready var cubeIntegrity = %CubeIntegrity -@onready var cubeBtn = %CubeBtn -var waveCooldown : float +@onready var buttonContainer : GridContainer = %ButtonContainer +@onready var cubeIntegrity : ProgressBar = %CubeIntegrity +@onready var cubeBtn : GuiButton = %CubeBtn func _ready() -> void: EventBus.team_in_rest_changed.connect(func(count): %LabelTowerInCube.text = "Zzz : %d" % count) EventBus.team_in_action_changed.connect(func(count): %LabelTowerOnTerrain.text = " In action : %d" % count) EventBus.wave_has_change.connect(onWaveChange) - EventBus.tower_selected.connect(func(_type): - cubeBtn.set_pressed_no_signal(cubeBtn.button_pressed && _type == Tower.TYPE.NONE)) + EventBus.cube_selected.connect(cubeBtn.set_pressed_no_signal.bind(true)) + EventBus.tower_selected.connect(func(_type): cubeBtn.set_pressed_no_signal(false)) Game.allowed_tower_has_change.connect(addTowerButtonNodes) Game.cube_integrity_changed.connect(func(): cubeIntegrity.value = Game.health) @@ -25,7 +24,6 @@ func _ready() -> void: Game.money_changed.connect(func(): %LabelMoney.text = "%d €" % Game.money) %NextWaveBtn.pressed.connect(EventBus.lauch_next_wave.emit) - $WaveCooldown/Timer.timeout.connect(updateWaveCooldownLabel) %QuitLevelBtn.pressed.connect(Helper.showConfirmPopup.bind("Quit level ?", self, Game.quitLevel)) %QuitGameBtn.pressed.connect(Helper.showConfirmPopup.bind("Quit game ?", self, Game.quitGame)) cubeBtn.toggled.connect(onCubeBtnPressed) @@ -47,22 +45,23 @@ func onCubeBtnPressed(state : bool) -> void: EventBus.cube_selected.emit() - func onWaveChange(waveNumber : int, timeRemaining : float) -> void: %WaveNumber.text = "Wave N°%d" % waveNumber - waveCooldown = timeRemaining - $WaveCooldown/Timer.start() + updateWaveCooldownLabel(timeRemaining) -func updateWaveCooldownLabel() -> void: - waveCooldown -= $WaveCooldown/Timer.wait_time - if waveCooldown > 5: - $WaveCooldown.text = "\n\nNext wave : %3.0f" % waveCooldown - elif waveCooldown < 0: - $WaveCooldown/Timer.stop() - $WaveCooldown.text = "" - else: - $WaveCooldown.text = "\n\nNext wave : %3.1f" % waveCooldown +func updateWaveCooldownLabel(waveCooldown : float) -> void: + const tickDuration : float = .1 + $WaveCooldown.visible = true + while waveCooldown > 0: + if waveCooldown > 5: + $WaveCooldown.text = "\n\nNext wave : %3.0f" % waveCooldown + else: + $WaveCooldown.text = "\n\nNext wave : %3.1f" % waveCooldown + waveCooldown -= tickDuration + await get_tree().create_timer(tickDuration).timeout + + $WaveCooldown.visible = false func addTowerButtonNodes() -> void: diff --git a/UI/gui.tscn b/UI/gui.tscn index e141402..e2bd2ed 100644 --- a/UI/gui.tscn +++ b/UI/gui.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=15 format=3 uid="uid://p6a6rb7sgeqd"] +[gd_scene load_steps=16 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://blnmjxmusrsa7" path="res://UI/GameStyleBoxFlat.gd" id="4_h4fn5"] @@ -27,6 +27,12 @@ script = ExtResource("4_h4fn5") color = 4 metadata/_custom_type_script = "uid://blnmjxmusrsa7" +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_parkk"] +bg_color = Color(0.721569, 0.600196, 0.355686, 1) +script = ExtResource("4_h4fn5") +color = 2 +metadata/_custom_type_script = "uid://blnmjxmusrsa7" + [node name="GUI" type="Control"] process_mode = 3 layout_mode = 3 @@ -51,9 +57,6 @@ grow_horizontal = 2 theme_override_colors/font_color = Color(0.2, 0.2, 0.2, 1) theme_override_font_sizes/font_size = 40 -[node name="Timer" type="Timer" parent="WaveCooldown"] -wait_time = 0.1 - [node name="TowerButtonPanel" type="HBoxContainer" parent="."] layout_mode = 1 anchors_preset = 3 @@ -155,6 +158,7 @@ columns = 4 [node name="CubeBtn" parent="TowerButtonPanel/ControlPanelBase/MarginContainer/ButtonContainer" instance=ExtResource("7_parkk")] unique_name_in_owner = true layout_mode = 2 +theme_override_styles/pressed = SubResource("StyleBoxFlat_parkk") toggle_mode = true texture = ExtResource("7_fffne") diff --git a/UI/gui_button.gd b/UI/gui_button.gd index d60278f..cb3f2cc 100644 --- a/UI/gui_button.gd +++ b/UI/gui_button.gd @@ -23,6 +23,7 @@ func towerLinked(value) -> void: tower.state_changed.connect(updateDisabled) Game.money_changed.connect(updateDisabled) EventBus.tower_selected.connect(func(_type): set_pressed_no_signal(_type == tower.type)) + EventBus.cube_selected.connect(func(): set_pressed_no_signal(false)) toggled.connect(func(state): EventBus.tower_selected.emit(tower.type if state else Tower.TYPE.NONE)) tooltip_text = tower.name texture = tower.icone diff --git a/Upgrades/Upgrade.gd b/Upgrades/Upgrade.gd index ba3344b..a3270e1 100644 --- a/Upgrades/Upgrade.gd +++ b/Upgrades/Upgrade.gd @@ -55,5 +55,5 @@ func getNextValue(oldValue, baseValue, scaleType : SCALE_TYPE): match scaleType: SCALE_TYPE.LINEAR: return oldValue + baseValue _: - push_warning("Upgrade scale type not defined !") + push_error("Upgrade scale type not defined !") return oldValue