better in-game timer

as in, use `_process()` and add a number
could you lag on purpose before finishing to cut time? probably not
This commit is contained in:
Taevas 2025-03-25 17:48:00 +01:00
parent 4afec6386c
commit df7736a9d1
10 changed files with 180 additions and 190 deletions

View file

@ -1,15 +1,20 @@
[gd_scene load_steps=11 format=3 uid="uid://ccgnnif026wb4"]
[ext_resource type="PackedScene" uid="uid://n40mg5tc3bnv" path="res://levels/demo_level.tscn" id="1_08svf"]
[ext_resource type="PackedScene" uid="uid://dtfybhftwfn00" path="res://levels/demo.tscn" id="1_356j3"]
[sub_resource type="GDScript" id="GDScript_8n212"]
script/source = "extends Node
var seconds_spent: float = 0.0
var playing: bool = false
var seconds_spent: float = 0.00
var changing_level: bool = false
var base = preload(\"res://levels/base/level.tscn\")
var forest = preload(\"res://levels/forest/level.tscn\")
var night = preload(\"res://levels/night/level.tscn\")
var current_level_int: int = 0
var levels = [
preload(\"res://levels/base/level.tscn\"),
preload(\"res://levels/forest/level.tscn\"),
preload(\"res://levels/night/level.tscn\"),
]
func _ready() -> void:
var os_name = OS.get_name()
@ -24,77 +29,76 @@ func _ready() -> void:
$StartMenu/VBoxContainer/MarginContainer2/Notice.text = \"dev \"
$StartMenu/VBoxContainer/MarginContainer2/Notice.text += \"build \" + ProjectSettings.get_setting(\"application/config/version\") + \" (\" + os_name + \")\"
## Get all the levels that are currently being played!
## In theory, there should ever be only zero or one,
## but it turns out it's more simple to handle things by using Arrays.
func get_current_levels() -> Array[Level]:
var children = $Levels.get_children(true)
var current_levels: Array[Level] = []
for child in children:
if is_instance_of(child, Level):
current_levels.push_back(child)
return current_levels
func start_level(level_scene: PackedScene) -> void:
$VictoryScreen.hide()
if level_scene and level_scene.can_instantiate():
var level = level_scene.instantiate()
$Levels.add_child(level)
$Timer.paused = false
AudioServer.set_bus_volume_db(0, 0)
PhysicsServer3D.area_set_param(
get_viewport().find_world_3d().space,
PhysicsServer3D.AREA_PARAM_GRAVITY_VECTOR,
Vector3.DOWN
)
changing_level = false
else:
$VictoryScreen.show()
await get_tree().create_timer(2).timeout
$StartMenu/AnimationPlayer.play_backwards(\"fadeout\")
Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE)
await get_tree().create_timer(1).timeout
$StartMenu.modulate = Color(1,1,1,1)
var level = level_scene.instantiate()
$Levels.add_child(level)
playing = true
PhysicsServer3D.area_set_param(
get_viewport().find_world_3d().space,
PhysicsServer3D.AREA_PARAM_GRAVITY_VECTOR,
Vector3.DOWN
)
changing_level = false
func stop_level() -> void:
PhysicsServer3D.area_set_param(get_viewport().find_world_3d().space, PhysicsServer3D.AREA_PARAM_GRAVITY, 1)
$Timer.paused = true
playing = false
changing_level = true
var next_level: PackedScene
var current_levels = $Levels.get_children(true)
if len(current_levels):
var current_level: Level = current_levels[0]
current_level.music.fadeOut(2)
var current_levels = get_current_levels()
for level in current_levels:
level.music.fadeOut(2)
await get_tree().create_timer(2).timeout
if current_level.get_meta(\"name\") == \"Base\":
next_level = forest
elif current_level.get_meta(\"name\") == \"Forest\":
next_level = night
for level in current_levels:
level.queue_free()
level.queue_free()
start_level(next_level)
if len(levels) > current_level_int + 1:
current_level_int += 1
start_level(levels[current_level_int])
else:
win_game()
func win_game() -> void:
$VictoryScreen.show()
await get_tree().create_timer(2).timeout
$StartMenu/AnimationPlayer.play_backwards(\"fadeout\")
Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE)
await get_tree().create_timer(1).timeout
$StartMenu.modulate = Color(1,1,1,1)
func restart_level() -> void:
if changing_level == false:
var current_levels = $Levels.get_children(true)
var current_levels = get_current_levels()
if len(current_levels):
pause_game()
changing_level = true
var current_level = current_levels[0]
var next_level: PackedScene = base
if current_level.get_meta(\"name\") == \"Forest\":
next_level = forest
elif current_level.get_meta(\"name\") == \"Night\":
next_level = night
for level in current_levels:
level.queue_free()
start_level(next_level)
start_level(levels[current_level_int])
func pause_game() -> void:
if $Levels.process_mode == PROCESS_MODE_INHERIT:
$Levels.process_mode = Node.PROCESS_MODE_DISABLED
$Timer.paused = true
playing = false
$PauseMenu.show()
Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE)
else:
$Levels.process_mode = Node.PROCESS_MODE_INHERIT
$Timer.paused = false
playing = true
$PauseMenu.hide()
Input.set_mouse_mode(Input.MOUSE_MODE_HIDDEN)
@ -105,21 +109,18 @@ func fullscreen_game() -> void:
else:
DisplayServer.window_set_mode(DisplayServer.WindowMode.WINDOW_MODE_WINDOWED)
func _on_btn_fullscreen_pressed() -> void:
fullscreen_game()
func _on_btn_start_pressed() -> void:
seconds_spent = 0.0
var current_levels = $Levels.get_children(true)
current_level_int = 0
var current_levels = get_current_levels()
for level in current_levels:
level.queue_free()
$Informations.show()
$StartMenu/AnimationPlayer.play(\"fadeout\")
Input.set_mouse_mode(Input.MOUSE_MODE_HIDDEN)
start_level(base)
$Timer.start(0)
start_level(levels[0])
func _on_animation_player_animation_finished(_anim_name: StringName) -> void:
if $StartMenu.modulate == Color(1,1,1,1):
@ -127,20 +128,19 @@ func _on_animation_player_animation_finished(_anim_name: StringName) -> void:
else:
$StartMenu.hide()
func _on_timer_timeout() -> void:
seconds_spent = snapped(seconds_spent + 0.10, 0.01)
var minutes = floor(seconds_spent / 60)
$Informations/MarginContainer/Timer.text = (\"%0*d\" % [2, minutes]) + \":\" + (\"%0*.1f\" % [4, seconds_spent - (minutes * 60)])
func update_timer(delta: float) -> void:
if playing:
seconds_spent += delta
var minutes = floor(seconds_spent / 60)
$Informations/MarginContainer/Timer.text = (\"%0*d\" % [2, minutes]) + \":\" + (\"%0*.2f\" % [5, seconds_spent - (minutes * 60)])
func _process(_delta: float) -> void:
var current_levels = $Levels.get_children(true)
func _process(delta: float) -> void:
update_timer(delta)
var current_levels = get_current_levels()
if len(current_levels):
var current_level = current_levels[0]
if is_instance_valid(current_level):
if \"velocity\" in current_level:
$Informations/MarginContainer/VBoxContainer/Speed.text = str(int(floor(current_level.velocity))) + \" km/h\"
if \"rings_count\" in current_level and \"finished_rings_count\" in current_level:
$Informations/MarginContainer/VBoxContainer/Rings.text = str(current_level.finished_rings_count) + \"/\" + str(current_level.rings_count)
$Informations/MarginContainer/VBoxContainer/Speed.text = str(int(floor(current_level.velocity))) + \" km/h\"
$Informations/MarginContainer/VBoxContainer/Rings.text = str(current_level.finished_rings_count) + \"/\" + str(len(current_level.rings))
func _unhandled_key_input(event: InputEvent) -> void:
if event.is_pressed() and event is InputEventKey:
@ -151,15 +151,6 @@ func _unhandled_key_input(event: InputEvent) -> void:
pause_game()
restart_level()
func _on_btn_resume_pressed() -> void:
pause_game()
func _on_btn_fullscreen_2_pressed() -> void:
fullscreen_game()
func _on_btn_restart_pressed() -> void:
restart_level()
func _on_btn_quit_pressed() -> void:
get_tree().quit()
"
@ -301,10 +292,7 @@ vertical_alignment = 1
[node name="Levels" type="Node" parent="."]
[node name="Demo" parent="Levels" instance=ExtResource("1_08svf")]
[node name="Timer" type="Timer" parent="."]
wait_time = 0.1
[node name="Demo" parent="Levels" instance=ExtResource("1_356j3")]
[node name="StartMenu" type="Control" parent="."]
layout_mode = 3
@ -483,11 +471,10 @@ layout_mode = 2
size_flags_vertical = 6
text = "QUIT game"
[connection signal="timeout" from="Timer" to="." method="_on_timer_timeout"]
[connection signal="pressed" from="StartMenu/VBoxContainer/MarginContainer/HBoxContainer/Buttons/HBoxContainer/Btn_Fullscreen" to="." method="_on_btn_fullscreen_pressed"]
[connection signal="pressed" from="StartMenu/VBoxContainer/MarginContainer/HBoxContainer/Buttons/HBoxContainer/Btn_Fullscreen" to="." method="fullscreen_game"]
[connection signal="pressed" from="StartMenu/VBoxContainer/MarginContainer/HBoxContainer/Buttons/HBoxContainer/Btn_Start" to="." method="_on_btn_start_pressed"]
[connection signal="animation_finished" from="StartMenu/AnimationPlayer" to="." method="_on_animation_player_animation_finished"]
[connection signal="pressed" from="PauseMenu/VBoxContainer/Btn_Resume" to="." method="_on_btn_resume_pressed"]
[connection signal="pressed" from="PauseMenu/VBoxContainer/Btn_Fullscreen2" to="." method="_on_btn_fullscreen_2_pressed"]
[connection signal="pressed" from="PauseMenu/VBoxContainer/Btn_Restart" to="." method="_on_btn_restart_pressed"]
[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"]