new ring counter, move some logic away from main scene
This commit is contained in:
parent
b81eb08e05
commit
9890e0a625
5 changed files with 187 additions and 143 deletions
33
gui/rings.tscn
Normal file
33
gui/rings.tscn
Normal file
|
@ -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")
|
|
@ -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
|
||||
|
|
201
index.tscn
201
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()
|
||||
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()
|
||||
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"]
|
||||
|
|
78
menus/pause_menu.tscn
Normal file
78
menus/pause_menu.tscn
Normal file
|
@ -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"]
|
|
@ -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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue