From 9890e0a6253ff4c3dbb767509708029a07042b79 Mon Sep 17 00:00:00 2001 From: Taevas Date: Wed, 23 Apr 2025 15:37:03 +0200 Subject: [PATCH] new ring counter, move some logic away from main scene --- gui/rings.tscn | 33 +++++++ gui/speed.tscn | 4 +- index.tscn | 213 +++++++++++++++--------------------------- menus/pause_menu.tscn | 78 ++++++++++++++++ project.godot | 2 +- 5 files changed, 187 insertions(+), 143 deletions(-) create mode 100644 gui/rings.tscn create mode 100644 menus/pause_menu.tscn diff --git a/gui/rings.tscn b/gui/rings.tscn new file mode 100644 index 0000000..e580c7e --- /dev/null +++ b/gui/rings.tscn @@ -0,0 +1,33 @@ +[gd_scene load_steps=4 format=3 uid="uid://cn55m5dqo3m6u"] + +[ext_resource type="FontFile" uid="uid://c3fsj6knyiuhl" path="res://fonts/Knewave/Knewave-Regular.ttf" id="1_nja12"] + +[sub_resource type="LabelSettings" id="LabelSettings_cnn6y"] +font = ExtResource("1_nja12") +font_size = 32 +outline_size = 8 +outline_color = Color(0, 0, 0, 1) +shadow_size = 8 +shadow_color = Color(0, 0, 0, 1) + +[sub_resource type="GDScript" id="GDScript_nja12"] +script/source = "extends Label + +var remaining_rings := 0: + get: return remaining_rings + set(value): + remaining_rings = value + if value >= 1: + var rings_word := \"rings\" if value != 1 else \"ring\" + self.text = str(value) + \" \" + rings_word + \" to go!\" + else: + self.text = \"You did it!!\" +" + +[node name="Rings" type="Label"] +offset_right = 109.0 +offset_bottom = 23.0 +text = "69 rings to go!" +label_settings = SubResource("LabelSettings_cnn6y") +horizontal_alignment = 2 +script = SubResource("GDScript_nja12") diff --git a/gui/speed.tscn b/gui/speed.tscn index 710e61d..92fadba 100644 --- a/gui/speed.tscn +++ b/gui/speed.tscn @@ -17,8 +17,8 @@ var ball_velocity := 0.0: get: return ball_velocity set(value): ball_velocity = value - var rounded := int(floor(value)) - self.text = str(rounded) + \" km/h\" + var rounded: float = floor(value) + self.text = str(int(rounded)) + \" km/h\" const min_px = 32.0 const max_px = 56.0 diff --git a/index.tscn b/index.tscn index a225fb6..cfef63e 100644 --- a/index.tscn +++ b/index.tscn @@ -1,7 +1,9 @@ -[gd_scene load_steps=6 format=3 uid="uid://ccgnnif026wb4"] +[gd_scene load_steps=7 format=3 uid="uid://ccgnnif026wb4"] [ext_resource type="PackedScene" uid="uid://xd3nsiglcdfc" path="res://gui/timer.tscn" id="1_356j3"] [ext_resource type="PackedScene" uid="uid://cckeamgkt8bqo" path="res://gui/speed.tscn" id="2_2gn6w"] +[ext_resource type="PackedScene" uid="uid://cn55m5dqo3m6u" path="res://gui/rings.tscn" id="3_mbj17"] +[ext_resource type="PackedScene" uid="uid://dkxtwpcy4moyo" path="res://menus/pause_menu.tscn" id="4_3bfj3"] [sub_resource type="GDScript" id="GDScript_8n212"] script/source = "extends Node @@ -17,21 +19,27 @@ var levels = [ ] var area_resource = preload(\"res://menus/main/area.tscn\") -@onready var timer := $GUI/TopLeft/Timer -@onready var speed := $GUI/TopRight/Speed +@onready var gui_timer := $GUI/TopLeft/Timer +@onready var gui_speed := $GUI/TopRight/Speed +@onready var gui_rings := $GUI/BottomRight/Rings +@onready var pause_menu := $PauseMenu func _ready() -> void: - var os_name = OS.get_name() - if os_name == \"Web\": ## we can't quit the game on web - $PauseMenu/VBoxContainer/Btn_Quit.hide() - - $VictoryScreen.hide() - $Informations.hide() - $PauseMenu.hide() ## Add the version of the game and the name of the OS to the footer of the start menu if OS.has_feature(\"editor\"): $DevInfos.text = \"dev \" - $DevInfos.text += \"build \" + ProjectSettings.get_setting(\"application/config/version\") + \" (\" + os_name + \")\" + $DevInfos.text += \"build \" + ProjectSettings.get_setting(\"application/config/version\") + \" (\" + OS.get_name() + \")\" + + ## Hide UI stuff that shouldn't be visible until later in the game + $VictoryScreen.hide() + $GUI.hide() + pause_menu.hide() + + ## Connect to necessary signals + pause_menu.connect(\"request_pause\", pause_game) + pause_menu.connect(\"request_fullscreen\", fullscreen_game) + pause_menu.connect(\"request_restart\", restart_level) + launch_area() func launch_area(): @@ -56,6 +64,10 @@ func start_level(level_scene: PackedScene) -> void: var level = level_scene.instantiate() $Levels.add_child(level) level.connect(\"completed\", stop_level) + level.connect(\"ring_collected\", func(): + gui_rings.remaining_rings = len(level.rings) - level.finished_rings_count + ) + gui_rings.remaining_rings = len(level.rings) - level.finished_rings_count playing = true PhysicsServer3D.area_set_param( get_viewport().find_world_3d().space, @@ -63,20 +75,20 @@ func start_level(level_scene: PackedScene) -> void: Vector3.DOWN ) changing_level = false - timer.seconds_spent_level_attempt = 0.0 - timer.enabled = true + gui_timer.seconds_spent_level_attempt = 0.0 + gui_timer.enabled = true func stop_level() -> void: - timer.enabled = false + gui_timer.enabled = false PhysicsServer3D.area_set_param(get_viewport().find_world_3d().space, PhysicsServer3D.AREA_PARAM_GRAVITY, 1) playing = false changing_level = true - SaveFiles.change_property(\"played_for\", timer.seconds_spent_total, SaveFiles.selected_file) + SaveFiles.change_property(\"played_for\", gui_timer.seconds_spent_total, SaveFiles.selected_file) var save_file_data = SaveFiles.read(SaveFiles.selected_file) var property_name := \"best_time_for_level_\" + str(current_level_int) - if !save_file_data.has(property_name) or save_file_data[property_name] is not float or save_file_data[property_name] > timer.seconds_spent_level_attempt: - SaveFiles.change_property(property_name, timer.seconds_spent_level_attempt, SaveFiles.selected_file) + if !save_file_data.has(property_name) or save_file_data[property_name] is not float or save_file_data[property_name] > gui_timer.seconds_spent_level_attempt: + SaveFiles.change_property(property_name, gui_timer.seconds_spent_level_attempt, SaveFiles.selected_file) var current_levels = get_current_levels() for level in current_levels: @@ -97,28 +109,40 @@ func win_game() -> void: $VictoryScreen.hide() func restart_level() -> void: - if changing_level == false: - var current_levels = get_current_levels() - if len(current_levels): - pause_game() - changing_level = true - - for level in current_levels: - level.queue_free() - - start_level(levels[current_level_int]) + var current_levels := get_current_levels() + if len(current_levels) && !changing_level: + pause_game(false) + changing_level = true + + for level in current_levels: + level.queue_free() + start_level(levels[current_level_int]) -func pause_game() -> void: - SaveFiles.change_property(\"played_for\", timer.seconds_spent_total, SaveFiles.selected_file) - if $Levels.process_mode == PROCESS_MODE_INHERIT: +func start_game() -> void: + current_level_int = 0 + + var current_levels = $Levels.get_children(true) + for level in current_levels: + level.queue_free() + + $GUI.show() + Input.set_mouse_mode(Input.MOUSE_MODE_HIDDEN) + start_level(levels[current_level_int]) + +func pause_game(to_pause: bool) -> void: + if !len(get_current_levels()) or changing_level: + return + + SaveFiles.change_property(\"played_for\", gui_timer.seconds_spent_total, SaveFiles.selected_file) + if to_pause: $Levels.process_mode = Node.PROCESS_MODE_DISABLED playing = false - $PauseMenu.show() + pause_menu.show() Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE) else: $Levels.process_mode = Node.PROCESS_MODE_INHERIT playing = true - $PauseMenu.hide() + pause_menu.hide() Input.set_mouse_mode(Input.MOUSE_MODE_HIDDEN) func fullscreen_game() -> void: @@ -128,43 +152,20 @@ func fullscreen_game() -> void: else: DisplayServer.window_set_mode(DisplayServer.WindowMode.WINDOW_MODE_WINDOWED) -func start_game() -> void: - current_level_int = 0 - - var current_levels = $Levels.get_children(true) - for level in current_levels: - level.queue_free() - - $Informations.show() - Input.set_mouse_mode(Input.MOUSE_MODE_HIDDEN) - start_level(levels[0]) - func _process(_delta: float) -> void: var current_levels = get_current_levels() if len(current_levels): var current_level = current_levels[0] - speed.ball_velocity = current_level.velocity - $Informations/MarginContainer/VBoxContainer/Rings.text = str(current_level.finished_rings_count) + \"/\" + str(len(current_level.rings)) + gui_speed.ball_velocity = current_level.velocity -func _unhandled_key_input(event: InputEvent) -> void: - if event.is_pressed() and event is InputEventKey: - var current_levels := get_current_levels() - if len(current_levels) and changing_level == false: - if Input.is_action_just_pressed(\"pause_game\"): - pause_game() - elif Input.is_action_just_pressed(\"restart_level\"): - pause_game() - restart_level() +func _input(_event: InputEvent) -> void: + if Input.is_action_just_pressed(\"restart_level\"): + restart_level() func _on_btn_quit_pressed() -> void: get_tree().quit() " -[sub_resource type="LabelSettings" id="LabelSettings_0s07t"] -font_size = 32 -outline_size = 10 -outline_color = Color(0, 0, 0, 1) - [sub_resource type="LabelSettings" id="LabelSettings_1bs00"] font_size = 160 outline_size = 20 @@ -207,36 +208,23 @@ theme_override_constants/margin_right = 15 [node name="Speed" parent="GUI/TopRight" instance=ExtResource("2_2gn6w")] layout_mode = 2 -[node name="Informations" type="Control" parent="."] -layout_mode = 3 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 -mouse_filter = 1 - -[node name="MarginContainer" type="MarginContainer" parent="Informations"] +[node name="BottomRight" type="MarginContainer" parent="GUI"] layout_mode = 1 -anchors_preset = 15 +anchors_preset = 3 +anchor_left = 1.0 +anchor_top = 1.0 anchor_right = 1.0 anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 -theme_override_constants/margin_left = 10 -theme_override_constants/margin_right = 10 +offset_left = -222.0 +offset_top = -51.0 +grow_horizontal = 0 +grow_vertical = 0 +rotation = 0.0523599 +theme_override_constants/margin_right = 15 +theme_override_constants/margin_bottom = 15 -[node name="VBoxContainer" type="VBoxContainer" parent="Informations/MarginContainer"] +[node name="Rings" parent="GUI/BottomRight" instance=ExtResource("3_mbj17")] layout_mode = 2 -theme_override_constants/separation = -5 -alignment = 2 - -[node name="Rings" type="Label" parent="Informations/MarginContainer/VBoxContainer"] -layout_mode = 2 -text = "0/0" -label_settings = SubResource("LabelSettings_0s07t") -horizontal_alignment = 2 -vertical_alignment = 2 [node name="VictoryScreen" type="Control" parent="."] layout_mode = 3 @@ -260,57 +248,7 @@ vertical_alignment = 1 [node name="Levels" type="Node" parent="."] -[node name="PauseMenu" type="Control" parent="."] -visible = false -z_index = 2 -layout_mode = 3 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 -mouse_filter = 1 - -[node name="ColorRect" type="ColorRect" parent="PauseMenu"] -layout_mode = 1 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 -color = Color(1, 0.54902, 1, 0.109804) - -[node name="VBoxContainer" type="VBoxContainer" parent="PauseMenu"] -layout_mode = 1 -anchors_preset = 14 -anchor_top = 0.5 -anchor_right = 1.0 -anchor_bottom = 0.5 -offset_top = -50.5 -offset_bottom = 50.5 -grow_horizontal = 2 -grow_vertical = 2 -theme_override_constants/separation = 10 - -[node name="Btn_Resume" type="Button" parent="PauseMenu/VBoxContainer"] -layout_mode = 2 -size_flags_vertical = 6 -text = "RESUME game" - -[node name="Btn_Fullscreen2" type="Button" parent="PauseMenu/VBoxContainer"] -layout_mode = 2 -size_flags_vertical = 6 -text = "Toggle FULLSCREEN" - -[node name="Btn_Restart" type="Button" parent="PauseMenu/VBoxContainer"] -layout_mode = 2 -size_flags_vertical = 6 -text = "RESTART the level" - -[node name="Btn_Quit" type="Button" parent="PauseMenu/VBoxContainer"] -layout_mode = 2 -size_flags_vertical = 6 -text = "QUIT game" +[node name="PauseMenu" parent="." instance=ExtResource("4_3bfj3")] [node name="DevInfos" type="Label" parent="."] anchors_preset = 12 @@ -321,8 +259,3 @@ offset_top = -23.0 grow_horizontal = 2 grow_vertical = 0 horizontal_alignment = 1 - -[connection signal="pressed" from="PauseMenu/VBoxContainer/Btn_Resume" to="." method="pause_game"] -[connection signal="pressed" from="PauseMenu/VBoxContainer/Btn_Fullscreen2" to="." method="fullscreen_game"] -[connection signal="pressed" from="PauseMenu/VBoxContainer/Btn_Restart" to="." method="restart_level"] -[connection signal="pressed" from="PauseMenu/VBoxContainer/Btn_Quit" to="." method="_on_btn_quit_pressed"] diff --git a/menus/pause_menu.tscn b/menus/pause_menu.tscn new file mode 100644 index 0000000..27f7e68 --- /dev/null +++ b/menus/pause_menu.tscn @@ -0,0 +1,78 @@ +[gd_scene load_steps=2 format=3 uid="uid://dkxtwpcy4moyo"] + +[sub_resource type="GDScript" id="GDScript_d8v8v"] +script/source = "extends Control + +signal request_pause +signal request_fullscreen +signal request_restart + +func _ready() -> void: + var os_name = OS.get_name() + if os_name == \"Web\": ## you can't quit the game on web (you're stuck here forever :)) + $VBoxContainer/Btn_Quit.hide() + +func _input(_event: InputEvent) -> void: + if Input.is_action_just_pressed(\"pause_game\"): + request_pause.emit(!self.visible) + +func _on_btn_resume_pressed() -> void: + request_pause.emit(false) + +func _on_btn_fullscreen_pressed() -> void: + request_fullscreen.emit() + +func _on_btn_restart_pressed() -> void: + request_restart.emit() + +func _on_btn_quit_pressed() -> void: + get_tree().quit() +" + +[node name="PauseMenu" type="Control"] +z_index = 2 +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 1 +script = SubResource("GDScript_d8v8v") + +[node name="VBoxContainer" type="VBoxContainer" parent="."] +layout_mode = 1 +anchors_preset = 14 +anchor_top = 0.5 +anchor_right = 1.0 +anchor_bottom = 0.5 +offset_top = -50.5 +offset_bottom = 50.5 +grow_horizontal = 2 +grow_vertical = 2 +theme_override_constants/separation = 10 + +[node name="Btn_Resume" type="Button" parent="VBoxContainer"] +layout_mode = 2 +size_flags_vertical = 6 +text = "RESUME game" + +[node name="Btn_Fullscreen" type="Button" parent="VBoxContainer"] +layout_mode = 2 +size_flags_vertical = 6 +text = "Toggle FULLSCREEN" + +[node name="Btn_Restart" type="Button" parent="VBoxContainer"] +layout_mode = 2 +size_flags_vertical = 6 +text = "RESTART the level" + +[node name="Btn_Quit" type="Button" parent="VBoxContainer"] +layout_mode = 2 +size_flags_vertical = 6 +text = "QUIT game" + +[connection signal="pressed" from="VBoxContainer/Btn_Resume" to="." method="_on_btn_resume_pressed"] +[connection signal="pressed" from="VBoxContainer/Btn_Fullscreen" to="." method="_on_btn_fullscreen_pressed"] +[connection signal="pressed" from="VBoxContainer/Btn_Restart" to="." method="_on_btn_restart_pressed"] +[connection signal="pressed" from="VBoxContainer/Btn_Quit" to="." method="_on_btn_quit_pressed"] diff --git a/project.godot b/project.godot index 1e0076e..7bbf422 100644 --- a/project.godot +++ b/project.godot @@ -13,7 +13,7 @@ config_version=5 config/name="DreamBall" config/description="Manipulate the gravity to make a ball go through every ring! https://kitsunes.dev/Taevas/DreamBall" -config/version="20250330.0" +config/version="20250423.0" run/main_scene="res://index.tscn" config/features=PackedStringArray("4.4", "GL Compatibility") boot_splash/show_image=false