From 38897c706a6862ac2185de52092f1ad6c45d005f Mon Sep 17 00:00:00 2001 From: Taevas Date: Sun, 27 Apr 2025 21:30:03 +0200 Subject: [PATCH] "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 --- elements/gravity.tscn | 2 + index.tscn | 34 ++++-- levels/demo.tscn | 50 --------- menus/main/level_selection_menu.tscn | 13 ++- menus/main/main_menu.tscn | 160 +++++++++++++++++++++++++-- 5 files changed, 184 insertions(+), 75 deletions(-) delete mode 100644 levels/demo.tscn diff --git a/elements/gravity.tscn b/elements/gravity.tscn index d84e534..0a5a992 100644 --- a/elements/gravity.tscn +++ b/elements/gravity.tscn @@ -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") diff --git a/index.tscn b/index.tscn index 75882ae..389b119 100644 --- a/index.tscn +++ b/index.tscn @@ -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) - main_menu = res_main_menu.instantiate() - main_menu.connect(\"request_play_level\", start_level) + 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")] diff --git a/levels/demo.tscn b/levels/demo.tscn deleted file mode 100644 index 4e1e5ad..0000000 --- a/levels/demo.tscn +++ /dev/null @@ -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) diff --git a/menus/main/level_selection_menu.tscn b/menus/main/level_selection_menu.tscn index 152645d..4bfe215 100644 --- a/menus/main/level_selection_menu.tscn +++ b/menus/main/level_selection_menu.tscn @@ -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) diff --git a/menus/main/main_menu.tscn b/menus/main/main_menu.tscn index 7437b53..004089c 100644 --- a/menus/main/main_menu.tscn +++ b/menus/main/main_menu.tscn @@ -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"]