"save" & animate main menu, fix pause menu & restart (#3)

pause menu had classic issues of mouse inputs being eaten by something else (gravity)
restart didn't have working code anymore because of level logic changes
also remove the demo scene which I believe is unused beyond the jam version
This commit is contained in:
Taevas 2025-04-27 21:30:03 +02:00
parent 71441a9335
commit 38897c706a
Signed by: Taevas
SSH key fingerprint: SHA256:Y5Hv18xwPvUKSlgkx1sPnRO3L2mc03ehC7BzrnZVEyY
5 changed files with 184 additions and 75 deletions

View file

@ -137,6 +137,7 @@ anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
mouse_filter = 2
script = SubResource("GDScript_3yq1l")
[node name="Direction" type="TextureRect" parent="."]
@ -155,6 +156,7 @@ grow_horizontal = 2
grow_vertical = 2
scale = Vector2(0.3, 0.3)
pivot_offset = Vector2(400, 400)
mouse_filter = 2
texture = ExtResource("1_4mbho")
script = SubResource("GDScript_my602")

View file

@ -13,6 +13,7 @@ var changing_level: bool = false
var main_menu: Node
var current_level: Level
var current_level_scene: PackedScene
const res_main_menu = preload(\"res://menus/main/main_menu.tscn\")
@ -41,17 +42,19 @@ func _ready() -> void:
func set_main_menu():
Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE)
if !is_instance_valid(main_menu):
main_menu = res_main_menu.instantiate()
main_menu.connect(\"request_play_level\", start_level)
add_child(main_menu)
func start_level(level: Level) -> void:
func start_level(level: Level, scene: PackedScene) -> void:
if is_instance_valid(current_level):
current_level.queue_free()
if is_instance_valid(main_menu):
main_menu.queue_free()
if is_instance_valid(main_menu) and self.is_ancestor_of(main_menu):
self.remove_child(main_menu)
current_level = level
current_level_scene = scene
add_child(current_level)
current_level.connect(\"completed\", finish_current_level)
@ -62,6 +65,7 @@ func start_level(level: Level) -> void:
$GUI.show()
Input.set_mouse_mode(Input.MOUSE_MODE_HIDDEN)
pause_game(false)
playing = true
PhysicsServer3D.area_set_param(
@ -98,20 +102,25 @@ func win_game() -> void:
$VictoryScreen.hide()
func restart_level() -> void:
return #idk yet
if !current_level:
return
if current_level_scene is not PackedScene:
print(\"Tried to restart the level despite not having the level scene\")
return
start_level(current_level_scene.instantiate(), current_level_scene)
func pause_game(to_pause: bool) -> void:
if is_instance_valid(current_level) or changing_level:
if !is_instance_valid(current_level) 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
current_level.process_mode = Node.PROCESS_MODE_DISABLED
playing = false
pause_menu.show()
Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE)
else:
$Levels.process_mode = Node.PROCESS_MODE_INHERIT
current_level.process_mode = Node.PROCESS_MODE_INHERIT
playing = true
pause_menu.hide()
Input.set_mouse_mode(Input.MOUSE_MODE_HIDDEN)
@ -150,7 +159,7 @@ anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
mouse_filter = 1
mouse_filter = 2
[node name="TopLeft" type="MarginContainer" parent="GUI"]
layout_mode = 1
@ -202,6 +211,7 @@ anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
mouse_filter = 2
[node name="Label" type="Label" parent="VictoryScreen"]
layout_mode = 1
@ -215,8 +225,6 @@ label_settings = SubResource("LabelSettings_1bs00")
horizontal_alignment = 1
vertical_alignment = 1
[node name="PauseMenu" parent="." instance=ExtResource("4_3bfj3")]
[node name="DevInfos" type="Label" parent="."]
anchors_preset = 12
anchor_top = 1.0
@ -226,3 +234,5 @@ offset_top = -23.0
grow_horizontal = 2
grow_vertical = 0
horizontal_alignment = 1
[node name="PauseMenu" parent="." instance=ExtResource("4_3bfj3")]

View file

@ -1,50 +0,0 @@
[gd_scene load_steps=11 format=3 uid="uid://0re2mcnpub4e"]
[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://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"]
[sub_resource type="Gradient" id="Gradient_x6q8u"]
[sub_resource type="GradientTexture1D" id="GradientTexture1D_lu6nv"]
gradient = SubResource("Gradient_x6q8u")
[sub_resource type="PanoramaSkyMaterial" id="PanoramaSkyMaterial_4yv3y"]
panorama = SubResource("GradientTexture1D_lu6nv")
[sub_resource type="Sky" id="Sky_ys2yp"]
sky_material = SubResource("PanoramaSkyMaterial_4yv3y")
[sub_resource type="Environment" id="Environment_8o42c"]
background_mode = 1
sky = SubResource("Sky_ys2yp")
ambient_light_source = 2
ambient_light_color = Color(1, 1, 1, 1)
reflected_light_source = 2
[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" type="WorldEnvironment" parent="."]
environment = SubResource("Environment_8o42c")
[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

@ -13,6 +13,12 @@ const levels = [
\"res://levels/night/level.tscn\",
]
var loaded_level: Level
var loaded_level_scene: PackedScene
var loaded_level_path: String
func _enter_tree() -> void:
if len(loaded_level_path):
prepare_level(loaded_level_path)
func _ready() -> void:
var placeholders := carousel.get_children()
@ -30,8 +36,9 @@ func prepare_level(level_scene_path: String):
loaded_level.queue_free()
ResourceLoader.load_threaded_request(level_scene_path)
var level_scene = ResourceLoader.load_threaded_get(level_scene_path)
loaded_level = level_scene.instantiate()
loaded_level_scene = ResourceLoader.load_threaded_get(level_scene_path)
loaded_level = loaded_level_scene.instantiate()
loaded_level_path = level_scene_path
$VBoxContainer/Presentation/Thumbnail.texture = loaded_level.thumbnail
$VBoxContainer/Presentation/MarginContainer/VBoxContainer/LevelName.text = \"The \" + loaded_level.id.capitalize()
$VBoxContainer/Presentation.show()
@ -50,7 +57,7 @@ func display_file_data(data: Variant) -> void:
func _on_play_button_pressed() -> void:
if is_instance_valid(loaded_level):
request_play_level.emit(loaded_level)
request_play_level.emit(loaded_level, loaded_level_scene)
func seconds_to_readable(seconds: float) -> String:
var minutes: int = floor(seconds / 60)

View file

@ -1,4 +1,4 @@
[gd_scene load_steps=10 format=3 uid="uid://ikeidrgprk8k"]
[gd_scene load_steps=16 format=3 uid="uid://ikeidrgprk8k"]
[ext_resource type="PackedScene" uid="uid://wlhsarkeqe8r" path="res://menus/main/panel.tscn" id="1_5vmsf"]
[ext_resource type="PackedScene" uid="uid://cnnvwotv33u1b" path="res://elements/player.tscn" id="2_2rexg"]
@ -8,6 +8,14 @@ script/source = "extends Node3D
signal request_play_level
func _enter_tree() -> void:
$Camera3D/AnimationPlayer.play_backwards(\"camera_pan\")
PhysicsServer3D.area_set_param(
get_viewport().find_world_3d().space,
PhysicsServer3D.AREA_PARAM_GRAVITY_VECTOR,
Vector3.DOWN
)
# Display on Panel 1
const res_initial_menu = preload(\"res://menus/main/initial_menu.tscn\")
func _ready() -> void:
@ -38,7 +46,11 @@ func start() -> void:
const res_level_selection_menu = preload(\"res://menus/main/level_selection_menu.tscn\")
func level_selection() -> void:
var level_selection_menu := res_level_selection_menu.instantiate()
level_selection_menu.connect(\"request_play_level\", func(level: Level): request_play_level.emit(level))
level_selection_menu.connect(\"request_play_level\", func(level: Level, scene: PackedScene):
$Camera3D/AnimationPlayer.play(\"camera_pan\")
await get_tree().create_timer(1.5).timeout
request_play_level.emit(level, scene)
)
$Menus/Panel3.change_menu(level_selection_menu)
rotate_cube_to(180)
@ -46,14 +58,18 @@ func level_selection() -> void:
func rotate_cube_to(degrees: int) -> void:
if $Menus/AnimationPlayer.is_playing():
return
degrees = -degrees
var animation: Animation = $Menus/AnimationPlayer.get_animation(\"rotate\")
var new_rotation = Vector3(0, degrees, 0)
animation.track_set_key_value(0, 0, $Menus.rotation_degrees)
animation.track_set_key_value(0, 1, new_rotation)
var cube_animation: Animation = $Menus/AnimationPlayer.get_animation(\"rotate\")
cube_animation.track_set_key_value(0, 0, $Menus.rotation_degrees)
cube_animation.track_set_key_value(0, 1, Vector3(0, -degrees, 0))
$Menus/AnimationPlayer.play(\"rotate\")
if $AnimationPlayer.is_playing():
await get_tree().create_timer($AnimationPlayer.current_animation_length).timeout
var sky_animation: Animation = $AnimationPlayer.get_animation(\"sky_brightness\")
sky_animation.track_set_key_value(0, 0, $WorldEnvironment.environment.sky.sky_material.energy_multiplier)
sky_animation.track_set_key_value(0, 1, max(90, degrees * 2) / 90)
$AnimationPlayer.play(\"sky_brightness\")
"
[sub_resource type="Animation" id="Animation_0jxef"]
@ -94,8 +110,82 @@ _data = {
&"rotate": SubResource("Animation_bt14i")
}
[sub_resource type="Animation" id="Animation_2rexg"]
length = 0.001
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("WorldEnvironment:environment:sky:sky_material:energy_multiplier")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [1.0]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("Camera3D:fov")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [40.0]
}
tracks/2/type = "value"
tracks/2/imported = false
tracks/2/enabled = true
tracks/2/path = NodePath("Camera3D:position")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [Vector3(0, 0, 2.5)]
}
[sub_resource type="Animation" id="Animation_jinmx"]
resource_name = "camera_pan"
length = 1.5
step = 0.1
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("Camera3D:fov")
tracks/0/interp = 2
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0, 1.5),
"transitions": PackedFloat32Array(1, 1),
"update": 0,
"values": [40.0, 75.0]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("Camera3D:position")
tracks/1/interp = 2
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0, 1.5),
"transitions": PackedFloat32Array(1, 1),
"update": 0,
"values": [Vector3(0, 0, 2.5), Vector3(0, 0, 15)]
}
[sub_resource type="AnimationLibrary" id="AnimationLibrary_jinmx"]
_data = {
&"RESET": SubResource("Animation_2rexg"),
&"camera_pan": SubResource("Animation_jinmx")
}
[sub_resource type="PhysicalSkyMaterial" id="PhysicalSkyMaterial_bt14i"]
ground_color = Color(0.794232, 0.673177, 0.531056, 1)
ground_color = Color(1, 0.484315, 0.700558, 1)
[sub_resource type="Sky" id="Sky_0jxef"]
sky_material = SubResource("PhysicalSkyMaterial_bt14i")
@ -108,6 +198,44 @@ ambient_light_source = 3
ambient_light_color = Color(0.986752, 0.986752, 0.986752, 1)
reflected_light_source = 2
[sub_resource type="Animation" id="Animation_gma2u"]
resource_name = "sky_brightness"
length = 0.3
step = 0.1
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("../../WorldEnvironment:environment:sky:sky_material:energy_multiplier")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0, 0.3),
"transitions": PackedFloat32Array(1, 1),
"update": 0,
"values": [1.0, 1.0]
}
[sub_resource type="Animation" id="Animation_j2kye"]
length = 0.001
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("../../WorldEnvironment:environment:sky:sky_material:energy_multiplier")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [1.0]
}
[sub_resource type="AnimationLibrary" id="AnimationLibrary_wruj6"]
_data = {
&"RESET": SubResource("Animation_j2kye"),
&"sky_brightness": SubResource("Animation_gma2u")
}
[node name="MainMenu" type="Node3D"]
process_mode = 3
script = SubResource("GDScript_bt14i")
@ -137,6 +265,12 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 2.5)
current = true
fov = 40.0
[node name="AnimationPlayer" type="AnimationPlayer" parent="Camera3D"]
root_node = NodePath("../..")
libraries = {
&"": SubResource("AnimationLibrary_jinmx")
}
[node name="WorldEnvironment" type="WorldEnvironment" parent="."]
environment = SubResource("Environment_qfa5o")
@ -144,7 +278,7 @@ environment = SubResource("Environment_qfa5o")
transform = Transform3D(0.819152, -0.412596, 0.39844, 0, 0.694658, 0.71934, -0.573576, -0.589249, 0.569031, 0, 0, 0)
[node name="Player" parent="." instance=ExtResource("2_2rexg")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.87335, 0)
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 4, 0)
[node name="Camera" parent="Player" index="0"]
visible = false
@ -153,4 +287,10 @@ current = false
[node name="GPUParticles3D" parent="Player/Sphere" index="2"]
visible = false
[node name="AnimationPlayer" type="AnimationPlayer" parent="."]
root_node = NodePath("../Camera3D/AnimationPlayer")
libraries = {
&"": SubResource("AnimationLibrary_wruj6")
}
[editable path="Player"]