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,10 +1,10 @@
[gd_scene load_steps=4 format=3 uid="uid://cnnvwotv33u1b"] [gd_scene load_steps=11 format=3 uid="uid://cnnvwotv33u1b"]
[ext_resource type="PackedScene" uid="uid://dw0xl8644x166" path="res://elements/gravity.tscn" id="1_h0h2o"]
[ext_resource type="PackedScene" uid="uid://df5m716pd6mej" path="res://elements/sphere.tscn" id="2_ophnk"]
[sub_resource type="GDScript" id="GDScript_bnqcw"] [sub_resource type="GDScript" id="GDScript_bnqcw"]
script/source = "extends Node3D script/source = "class_name Player
extends Node3D
var velocity: Vector3 = Vector3(0, 0, 0)
func _physics_process(_delta: float) -> void: func _physics_process(_delta: float) -> void:
$SpotLightMain.position = $Sphere.position + Vector3(0, 5, 0) $SpotLightMain.position = $Sphere.position + Vector3(0, 5, 0)
@ -17,7 +17,7 @@ func _physics_process(_delta: float) -> void:
$Camera.position = $Sphere.position + Vector3(0, 0, 15) $Camera.position = $Sphere.position + Vector3(0, 0, 15)
## Angle of the camera, so the player can see where the ball is going ## Angle of the camera, so the player can see where the ball is going
var velocity: Vector3 = $Sphere.linear_velocity velocity = $Sphere.linear_velocity
var desired_x = max(min(velocity.y, 35), -35) var desired_x = max(min(velocity.y, 35), -35)
var desired_y = max(min(-velocity.x, 50), -50) var desired_y = max(min(-velocity.x, 50), -50)
var difference_x = $Camera.rotation_degrees.x - desired_x var difference_x = $Camera.rotation_degrees.x - desired_x
@ -31,13 +31,43 @@ func _physics_process(_delta: float) -> void:
$Camera.fov = default_fov + (total_velocity / 12) $Camera.fov = default_fov + (total_velocity / 12)
" "
[sub_resource type="PhysicsMaterial" id="PhysicsMaterial_vumbr"]
bounce = 0.2
[sub_resource type="SphereShape3D" id="SphereShape3D_xfgrm"]
[sub_resource type="Gradient" id="Gradient_bgp4x"]
colors = PackedColorArray(0.942957, 7.89344e-06, 0.597148, 1, 0, 0.9912, 0.9912, 1)
[sub_resource type="GradientTexture2D" id="GradientTexture2D_5d6uk"]
gradient = SubResource("Gradient_bgp4x")
fill_from = Vector2(0.504951, 0.00495049)
fill_to = Vector2(0.549505, 1)
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_qcgmu"]
albedo_texture = SubResource("GradientTexture2D_5d6uk")
[sub_resource type="SphereMesh" id="SphereMesh_bor8g"]
material = SubResource("StandardMaterial3D_qcgmu")
[sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_4tofj"]
direction = Vector3(0, 0, 0)
gravity = Vector3(0, 0, 0)
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_2ybet"]
vertex_color_use_as_albedo = true
albedo_color = Color(0, 0.734117, 0.734117, 1)
[sub_resource type="SphereMesh" id="SphereMesh_1m3ut"]
material = SubResource("StandardMaterial3D_2ybet")
radius = 0.2
height = 0.4
radial_segments = 8
rings = 4
[node name="Player" type="Node3D"] [node name="Player" type="Node3D"]
script = SubResource("GDScript_bnqcw") script = SubResource("GDScript_bnqcw")
[node name="Gravity" parent="." instance=ExtResource("1_h0h2o")]
[node name="Sphere" parent="." instance=ExtResource("2_ophnk")]
[node name="Camera" type="Camera3D" parent="."] [node name="Camera" type="Camera3D" parent="."]
current = true current = true
@ -61,3 +91,20 @@ spot_range = 50.0
[node name="SpotLightBottom" type="SpotLight3D" parent="."] [node name="SpotLightBottom" type="SpotLight3D" parent="."]
transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0, 0, 0) transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0, 0, 0)
spot_range = 50.0 spot_range = 50.0
[node name="Sphere" type="RigidBody3D" parent="."]
collision_priority = 100.0
axis_lock_linear_z = true
physics_material_override = SubResource("PhysicsMaterial_vumbr")
contact_monitor = true
[node name="CollisionShape3D" type="CollisionShape3D" parent="Sphere"]
shape = SubResource("SphereShape3D_xfgrm")
[node name="MeshInstance3D" type="MeshInstance3D" parent="Sphere"]
mesh = SubResource("SphereMesh_bor8g")
[node name="GPUParticles3D" type="GPUParticles3D" parent="Sphere"]
amount = 16
process_material = SubResource("ParticleProcessMaterial_4tofj")
draw_pass_1 = SubResource("SphereMesh_1m3ut")

