From 788397e5449c521f87c502983c740c5cd4bf350b Mon Sep 17 00:00:00 2001 From: "m.cirafisi" Date: Tue, 12 May 2026 23:48:04 +0200 Subject: [PATCH] add animations --- core/game_menu/arrow_button.gd | 13 ++++++ core/game_menu/arrow_button.gd.uid | 1 + core/game_menu/arrow_button.tscn | 33 ++++++++++++--- core/game_menu/assets/page_1/freccetta-1.png | Bin 0 -> 1884 bytes .../assets/page_1/freccetta-1.png.import | 40 ++++++++++++++++++ core/game_menu/biome_selector.tscn | 40 ++++++++++++------ core/game_menu/color_picker.gd | 12 +++--- core/game_menu/color_picker.tscn | 32 +++++++++++++- core/game_menu/game_menu.gd | 1 + core/game_menu/game_menu.tscn | 18 +++----- core/game_menu/game_menu_tab.gd | 29 ++++++++++--- core/game_menu/game_menu_tab.tscn | 10 +++-- core/game_menu/hoover_tween.gd | 38 +++++++++++++++++ core/game_menu/hoover_tween.gd.uid | 1 + core/game_menu/hoover_tween.tscn | 6 +++ core/game_menu/option_menu.gd | 29 +++++++++++++ core/game_menu/option_menu.gd.uid | 1 + core/game_menu/option_menu.tscn | 9 ++++ core/game_menu/train_selector.tscn | 21 ++++----- core/game_state/game_state.gd | 14 ++++++ 20 files changed, 288 insertions(+), 60 deletions(-) create mode 100644 core/game_menu/arrow_button.gd create mode 100644 core/game_menu/arrow_button.gd.uid create mode 100644 core/game_menu/assets/page_1/freccetta-1.png create mode 100644 core/game_menu/assets/page_1/freccetta-1.png.import create mode 100644 core/game_menu/hoover_tween.gd create mode 100644 core/game_menu/hoover_tween.gd.uid create mode 100644 core/game_menu/hoover_tween.tscn create mode 100644 core/game_menu/option_menu.gd create mode 100644 core/game_menu/option_menu.gd.uid diff --git a/core/game_menu/arrow_button.gd b/core/game_menu/arrow_button.gd new file mode 100644 index 0000000..09d96c3 --- /dev/null +++ b/core/game_menu/arrow_button.gd @@ -0,0 +1,13 @@ +@tool +extends Control + +@export var image: Texture: + set(value): + image = value + if is_inside_tree() and has_node("%Texture"): + $%Texture.texture = image + + +func _ready(): + if image != null and has_node("%Texture"): + $%Texture.texture = image diff --git a/core/game_menu/arrow_button.gd.uid b/core/game_menu/arrow_button.gd.uid new file mode 100644 index 0000000..4d6b684 --- /dev/null +++ b/core/game_menu/arrow_button.gd.uid @@ -0,0 +1 @@ +uid://3uxuhvua1036 diff --git a/core/game_menu/arrow_button.tscn b/core/game_menu/arrow_button.tscn index c8b0ea8..bfe8f92 100644 --- a/core/game_menu/arrow_button.tscn +++ b/core/game_menu/arrow_button.tscn @@ -1,10 +1,31 @@ [gd_scene format=3 uid="uid://dm3skv22c60tm"] [ext_resource type="Texture2D" uid="uid://cm7fok7lhrano" path="res://core/game_menu/assets/page_1/freccetta.png" id="1_vbu0v"] +[ext_resource type="Script" uid="uid://3uxuhvua1036" path="res://core/game_menu/arrow_button.gd" id="2_xq7pl"] +[ext_resource type="PackedScene" uid="uid://dxun0jk5t0n6" path="res://core/game_menu/hoover_tween.tscn" id="3_hu4cn"] -[node name="ArrowButton" type="TextureButton" unique_id=103192648] -offset_left = 229.0 -offset_top = 652.0 -offset_right = 305.0 -offset_bottom = 756.0 -texture_normal = ExtResource("1_vbu0v") +[node name="ArrowButton" type="Control" unique_id=1696751730] +custom_minimum_size = Vector2(76, 104) +layout_mode = 3 +anchors_preset = 0 +offset_right = 76.0 +offset_bottom = 104.0 +pivot_offset = Vector2(0.5, 0.5) +script = ExtResource("2_xq7pl") +image = ExtResource("1_vbu0v") + +[node name="Texture" type="TextureRect" parent="." unique_id=194430609] +unique_name_in_owner = true +layout_mode = 0 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_right = -36.0 +offset_bottom = -64.0 +pivot_offset_ratio = Vector2(0.5, 0.5) +mouse_filter = 2 +texture = ExtResource("1_vbu0v") +metadata/_edit_use_anchors_ = true + +[node name="HooverTween" parent="." unique_id=2115829120 node_paths=PackedStringArray("detector_node", "visual_node") instance=ExtResource("3_hu4cn")] +detector_node = NodePath("..") +visual_node = NodePath("../Texture") diff --git a/core/game_menu/assets/page_1/freccetta-1.png b/core/game_menu/assets/page_1/freccetta-1.png new file mode 100644 index 0000000000000000000000000000000000000000..faedc39ad87ff1674551d7ec9aba2939f494fefe GIT binary patch literal 1884 zcmV-i2c!6jP) zd9apK9LGP`Rhes&Qi#e7%}82AH7LuFF{J(|vNy`LMr5W^7-=kH$uf;?B4Zn5iE2os zkR?%S#?_DrQ<_4Nklbs|%=hJb=e_rRp7%NDIpo9Z1YQOv=voCakRj|_-~!-Q;B}y5g~aG+EOl=H*8_uq zmB8T82OkQuRrhw_C7=T^7q|~-Rlf8@gIS%k(FRxw9IWd`D$fQ!4|*mZk!umz3Je3b z>F?ga$3SgaFj4@TT8Zm`(LjU#t^sBMF93T6I~z}E&YXE3xF_q{aH;pel4BwP^4WyO zZhSlIS{Gn3a3fG1+>AUR*TRyGeSlAZ{d3$~0-P&5vuqK?JJ|?~0CwcKXVm&rsd+?J}ST^OL3W>S#8Zb4&a~&00Gl7j3Ne3G$qS%Q| z!F==P0jEZMei?8Mu%^T~Occd#kXnBg@%er-+RsnWXOKvm3fQ8BW_!fv_mG+Nr2btJ zu#rzOi^nA~-#HIh4)m{(_#d7ErpJ8eAo<=Ci#<7(WMRohOW-YFKmqSA)VFejwb7&q zn-Z`?fr=jrc=tqo7KWtGfCboAqxB;4uL9mR-pwoWc6PHoE~jwuEqYhM+(J+#zk8|t z@S=dL5Bj~pvkBhsrHIhQ7RTfaHW!v`)JURwBy8tJ;G#T153g`(T5MP9b!))FSb_#WrgdUOUWUo3W9$<8LB2V=TAXO(oM; z`AUxYh@L#A8gZLwB?Et+kK~xI5LCvsvkjA~Fz&-iX->u$i6-K6I+xr6ZfjiPl zj`<9Reh-|fmD@JVyvD2irK{_S_>L$WFXUQ>?f2DUHqv1qL4@U}sUXS~S_6+Oh2bPQ z<}!*C2dz_zA+A*s|3@|(4JASJt0F$G_ZJ?hMg8~bkQ|xn<7M;4dFNRuqut^c0 zT*daT&`XtTaZ6%?F5fT{x+3L1O>FWZeVf}weJS)B7!!1z>7n0YI@00TC=VAyA<-Cp zAJaw`)fP?7mmCXqVadh;O6Irs)c<=*Z>-C8vsg;n)@c$hB0fV;EH(&Porgx;$?6JQRH@NFU$sW4 zlGs!G|9liE8C&#eCI2Js$qA9fy|fbh*g#n))y+N&s9A)j&eba3bYA+Ag>Bkn*e5Q5 z1SpB-SgjLM?$b#9xFiQ8g+!vUzphNNzcnfheKl!Ap{TQo*FBI@Uw;5MDKV9pKmw7( zPQdJxT)O#^cB|)5_?E=9T)OYHW#beV2YL7;u}Yb|!yWdqQ)MaLU6$|pROiX6ly!x7 zWb=LIdLq6g(WOhbQI)aBr$Hc|NbI3wU2OMVub^!=xs0w$^!`QK>fBB%aU09+F4Kv6 zK9c;YN}>yw&TJ&V6gbisfut;ncdM|{1{ze%K3>sguSko;(TdI4z$(?}Eb&cV25G4C z(ZGWi+S#UaZI1|vKvIxITQ1!!MOxNd8kbeLB(X*%AA2Wg;|r&qYtiPhQ| z*j2y1GS*f#RjD9~I^U(^nWrj9S|KnC`6O|azJ)zY@n?~2p*a#e$ void: tab.on_tab_selected.connect(_on_tab_pressed) tabs[0].select() + pages[0].show() func _on_tab_pressed(index: int): for page in pages: diff --git a/core/game_menu/game_menu.tscn b/core/game_menu/game_menu.tscn index 051fcf1..265ec14 100644 --- a/core/game_menu/game_menu.tscn +++ b/core/game_menu/game_menu.tscn @@ -10,6 +10,7 @@ [ext_resource type="PackedScene" uid="uid://c8b5sqnocx8dr" path="res://core/game_menu/page_3.tscn" id="5_yq2ch"] [node name="GameMenu" type="Control" unique_id=2124096517] +process_mode = 3 layout_mode = 3 anchors_preset = 15 anchor_right = 1.0 @@ -20,31 +21,25 @@ mouse_filter = 2 script = ExtResource("1_57vaj") [node name="Tabs" type="HBoxContainer" parent="." unique_id=1745270897] -layout_mode = 0 -offset_left = 1146.0 -offset_top = 214.0 -offset_right = 1754.0 -offset_bottom = 254.0 +layout_mode = 1 +offset_left = 1138.0 +offset_top = 208.0 +offset_right = 1734.0 +offset_bottom = 646.0 [node name="Tab1" parent="Tabs" unique_id=2026548604 instance=ExtResource("3_xmmnr")] unique_name_in_owner = true -custom_minimum_size = Vector2(200, 0) layout_mode = 2 -size_flags_horizontal = 3 image = ExtResource("4_y36g7") [node name="Tab2" parent="Tabs" unique_id=640092511 instance=ExtResource("3_xmmnr")] unique_name_in_owner = true -custom_minimum_size = Vector2(200, 0) layout_mode = 2 -size_flags_horizontal = 3 index = 1 [node name="Tab3" parent="Tabs" unique_id=1769860923 instance=ExtResource("3_xmmnr")] unique_name_in_owner = true -custom_minimum_size = Vector2(200, 0) layout_mode = 2 -size_flags_horizontal = 3 index = 2 image = ExtResource("5_7d256") @@ -69,7 +64,6 @@ mouse_filter = 2 [node name="Page1" parent="Pages" unique_id=2037261222 instance=ExtResource("3_quxs6")] unique_name_in_owner = true -visible = false layout_mode = 1 mouse_filter = 2 diff --git a/core/game_menu/game_menu_tab.gd b/core/game_menu/game_menu_tab.gd index 982cd2d..322a168 100644 --- a/core/game_menu/game_menu_tab.gd +++ b/core/game_menu/game_menu_tab.gd @@ -5,24 +5,41 @@ class_name GameMenuTab signal on_tab_selected(index: int) +@export var bob_height: float = 100 +@export var duration: float = 0.5 @export var index: int = 0 @export var image: Texture: set(value): image = value - if is_inside_tree() and has_node("%Texture"): - $%Texture.texture_normal = image - -var is_selected: bool = false + if is_inside_tree() and has_node("%TextureButton"): + $%TextureButton.texture_normal = image + +@onready var texture_button: TextureButton = $%TextureButton + +var is_selected: bool = false +var hover_tween: Tween func _ready(): - if image != null and has_node("%Texture"): - $%Texture.texture_normal = image + if image != null and has_node("%TextureButton"): + $%TextureButton.texture_normal = image func _on_texture_pressed() -> void: on_tab_selected.emit(index) func select(): is_selected = true + _move_up() func deselect(): is_selected = false + _move_down() + +func _move_up(): + if hover_tween: hover_tween.kill() + hover_tween = create_tween() + hover_tween.tween_property(texture_button, "position:y", -bob_height, duration).set_trans(Tween.TRANS_SINE) + +func _move_down(): + if hover_tween: hover_tween.kill() + var exit_tween = create_tween() + exit_tween.tween_property(texture_button, "position:y", 0, duration).set_trans(Tween.TRANS_QUAD) diff --git a/core/game_menu/game_menu_tab.tscn b/core/game_menu/game_menu_tab.tscn index e631446..cb08f02 100644 --- a/core/game_menu/game_menu_tab.tscn +++ b/core/game_menu/game_menu_tab.tscn @@ -4,17 +4,19 @@ [ext_resource type="Texture2D" uid="uid://ce1u34fp1h2o5" path="res://core/game_menu/assets/page_1/ticket1.png" id="2_giv8b"] [node name="GameMenuTab" type="Control" unique_id=2026548604] +custom_minimum_size = Vector2(196, 408) layout_mode = 3 -anchors_preset = 0 +anchor_right = 0.10208333 +anchor_bottom = 0.40648147 script = ExtResource("1_5bcha") image = ExtResource("2_giv8b") -[node name="Texture" type="TextureButton" parent="." unique_id=1234672875] +[node name="TextureButton" type="TextureButton" parent="." unique_id=1234672875] unique_name_in_owner = true -layout_mode = 0 +layout_mode = 1 offset_right = 196.0 offset_bottom = 438.0 texture_normal = ExtResource("2_giv8b") stretch_mode = 5 -[connection signal="pressed" from="Texture" to="." method="_on_texture_pressed"] +[connection signal="pressed" from="TextureButton" to="." method="_on_texture_pressed"] diff --git a/core/game_menu/hoover_tween.gd b/core/game_menu/hoover_tween.gd new file mode 100644 index 0000000..32a04d4 --- /dev/null +++ b/core/game_menu/hoover_tween.gd @@ -0,0 +1,38 @@ +extends Node + + +@export_group("Settings") +@export var always_active: bool = false +@export var detector_node: Control +@export var visual_node: Control +@export var scale_amount: Vector2 = Vector2(1.1, 1.1) +@export var duration: float = 0.5 + +var hover_tween: Tween + +func _ready(): + if not detector_node or not visual_node: + return + + if always_active: + hover_tween = create_tween().set_loops() + hover_tween.tween_property(visual_node, "scale", scale_amount, duration).set_trans(Tween.TRANS_SINE) + hover_tween.tween_property(visual_node, "scale", Vector2.ONE, duration).set_trans(Tween.TRANS_SINE) + return + + detector_node.mouse_entered.connect(_on_mouse_entered) + detector_node.mouse_exited.connect(_on_mouse_exited) + + +func _on_mouse_entered(): + if hover_tween: hover_tween.kill() + + hover_tween = create_tween().set_loops() + hover_tween.tween_property(visual_node, "scale", scale_amount, duration).set_trans(Tween.TRANS_SINE) + hover_tween.tween_property(visual_node, "scale", Vector2.ONE, duration).set_trans(Tween.TRANS_SINE) + +func _on_mouse_exited(): + if hover_tween: hover_tween.kill() + + var exit_tween = create_tween() + exit_tween.tween_property(visual_node, "scale", Vector2.ONE, 0.2).set_trans(Tween.TRANS_QUAD) diff --git a/core/game_menu/hoover_tween.gd.uid b/core/game_menu/hoover_tween.gd.uid new file mode 100644 index 0000000..8e0f72d --- /dev/null +++ b/core/game_menu/hoover_tween.gd.uid @@ -0,0 +1 @@ +uid://ryxh3nm7ayvf diff --git a/core/game_menu/hoover_tween.tscn b/core/game_menu/hoover_tween.tscn new file mode 100644 index 0000000..4abaa61 --- /dev/null +++ b/core/game_menu/hoover_tween.tscn @@ -0,0 +1,6 @@ +[gd_scene format=3 uid="uid://dxun0jk5t0n6"] + +[ext_resource type="Script" uid="uid://ryxh3nm7ayvf" path="res://core/game_menu/hoover_tween.gd" id="1_gmaf4"] + +[node name="HooverTween" type="Node" unique_id=160227524] +script = ExtResource("1_gmaf4") diff --git a/core/game_menu/option_menu.gd b/core/game_menu/option_menu.gd new file mode 100644 index 0000000..9efd8ab --- /dev/null +++ b/core/game_menu/option_menu.gd @@ -0,0 +1,29 @@ +extends Control + +@onready var play_button: TextureButton = $%PlayButton +@onready var resume_button: TextureButton = $%ResumeButton + +func _ready() -> void: + GameState.on_game_paused.connect(_on_game_paused) + GameState.on_game_resumed.connect(_on_game_resumed) + resume_button.hide() + +func _on_play_button_pressed() -> void: + pass # Replace with function body. + +func _on_resume_button_pressed() -> void: + GameState.resume_game() + +func _on_save_button_pressed() -> void: + GameState.save_game() + +func _on_quit_button_pressed() -> void: + GameState.quit_game() + +func _on_game_paused() -> void: + play_button.hide() + resume_button.show() + +func _on_game_resumed() -> void: + play_button.show() + resume_button.hide() diff --git a/core/game_menu/option_menu.gd.uid b/core/game_menu/option_menu.gd.uid new file mode 100644 index 0000000..9cc8f5e --- /dev/null +++ b/core/game_menu/option_menu.gd.uid @@ -0,0 +1 @@ +uid://cvrjr02dpnafm diff --git a/core/game_menu/option_menu.tscn b/core/game_menu/option_menu.tscn index a5dde4a..5b6c771 100644 --- a/core/game_menu/option_menu.tscn +++ b/core/game_menu/option_menu.tscn @@ -1,5 +1,6 @@ [gd_scene format=3 uid="uid://cxf8s80ivwj1p"] +[ext_resource type="Script" uid="uid://cvrjr02dpnafm" path="res://core/game_menu/option_menu.gd" id="1_cd2sv"] [ext_resource type="Texture2D" uid="uid://b4nymq3n3468g" path="res://core/game_menu/assets/page_3/play_button.png" id="1_xquiw"] [ext_resource type="Texture2D" uid="uid://dd1exrppb6bjq" path="res://core/game_menu/assets/page_3/resume_button.png" id="2_htoi2"] [ext_resource type="Texture2D" uid="uid://cmhx3mscwrwft" path="res://core/game_menu/assets/page_3/save_button.png" id="3_vwpol"] @@ -8,6 +9,7 @@ [node name="OptionMenu" type="Control" unique_id=1055457221] layout_mode = 3 anchors_preset = 0 +script = ExtResource("1_cd2sv") [node name="VBoxContainer" type="VBoxContainer" parent="." unique_id=508055524] layout_mode = 1 @@ -15,11 +17,13 @@ offset_right = 303.0 offset_bottom = 373.0 [node name="PlayButton" type="TextureButton" parent="VBoxContainer" unique_id=46341665] +unique_name_in_owner = true layout_mode = 2 texture_normal = ExtResource("1_xquiw") stretch_mode = 5 [node name="ResumeButton" type="TextureButton" parent="VBoxContainer" unique_id=814859927] +unique_name_in_owner = true layout_mode = 2 texture_normal = ExtResource("2_htoi2") stretch_mode = 5 @@ -33,3 +37,8 @@ stretch_mode = 5 layout_mode = 2 texture_normal = ExtResource("4_cd2sv") stretch_mode = 5 + +[connection signal="pressed" from="VBoxContainer/PlayButton" to="." method="_on_play_button_pressed"] +[connection signal="pressed" from="VBoxContainer/ResumeButton" to="." method="_on_resume_button_pressed"] +[connection signal="pressed" from="VBoxContainer/SaveButton" to="." method="_on_save_button_pressed"] +[connection signal="pressed" from="VBoxContainer/QuitButton" to="." method="_on_quit_button_pressed"] diff --git a/core/game_menu/train_selector.tscn b/core/game_menu/train_selector.tscn index 580f4f0..8dc4856 100644 --- a/core/game_menu/train_selector.tscn +++ b/core/game_menu/train_selector.tscn @@ -8,6 +8,7 @@ [ext_resource type="Texture2D" uid="uid://bv07xhpe3kh0r" path="res://core/game_menu/assets/page_1/customizecolor-5.png" id="6_dxnpq"] [ext_resource type="Texture2D" uid="uid://cryqbi1av2x1c" path="res://core/game_menu/assets/page_1/customizecolor.png" id="7_d1sdr"] [ext_resource type="Texture2D" uid="uid://d4l5ih723j3md" path="res://core/game_menu/assets/page_1/customizecolor-2.png" id="8_tuh6m"] +[ext_resource type="Texture2D" uid="uid://clnfehvvft2vc" path="res://core/game_menu/assets/page_1/freccetta-1.png" id="9_puip6"] [node name="TrainSelector" type="VBoxContainer" unique_id=1039769375] offset_right = 568.0 @@ -27,42 +28,36 @@ layout_mode = 2 [node name="HBoxContainer" type="HBoxContainer" parent="HBoxContainer2" unique_id=1364417494] layout_mode = 2 theme_override_constants/separation = 18 -alignment = 1 [node name="ColorPicker" parent="HBoxContainer2/HBoxContainer" unique_id=59169767 instance=ExtResource("3_i2rs1")] layout_mode = 2 -texture_normal = ExtResource("4_cfvtr") -stretch_mode = 3 +size_flags_vertical = 4 image = ExtResource("4_cfvtr") [node name="ColorPicker2" parent="HBoxContainer2/HBoxContainer" unique_id=584054476 instance=ExtResource("3_i2rs1")] layout_mode = 2 -texture_normal = ExtResource("5_jnto8") -stretch_mode = 3 +size_flags_vertical = 4 image = ExtResource("5_jnto8") [node name="ColorPicker3" parent="HBoxContainer2/HBoxContainer" unique_id=889429149 instance=ExtResource("3_i2rs1")] layout_mode = 2 -texture_normal = ExtResource("6_dxnpq") -stretch_mode = 3 +size_flags_vertical = 4 image = ExtResource("6_dxnpq") [node name="ColorPicker4" parent="HBoxContainer2/HBoxContainer" unique_id=466686411 instance=ExtResource("3_i2rs1")] layout_mode = 2 -texture_normal = ExtResource("7_d1sdr") -stretch_mode = 3 +size_flags_vertical = 4 image = ExtResource("7_d1sdr") [node name="ColorPicker5" parent="HBoxContainer2/HBoxContainer" unique_id=675841518 instance=ExtResource("3_i2rs1")] layout_mode = 2 -stretch_mode = 3 +size_flags_vertical = 4 [node name="ColorPicker6" parent="HBoxContainer2/HBoxContainer" unique_id=1698412911 instance=ExtResource("3_i2rs1")] layout_mode = 2 -texture_normal = ExtResource("8_tuh6m") -stretch_mode = 3 +size_flags_vertical = 4 image = ExtResource("8_tuh6m") [node name="ArrowButtonRight" parent="HBoxContainer2" unique_id=68298624 instance=ExtResource("2_puip6")] layout_mode = 2 -flip_h = true +image = ExtResource("9_puip6") diff --git a/core/game_state/game_state.gd b/core/game_state/game_state.gd index ffe6322..2e1cd0f 100644 --- a/core/game_state/game_state.gd +++ b/core/game_state/game_state.gd @@ -1,5 +1,10 @@ extends Node +@warning_ignore("unused_signal") +signal on_game_paused +@warning_ignore("unused_signal") +signal on_game_resumed + const SAVE_PATH: String = "user://savegame.json" var save_data: SaveGameData = SaveGameData.new() @@ -30,3 +35,12 @@ func load_game() -> void: save_data = SaveGameData.from_dictionary(json.data) is_loaded = true + +func pause_game() -> void: + get_tree().paused = true + +func resume_game() -> void: + get_tree().paused = false + +func quit_game() -> void: + get_tree().quit()