View file

@ -5,7 +5,8 @@
[ext_resource type="AudioStream" uid="uid://cvvs74ep5d4wt" path="res://sounds/ring2.ogg" id="3_lkqw0"] [ext_resource type="AudioStream" uid="uid://cvvs74ep5d4wt" path="res://sounds/ring2.ogg" id="3_lkqw0"]
[sub_resource type="GDScript" id="GDScript_86vhg"] [sub_resource type="GDScript" id="GDScript_86vhg"]
script/source = "extends CSGTorus3D script/source = "class_name Ring
extends CSGTorus3D
var happy_material = preload(\"res://graphics/happy_material.tres\") var happy_material = preload(\"res://graphics/happy_material.tres\")

View file

@ -1,52 +0,0 @@
[gd_scene load_steps=10 format=3 uid="uid://df5m716pd6mej"]
[sub_resource type="PhysicsMaterial" id="PhysicsMaterial_vumbr"]
bounce = 0.2
[sub_resource type="SphereShape3D" id="SphereShape3D_xfgrm"]
[sub_resource type="Gradient" id="Gradient_bgp4x"]
colors = PackedColorArray(0.942957, 7.89344e-06, 0.597148, 1, 0, 0.9912, 0.9912, 1)
[sub_resource type="GradientTexture2D" id="GradientTexture2D_5d6uk"]
gradient = SubResource("Gradient_bgp4x")
fill_from = Vector2(0.504951, 0.00495049)
fill_to = Vector2(0.549505, 1)
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_qcgmu"]
albedo_texture = SubResource("GradientTexture2D_5d6uk")
[sub_resource type="SphereMesh" id="SphereMesh_bor8g"]
material = SubResource("StandardMaterial3D_qcgmu")
[sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_4tofj"]
direction = Vector3(0, 0, 0)
gravity = Vector3(0, 0, 0)
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_2ybet"]
vertex_color_use_as_albedo = true
albedo_color = Color(0, 0.734117, 0.734117, 1)
[sub_resource type="SphereMesh" id="SphereMesh_1m3ut"]
material = SubResource("StandardMaterial3D_2ybet")
radius = 0.2
height = 0.4
radial_segments = 8
rings = 4
[node name="Sphere" type="RigidBody3D"]
collision_priority = 100.0
axis_lock_linear_z = true
physics_material_override = SubResource("PhysicsMaterial_vumbr")
contact_monitor = true
[node name="CollisionShape3D" type="CollisionShape3D" parent="."]
shape = SubResource("SphereShape3D_xfgrm")
[node name="MeshInstance3D" type="MeshInstance3D" parent="."]
mesh = SubResource("SphereMesh_bor8g")
[node name="GPUParticles3D" type="GPUParticles3D" parent="."]
amount = 16
process_material = SubResource("ParticleProcessMaterial_4tofj")
draw_pass_1 = SubResource("SphereMesh_1m3ut")

View file

@ -1,15 +1,20 @@
[gd_scene load_steps=11 format=3 uid="uid://ccgnnif026wb4"] [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"] [sub_resource type="GDScript" id="GDScript_8n212"]
script/source = "extends Node 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 changing_level: bool = false
var base = preload(\"res://levels/base/level.tscn\")
var forest = preload(\"res://levels/forest/level.tscn\") var current_level_int: int = 0
var night = preload(\"res://levels/night/level.tscn\") var levels = [
preload(\"res://levels/base/level.tscn\"),
preload(\"res://levels/forest/level.tscn\"),
preload(\"res://levels/night/level.tscn\"),
]
func _ready() -> void: func _ready() -> void:
var os_name = OS.get_name() var os_name = OS.get_name()
@ -24,77 +29,76 @@ func _ready() -> void:
$StartMenu/VBoxContainer/MarginContainer2/Notice.text = \"dev \" $StartMenu/VBoxContainer/MarginContainer2/Notice.text = \"dev \"
$StartMenu/VBoxContainer/MarginContainer2/Notice.text += \"build \" + ProjectSettings.get_setting(\"application/config/version\") + \" (\" + os_name + \")\" $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: func start_level(level_scene: PackedScene) -> void:
$VictoryScreen.hide() $VictoryScreen.hide()
if level_scene and level_scene.can_instantiate(): var level = level_scene.instantiate()
var level = level_scene.instantiate() $Levels.add_child(level)
$Levels.add_child(level) playing = true
$Timer.paused = false PhysicsServer3D.area_set_param(
AudioServer.set_bus_volume_db(0, 0) get_viewport().find_world_3d().space,
PhysicsServer3D.area_set_param( PhysicsServer3D.AREA_PARAM_GRAVITY_VECTOR,
get_viewport().find_world_3d().space, Vector3.DOWN
PhysicsServer3D.AREA_PARAM_GRAVITY_VECTOR, )
Vector3.DOWN changing_level = false
)
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)
func stop_level() -> void: func stop_level() -> void:
PhysicsServer3D.area_set_param(get_viewport().find_world_3d().space, PhysicsServer3D.AREA_PARAM_GRAVITY, 1) PhysicsServer3D.area_set_param(get_viewport().find_world_3d().space, PhysicsServer3D.AREA_PARAM_GRAVITY, 1)
$Timer.paused = true playing = false
changing_level = true changing_level = true
var next_level: PackedScene var current_levels = get_current_levels()
var current_levels = $Levels.get_children(true) for level in current_levels:
if len(current_levels): level.music.fadeOut(2)
var current_level: Level = current_levels[0]
current_level.music.fadeOut(2)
await get_tree().create_timer(2).timeout await get_tree().create_timer(2).timeout
level.queue_free()
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()
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: func restart_level() -> void:
if changing_level == false: if changing_level == false:
var current_levels = $Levels.get_children(true) var current_levels = get_current_levels()
if len(current_levels): if len(current_levels):
pause_game() pause_game()
changing_level = true 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: for level in current_levels:
level.queue_free() level.queue_free()
start_level(next_level) start_level(levels[current_level_int])
func pause_game() -> void: func pause_game() -> void:
if $Levels.process_mode == PROCESS_MODE_INHERIT: if $Levels.process_mode == PROCESS_MODE_INHERIT:
$Levels.process_mode = Node.PROCESS_MODE_DISABLED $Levels.process_mode = Node.PROCESS_MODE_DISABLED
$Timer.paused = true playing = false
$PauseMenu.show() $PauseMenu.show()
Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE) Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE)
else: else:
$Levels.process_mode = Node.PROCESS_MODE_INHERIT $Levels.process_mode = Node.PROCESS_MODE_INHERIT
$Timer.paused = false playing = true
$PauseMenu.hide() $PauseMenu.hide()
Input.set_mouse_mode(Input.MOUSE_MODE_HIDDEN) Input.set_mouse_mode(Input.MOUSE_MODE_HIDDEN)
@ -105,21 +109,18 @@ func fullscreen_game() -> void:
else: else:
DisplayServer.window_set_mode(DisplayServer.WindowMode.WINDOW_MODE_WINDOWED) DisplayServer.window_set_mode(DisplayServer.WindowMode.WINDOW_MODE_WINDOWED)
func _on_btn_fullscreen_pressed() -> void:
fullscreen_game()
func _on_btn_start_pressed() -> void: func _on_btn_start_pressed() -> void:
seconds_spent = 0.0 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: for level in current_levels:
level.queue_free() level.queue_free()
$Informations.show() $Informations.show()
$StartMenu/AnimationPlayer.play(\"fadeout\") $StartMenu/AnimationPlayer.play(\"fadeout\")
Input.set_mouse_mode(Input.MOUSE_MODE_HIDDEN) Input.set_mouse_mode(Input.MOUSE_MODE_HIDDEN)
start_level(base) start_level(levels[0])
$Timer.start(0)
func _on_animation_player_animation_finished(_anim_name: StringName) -> void: func _on_animation_player_animation_finished(_anim_name: StringName) -> void:
if $StartMenu.modulate == Color(1,1,1,1): if $StartMenu.modulate == Color(1,1,1,1):
@ -127,20 +128,19 @@ func _on_animation_player_animation_finished(_anim_name: StringName) -> void:
else: else:
$StartMenu.hide() $StartMenu.hide()
func _on_timer_timeout() -> void: func update_timer(delta: float) -> void:
seconds_spent = snapped(seconds_spent + 0.10, 0.01) if playing:
var minutes = floor(seconds_spent / 60) seconds_spent += delta
$Informations/MarginContainer/Timer.text = (\"%0*d\" % [2, minutes]) + \":\" + (\"%0*.1f\" % [4, seconds_spent - (minutes * 60)]) 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: func _process(delta: float) -> void:
var current_levels = $Levels.get_children(true) update_timer(delta)
var current_levels = get_current_levels()
if len(current_levels): if len(current_levels):
var current_level = current_levels[0] var current_level = current_levels[0]
if is_instance_valid(current_level): $Informations/MarginContainer/VBoxContainer/Speed.text = str(int(floor(current_level.velocity))) + \" km/h\"
if \"velocity\" in current_level: $Informations/MarginContainer/VBoxContainer/Rings.text = str(current_level.finished_rings_count) + \"/\" + str(len(current_level.rings))
$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)
func _unhandled_key_input(event: InputEvent) -> void: func _unhandled_key_input(event: InputEvent) -> void:
if event.is_pressed() and event is InputEventKey: if event.is_pressed() and event is InputEventKey:
@ -151,15 +151,6 @@ func _unhandled_key_input(event: InputEvent) -> void:
pause_game() pause_game()
restart_level() 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: func _on_btn_quit_pressed() -> void:
get_tree().quit() get_tree().quit()
" "
@ -301,10 +292,7 @@ vertical_alignment = 1
[node name="Levels" type="Node" parent="."] [node name="Levels" type="Node" parent="."]
[node name="Demo" parent="Levels" instance=ExtResource("1_08svf")] [node name="Demo" parent="Levels" instance=ExtResource("1_356j3")]
[node name="Timer" type="Timer" parent="."]
wait_time = 0.1
[node name="StartMenu" type="Control" parent="."] [node name="StartMenu" type="Control" parent="."]
layout_mode = 3 layout_mode = 3
@ -483,11 +471,10 @@ layout_mode = 2
size_flags_vertical = 6 size_flags_vertical = 6
text = "QUIT game" 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="fullscreen_game"]
[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_Start" to="." method="_on_btn_start_pressed"] [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="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_Resume" to="." method="pause_game"]
[connection signal="pressed" from="PauseMenu/VBoxContainer/Btn_Fullscreen2" to="." method="_on_btn_fullscreen_2_pressed"] [connection signal="pressed" from="PauseMenu/VBoxContainer/Btn_Fullscreen2" to="." method="fullscreen_game"]
[connection signal="pressed" from="PauseMenu/VBoxContainer/Btn_Restart" to="." method="_on_btn_restart_pressed"] [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"] [connection signal="pressed" from="PauseMenu/VBoxContainer/Btn_Quit" to="." method="_on_btn_quit_pressed"]

View file

@ -1,17 +1,18 @@
[gd_scene load_steps=8 format=3 uid="uid://b0mhosbyt1fit"] [gd_scene load_steps=8 format=3 uid="uid://ovtknjyj83gh"]
[ext_resource type="Material" uid="uid://brwwlwb1rpro7" path="res://graphics/unhappy_material.tres" id="1_dwsqy"]
[ext_resource type="PackedScene" uid="uid://ygvokp5f78i5" path="res://levels/base/environment.tscn" id="1_n7fd8"] [ext_resource type="PackedScene" uid="uid://ygvokp5f78i5" path="res://levels/base/environment.tscn" id="1_n7fd8"]
[ext_resource type="Script" uid="uid://w3fetao1pegm" path="res://levels/level.gd" id="1_rj40i"] [ext_resource type="Script" uid="uid://w3fetao1pegm" path="res://levels/level.gd" id="1_rj40i"]
[ext_resource type="PackedScene" uid="uid://cnnvwotv33u1b" path="res://elements/player.tscn" id="2_b00jj"] [ext_resource type="PackedScene" uid="uid://cnnvwotv33u1b" path="res://elements/player.tscn" id="2_b00jj"]
[ext_resource type="PackedScene" uid="uid://cpm3laywhlbq5" path="res://elements/ring.tscn" id="3_hel5x"] [ext_resource type="PackedScene" uid="uid://cpm3laywhlbq5" path="res://elements/ring.tscn" id="3_hel5x"]
[ext_resource type="PackedScene" uid="uid://dw0xl8644x166" path="res://elements/gravity.tscn" id="3_muudg"]
[ext_resource type="PackedScene" uid="uid://c77bli40240nk" path="res://elements/sign.tscn" id="4_atq6y"] [ext_resource type="PackedScene" uid="uid://c77bli40240nk" path="res://elements/sign.tscn" id="4_atq6y"]
[ext_resource type="PackedScene" uid="uid://dnuakh7n3fuij" path="res://levels/base/music.tscn" id="4_uq42r"] [ext_resource type="PackedScene" uid="uid://dnuakh7n3fuij" path="res://levels/base/music.tscn" id="4_uq42r"]
[node name="Base" type="Node3D"] [node name="Base" type="Node3D"]
script = ExtResource("1_rj40i") script = ExtResource("1_rj40i")
metadata/material = ExtResource("1_dwsqy") metadata/_custom_type_script = "uid://w3fetao1pegm"
metadata/name = "Base"
[node name="Gravity" parent="." instance=ExtResource("3_muudg")]
[node name="Environment" parent="." instance=ExtResource("1_n7fd8")] [node name="Environment" parent="." instance=ExtResource("1_n7fd8")]

32
levels/demo.tscn Normal file
View file

@ -0,0 +1,32 @@
[gd_scene load_steps=7 format=3 uid="uid://dtfybhftwfn00"]
[ext_resource type="Script" uid="uid://w3fetao1pegm" path="res://levels/level.gd" id="1_scm0b"]
[ext_resource type="PackedScene" uid="uid://dw0xl8644x166" path="res://elements/gravity.tscn" id="2_fo4i1"]
[ext_resource type="PackedScene" uid="uid://b6gnffoboc5j5" path="res://levels/night/environment.tscn" id="3_j4ado"]
[ext_resource type="PackedScene" uid="uid://drfy3vhe6skp1" path="res://levels/night/music.tscn" id="4_qr8kk"]
[ext_resource type="PackedScene" uid="uid://cnnvwotv33u1b" path="res://elements/player.tscn" id="5_j5vh3"]
[ext_resource type="PackedScene" uid="uid://cpm3laywhlbq5" path="res://elements/ring.tscn" id="6_st6rs"]
[node name="Demo" type="Node3D"]
script = ExtResource("1_scm0b")
metadata/_custom_type_script = "uid://w3fetao1pegm"
[node name="Gravity" parent="." instance=ExtResource("2_fo4i1")]
[node name="Environment" parent="." instance=ExtResource("3_j4ado")]
[node name="Music" parent="." instance=ExtResource("4_qr8kk")]
[node name="Player" parent="." instance=ExtResource("5_j5vh3")]
[node name="Rings" type="Node3D" parent="."]
[node name="Ring" parent="Rings" instance=ExtResource("6_st6rs")]
transform = Transform3D(1, 0, 0, 0, -4.37114e-08, -1, 0, 1, -4.37114e-08, 0, 15.6731, -50)
visible = false
[node name="Ring2" parent="Rings" instance=ExtResource("6_st6rs")]
transform = Transform3D(-4.37114e-08, -1, 0, 1, -4.37114e-08, 0, 0, 0, 1, 10, -10, 0)
[node name="Ring3" parent="Rings" instance=ExtResource("6_st6rs")]
transform = Transform3D(-4.37114e-08, -1, 0, 1, -4.37114e-08, 0, 0, 0, 1, -10, -10, 0)

View file

@ -1,29 +0,0 @@
[gd_scene load_steps=6 format=3 uid="uid://n40mg5tc3bnv"]
[ext_resource type="Script" uid="uid://w3fetao1pegm" path="res://levels/level.gd" id="1_ifscd"]
[ext_resource type="PackedScene" uid="uid://b6gnffoboc5j5" path="res://levels/night/environment.tscn" id="2_v6rg2"]
[ext_resource type="PackedScene" uid="uid://drfy3vhe6skp1" path="res://levels/night/music.tscn" id="3_fb0ct"]
[ext_resource type="PackedScene" uid="uid://cnnvwotv33u1b" path="res://elements/player.tscn" id="4_ge8id"]
[ext_resource type="PackedScene" uid="uid://cpm3laywhlbq5" path="res://elements/ring.tscn" id="5_j060p"]
[node name="Demo" type="Node3D"]
script = ExtResource("1_ifscd")
metadata/name = "Demo"
[node name="Environment" parent="." instance=ExtResource("2_v6rg2")]
[node name="Music" parent="." instance=ExtResource("3_fb0ct")]
[node name="Player" parent="." instance=ExtResource("4_ge8id")]
[node name="Rings" type="Node3D" parent="."]
[node name="Ring" parent="Rings" instance=ExtResource("5_j060p")]
transform = Transform3D(1, 0, 0, 0, -4.37114e-08, -1, 0, 1, -4.37114e-08, 0, 15.6731, -50)
visible = false
[node name="Ring2" parent="Rings" instance=ExtResource("5_j060p")]
transform = Transform3D(-4.37114e-08, -1, 0, 1, -4.37114e-08, 0, 0, 0, 1, 10, -10, 0)
[node name="Ring3" parent="Rings" instance=ExtResource("5_j060p")]
transform = Transform3D(-4.37114e-08, -1, 0, 1, -4.37114e-08, 0, 0, 0, 1, -10, -10, 0)

View file

@ -1,7 +1,8 @@
[gd_scene load_steps=11 format=3 uid="uid://dfvuxfxc6ooya"] [gd_scene load_steps=12 format=3 uid="uid://e1761h6d522a"]
[ext_resource type="PackedScene" uid="uid://6nfv4ewj3jop" path="res://levels/forest/environment.tscn" id="1_7clrg"] [ext_resource type="PackedScene" uid="uid://6nfv4ewj3jop" path="res://levels/forest/environment.tscn" id="1_7clrg"]
[ext_resource type="Script" uid="uid://w3fetao1pegm" path="res://levels/level.gd" id="1_fdxcj"] [ext_resource type="Script" uid="uid://w3fetao1pegm" path="res://levels/level.gd" id="1_fdxcj"]
[ext_resource type="PackedScene" uid="uid://dw0xl8644x166" path="res://elements/gravity.tscn" id="2_gxmta"]
[ext_resource type="PackedScene" uid="uid://cnnvwotv33u1b" path="res://elements/player.tscn" id="2_mjogx"] [ext_resource type="PackedScene" uid="uid://cnnvwotv33u1b" path="res://elements/player.tscn" id="2_mjogx"]
[ext_resource type="PackedScene" uid="uid://cakmsiye3hjfe" path="res://levels/forest/music.tscn" id="3_n1xsx"] [ext_resource type="PackedScene" uid="uid://cakmsiye3hjfe" path="res://levels/forest/music.tscn" id="3_n1xsx"]
[ext_resource type="PackedScene" uid="uid://cpm3laywhlbq5" path="res://elements/ring.tscn" id="4_p8yhq"] [ext_resource type="PackedScene" uid="uid://cpm3laywhlbq5" path="res://elements/ring.tscn" id="4_p8yhq"]
@ -30,7 +31,9 @@ reflected_light_source = 2
[node name="Forest" type="Node3D"] [node name="Forest" type="Node3D"]
script = ExtResource("1_fdxcj") script = ExtResource("1_fdxcj")
metadata/name = "Forest" metadata/_custom_type_script = "uid://w3fetao1pegm"
[node name="Gravity" parent="." instance=ExtResource("2_gxmta")]
[node name="DirectionalLight3D" type="DirectionalLight3D" parent="."] [node name="DirectionalLight3D" type="DirectionalLight3D" parent="."]
transform = Transform3D(-0.920505, 0.195366, -0.338383, 0, 0.866025, 0.5, 0.390731, 0.460252, -0.797181, 0, 0, 0) transform = Transform3D(-0.920505, 0.195366, -0.338383, 0, 0.866025, 0.5, 0.390731, 0.460252, -0.797181, 0, 0, 0)

View file

@ -3,10 +3,8 @@ extends Node3D
var music: Music var music: Music
var velocity: float = 0.0 var velocity: float = 0.0
var rings_count = 72727
var finished_rings_count = 0
var rings: Array[Node] = [] var rings: Array[Node] = []
var finished_rings_count = 0
func _ready() -> void: func _ready() -> void:
var children = get_children() var children = get_children()
@ -18,13 +16,12 @@ func _ready() -> void:
var rings_node = get_node("Rings") var rings_node = get_node("Rings")
assert(is_instance_valid(rings_node), self.name + " has no rings!") assert(is_instance_valid(rings_node), self.name + " has no rings!")
rings = rings_node.get_children() rings = rings_node.get_children()
rings_count = len(rings)
for ring in rings: for ring in rings:
ring.connect("collect_signal", do_we_end_yet) ring.connect("collect_signal", do_we_end_yet)
func do_we_end_yet(): func do_we_end_yet():
finished_rings_count += 1 finished_rings_count += 1
if finished_rings_count >= rings_count: if finished_rings_count >= len(rings):
var game = get_parent().get_parent() var game = get_parent().get_parent()
if is_instance_valid(game) and game.has_method("stop_level"): if is_instance_valid(game) and game.has_method("stop_level"):
game.stop_level() game.stop_level()

View file

@ -1,8 +1,9 @@
[gd_scene load_steps=9 format=3 uid="uid://c2rlx31om4gey"] [gd_scene load_steps=10 format=3 uid="uid://drnqmu4lka22d"]
[ext_resource type="Script" uid="uid://w3fetao1pegm" path="res://levels/level.gd" id="1_3m1pa"] [ext_resource type="Script" uid="uid://w3fetao1pegm" path="res://levels/level.gd" id="1_3m1pa"]
[ext_resource type="PackedScene" uid="uid://drfy3vhe6skp1" path="res://levels/night/music.tscn" id="1_npc74"] [ext_resource type="PackedScene" uid="uid://drfy3vhe6skp1" path="res://levels/night/music.tscn" id="1_npc74"]
[ext_resource type="PackedScene" uid="uid://cnnvwotv33u1b" path="res://elements/player.tscn" id="2_bc1ig"] [ext_resource type="PackedScene" uid="uid://cnnvwotv33u1b" path="res://elements/player.tscn" id="2_bc1ig"]
[ext_resource type="PackedScene" uid="uid://dw0xl8644x166" path="res://elements/gravity.tscn" id="2_lfplq"]
[ext_resource type="PackedScene" uid="uid://b6gnffoboc5j5" path="res://levels/night/environment.tscn" id="2_wintp"] [ext_resource type="PackedScene" uid="uid://b6gnffoboc5j5" path="res://levels/night/environment.tscn" id="2_wintp"]
[ext_resource type="PackedScene" uid="uid://cpm3laywhlbq5" path="res://elements/ring.tscn" id="4_brcr0"] [ext_resource type="PackedScene" uid="uid://cpm3laywhlbq5" path="res://elements/ring.tscn" id="4_brcr0"]
[ext_resource type="PackedScene" uid="uid://c77bli40240nk" path="res://elements/sign.tscn" id="6_36yav"] [ext_resource type="PackedScene" uid="uid://c77bli40240nk" path="res://elements/sign.tscn" id="6_36yav"]
@ -11,7 +12,9 @@
[node name="Night" type="Node3D"] [node name="Night" type="Node3D"]
script = ExtResource("1_3m1pa") script = ExtResource("1_3m1pa")
metadata/name = "Night" metadata/_custom_type_script = "uid://w3fetao1pegm"
[node name="Gravity" parent="." instance=ExtResource("2_lfplq")]
[node name="Environment" parent="." instance=ExtResource("2_wintp")] [node name="Environment" parent="." instance=ExtResource("2_wintp")]