simple level selection menu, change level logic (#3)

This commit is contained in:
Taevas 2025-04-24 14:54:54 +02:00
parent 9890e0a625
commit 59bed24acd
Signed by: Taevas
SSH key fingerprint: SHA256:Y5Hv18xwPvUKSlgkx1sPnRO3L2mc03ehC7BzrnZVEyY
13 changed files with 199 additions and 134 deletions

View file

@ -4,7 +4,13 @@
script/source = "class_name Player script/source = "class_name Player
extends Node3D extends Node3D
var velocity: Vector3 = Vector3(0, 0, 0) signal velocity_change
var velocity := 0.0:
get: return velocity
set(value):
if value != velocity:
velocity_change.emit(value)
velocity = value
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)
@ -13,22 +19,21 @@ func _physics_process(_delta: float) -> void:
$SpotLightRight.position = $Sphere.position $SpotLightRight.position = $Sphere.position
$SpotLightBottom.position = $Sphere.position $SpotLightBottom.position = $Sphere.position
## Keep the ball at the center of the camera, at a distance # Keep the ball at the center of the camera, at a distance
$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
velocity = $Sphere.linear_velocity velocity = abs($Sphere.linear_velocity.x) + abs($Sphere.linear_velocity.y)
var desired_x = max(min(velocity.y, 35), -35) var desired_x = max(min($Sphere.linear_velocity.y, 35), -35)
var desired_y = max(min(-velocity.x, 50), -50) var desired_y = max(min(-$Sphere.linear_velocity.x, 50), -50)
var difference_x = $Camera.rotation_degrees.x - desired_x var difference_x = $Camera.rotation_degrees.x - desired_x
var difference_y = $Camera.rotation_degrees.y - desired_y var difference_y = $Camera.rotation_degrees.y - desired_y
$Camera.rotation_degrees.x -= max(min(difference_x / 2, 3), -3) $Camera.rotation_degrees.x -= max(min(difference_x / 2, 3), -3)
$Camera.rotation_degrees.y -= max(min(difference_y / 2, 3), -3) $Camera.rotation_degrees.y -= max(min(difference_y / 2, 3), -3)
## FOV of the camera, so it unzooms more at higher velocities # FOV of the camera, so it unzooms more at higher velocities
const default_fov = 75 const default_fov = 75
var total_velocity = abs(velocity.x) + abs(velocity.y) $Camera.fov = default_fov + (velocity / 12)
$Camera.fov = default_fov + (total_velocity / 12)
" "
[sub_resource type="PhysicsMaterial" id="PhysicsMaterial_vumbr"] [sub_resource type="PhysicsMaterial" id="PhysicsMaterial_vumbr"]

View file

@ -29,6 +29,7 @@ vertex_color_use_as_albedo = true
albedo_color = Color(0.212217, 0.468618, 0, 1) albedo_color = Color(0.212217, 0.468618, 0, 1)
[node name="Tree" type="Node3D"] [node name="Tree" type="Node3D"]
physics_interpolation_mode = 2
script = SubResource("GDScript_tbkod") script = SubResource("GDScript_tbkod")
[node name="Dirt" type="CSGBox3D" parent="."] [node name="Dirt" type="CSGBox3D" parent="."]

View file

@ -77,23 +77,6 @@ tracks/0/keys = {
"values": [Vector2(1, 1)] "values": [Vector2(1, 1)]
} }
[sub_resource type="Animation" id="Animation_2a86r"]
resource_name = "scale_linear"
length = 0.25
step = 0.25
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath(".:scale")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0, 0.25),
"transitions": PackedFloat32Array(1, 1),
"update": 0,
"values": [Vector2(1, 1), Vector2(1.2, 1.2)]
}
[sub_resource type="Animation" id="Animation_houb3"] [sub_resource type="Animation" id="Animation_houb3"]
resource_name = "scale_cubic" resource_name = "scale_cubic"
length = 0.25 length = 0.25
@ -111,6 +94,23 @@ tracks/0/keys = {
"values": [Vector2(1, 1), Vector2(1.2, 1.2)] "values": [Vector2(1, 1), Vector2(1.2, 1.2)]
} }
[sub_resource type="Animation" id="Animation_2a86r"]
resource_name = "scale_linear"
length = 0.25
step = 0.25
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath(".:scale")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0, 0.25),
"transitions": PackedFloat32Array(1, 1),
"update": 0,
"values": [Vector2(1, 1), Vector2(1.2, 1.2)]
}
[sub_resource type="AnimationLibrary" id="AnimationLibrary_jmgpn"] [sub_resource type="AnimationLibrary" id="AnimationLibrary_jmgpn"]
_data = { _data = {
&"RESET": SubResource("Animation_m1tld"), &"RESET": SubResource("Animation_m1tld"),

View file

@ -11,13 +11,10 @@ script/source = "extends Node
var playing: bool = false var playing: bool = false
var changing_level: bool = false var changing_level: bool = false
var current_level_int: int = 0 var main_menu: Node
var levels = [ var current_level: Level
preload(\"res://levels/base/level.tscn\"),
preload(\"res://levels/forest/level.tscn\"), const res_main_menu = preload(\"res://menus/main/main_menu.tscn\")
preload(\"res://levels/night/level.tscn\"),
]
var area_resource = preload(\"res://menus/main/area.tscn\")
@onready var gui_timer := $GUI/TopLeft/Timer @onready var gui_timer := $GUI/TopLeft/Timer
@onready var gui_speed := $GUI/TopRight/Speed @onready var gui_speed := $GUI/TopRight/Speed
@ -40,34 +37,31 @@ func _ready() -> void:
pause_menu.connect(\"request_fullscreen\", fullscreen_game) pause_menu.connect(\"request_fullscreen\", fullscreen_game)
pause_menu.connect(\"request_restart\", restart_level) pause_menu.connect(\"request_restart\", restart_level)
launch_area() set_main_menu()
func launch_area(): func set_main_menu():
Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE) Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE)
var area := area_resource.instantiate() main_menu = res_main_menu.instantiate()
area.connect(\"request_start\", start_game) main_menu.connect(\"request_play_level\", start_level)
$Levels.add_child(area) add_child(main_menu)
## 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() if is_instance_valid(current_level):
var level = level_scene.instantiate() current_level.queue_free()
$Levels.add_child(level) if is_instance_valid(main_menu):
level.connect(\"completed\", stop_level) main_menu.queue_free()
level.connect(\"ring_collected\", func():
gui_rings.remaining_rings = len(level.rings) - level.finished_rings_count current_level = level_scene.instantiate()
add_child(current_level)
current_level.connect(\"completed\", finish_current_level)
current_level.connect(\"ring_collected\", func():
gui_rings.remaining_rings = len(current_level.rings) - current_level.finished_rings_count
) )
gui_rings.remaining_rings = len(level.rings) - level.finished_rings_count gui_rings.remaining_rings = len(current_level.rings) - current_level.finished_rings_count
$GUI.show()
Input.set_mouse_mode(Input.MOUSE_MODE_HIDDEN)
playing = true playing = true
PhysicsServer3D.area_set_param( PhysicsServer3D.area_set_param(
get_viewport().find_world_3d().space, get_viewport().find_world_3d().space,
@ -78,7 +72,7 @@ func start_level(level_scene: PackedScene) -> void:
gui_timer.seconds_spent_level_attempt = 0.0 gui_timer.seconds_spent_level_attempt = 0.0
gui_timer.enabled = true gui_timer.enabled = true
func stop_level() -> void: func finish_current_level() -> void:
gui_timer.enabled = false gui_timer.enabled = false
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)
playing = false playing = false
@ -86,51 +80,27 @@ func stop_level() -> void:
SaveFiles.change_property(\"played_for\", gui_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 save_file_data = SaveFiles.read(SaveFiles.selected_file)
var property_name := \"best_time_for_level_\" + str(current_level_int) var property_name := current_level.id + \"_best_time\"
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: 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) SaveFiles.change_property(property_name, gui_timer.seconds_spent_level_attempt, SaveFiles.selected_file)
var current_levels = get_current_levels() current_level.music.fadeOut(2)
for level in current_levels: await get_tree().create_timer(2).timeout
level.music.fadeOut(2) current_level.queue_free()
await get_tree().create_timer(2).timeout
level.queue_free()
if len(levels) > current_level_int + 1: win_game()
current_level_int += 1
start_level(levels[current_level_int])
else:
win_game()
func win_game() -> void: func win_game() -> void:
$VictoryScreen.show() $VictoryScreen.show()
await get_tree().create_timer(2).timeout await get_tree().create_timer(2).timeout
launch_area() set_main_menu()
$VictoryScreen.hide() $VictoryScreen.hide()
func restart_level() -> void: func restart_level() -> void:
var current_levels := get_current_levels() return #idk yet
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 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: func pause_game(to_pause: bool) -> void:
if !len(get_current_levels()) or changing_level: if is_instance_valid(current_level) or changing_level:
return return
SaveFiles.change_property(\"played_for\", gui_timer.seconds_spent_total, SaveFiles.selected_file) SaveFiles.change_property(\"played_for\", gui_timer.seconds_spent_total, SaveFiles.selected_file)
@ -153,9 +123,7 @@ func fullscreen_game() -> void:
DisplayServer.window_set_mode(DisplayServer.WindowMode.WINDOW_MODE_WINDOWED) DisplayServer.window_set_mode(DisplayServer.WindowMode.WINDOW_MODE_WINDOWED)
func _process(_delta: float) -> void: func _process(_delta: float) -> void:
var current_levels = get_current_levels() if is_instance_valid(current_level):
if len(current_levels):
var current_level = current_levels[0]
gui_speed.ball_velocity = current_level.velocity gui_speed.ball_velocity = current_level.velocity
func _input(_event: InputEvent) -> void: func _input(_event: InputEvent) -> void:
@ -246,8 +214,6 @@ label_settings = SubResource("LabelSettings_1bs00")
horizontal_alignment = 1 horizontal_alignment = 1
vertical_alignment = 1 vertical_alignment = 1
[node name="Levels" type="Node" parent="."]
[node name="PauseMenu" parent="." instance=ExtResource("4_3bfj3")] [node name="PauseMenu" parent="." instance=ExtResource("4_3bfj3")]
[node name="DevInfos" type="Label" parent="."] [node name="DevInfos" type="Label" parent="."]

View file

@ -1,12 +1,22 @@
[gd_scene load_steps=12 format=3 uid="uid://ovtknjyj83gh"] [gd_scene load_steps=12 format=3 uid="uid://ovtknjyj83gh"]
[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://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"]
[sub_resource type="GDScript" id="GDScript_1yugx"]
script/source = "extends Level
func _init() -> void:
self.id = \"base\"
func _on_player_velocity_change(new_velocity: float) -> void:
self.velocity = new_velocity
self.music.adaptInstrumentsToVelocity(new_velocity * 1.5)
"
[sub_resource type="Gradient" id="Gradient_hs6gw"] [sub_resource type="Gradient" id="Gradient_hs6gw"]
[sub_resource type="GradientTexture2D" id="GradientTexture2D_hyysp"] [sub_resource type="GradientTexture2D" id="GradientTexture2D_hyysp"]
@ -30,7 +40,7 @@ ambient_light_color = Color(1, 1, 1, 1)
reflected_light_source = 2 reflected_light_source = 2
[node name="Base" type="Node3D"] [node name="Base" type="Node3D"]
script = ExtResource("1_rj40i") script = SubResource("GDScript_1yugx")
metadata/_custom_type_script = "uid://w3fetao1pegm" metadata/_custom_type_script = "uid://w3fetao1pegm"
[node name="Gravity" parent="." instance=ExtResource("3_muudg")] [node name="Gravity" parent="." instance=ExtResource("3_muudg")]
@ -155,6 +165,8 @@ transform = Transform3D(0.0172464, 0.899835, 0, -0.899835, 0.0172464, 0, 0, 0, 0
[node name="Ring13" parent="Rings" instance=ExtResource("3_hel5x")] [node name="Ring13" parent="Rings" instance=ExtResource("3_hel5x")]
transform = Transform3D(0.0114976, 0.59989, 0, -0.59989, 0.0114976, 0, 0, 0, 0.6, -414.274, 8.64172, 0) transform = Transform3D(0.0114976, 0.59989, 0, -0.59989, 0.0114976, 0, 0, 0, 0.6, -414.274, 8.64172, 0)
[connection signal="velocity_change" from="Player" to="." method="_on_player_velocity_change"]
[editable path="Signs/Sign"] [editable path="Signs/Sign"]
[editable path="Signs/Sign7"] [editable path="Signs/Sign7"]
[editable path="Signs/Sign2"] [editable path="Signs/Sign2"]

View file

@ -1,6 +1,5 @@
[gd_scene load_steps=11 format=3 uid="uid://e1761h6d522a"] [gd_scene load_steps=11 format=3 uid="uid://e1761h6d522a"]
[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://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"]
@ -8,6 +7,17 @@
[ext_resource type="PackedScene" uid="uid://da6lkdiskdh8v" path="res://elements/tree.tscn" id="6_1e514"] [ext_resource type="PackedScene" uid="uid://da6lkdiskdh8v" path="res://elements/tree.tscn" id="6_1e514"]
[ext_resource type="PackedScene" uid="uid://c77bli40240nk" path="res://elements/sign.tscn" id="6_ifogr"] [ext_resource type="PackedScene" uid="uid://c77bli40240nk" path="res://elements/sign.tscn" id="6_ifogr"]
[sub_resource type="GDScript" id="GDScript_mqwxc"]
script/source = "extends Level
func _init() -> void:
self.id = \"forest\"
func _on_player_velocity_change(new_velocity: float) -> void:
self.velocity = new_velocity
self.music.adaptInstrumentsToVelocity(new_velocity)
"
[sub_resource type="ProceduralSkyMaterial" id="ProceduralSkyMaterial_grcut"] [sub_resource type="ProceduralSkyMaterial" id="ProceduralSkyMaterial_grcut"]
sky_top_color = Color(0, 0.504542, 0.579919, 1) sky_top_color = Color(0, 0.504542, 0.579919, 1)
sky_horizon_color = Color(9.62615e-08, 0.776269, 0.496436, 1) sky_horizon_color = Color(9.62615e-08, 0.776269, 0.496436, 1)
@ -29,7 +39,7 @@ ambient_light_color = Color(1, 1, 1, 1)
reflected_light_source = 2 reflected_light_source = 2
[node name="Forest" type="Node3D"] [node name="Forest" type="Node3D"]
script = ExtResource("1_fdxcj") script = SubResource("GDScript_mqwxc")
metadata/_custom_type_script = "uid://w3fetao1pegm" metadata/_custom_type_script = "uid://w3fetao1pegm"
[node name="Gravity" parent="." instance=ExtResource("2_gxmta")] [node name="Gravity" parent="." instance=ExtResource("2_gxmta")]
@ -261,4 +271,6 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -218.208, 206.247, 0)
[node name="Ring23" parent="Rings" instance=ExtResource("4_p8yhq")] [node name="Ring23" parent="Rings" instance=ExtResource("4_p8yhq")]
transform = Transform3D(0.939693, 0.34202, 0, -0.34202, 0.939693, 0, 0, 0, 1, -1018.15, -96.9134, 0) transform = Transform3D(0.939693, 0.34202, 0, -0.34202, 0.939693, 0, 0, 0, 1, -1018.15, -96.9134, 0)
[connection signal="velocity_change" from="Player" to="." method="_on_player_velocity_change"]
[editable path="Sign"] [editable path="Sign"]

View file

@ -4,13 +4,15 @@ extends Node3D
signal ring_collected signal ring_collected
signal completed signal completed
var seconds_spent: float = 0.00 ## Lowercase, spaceless name of the level
var id: String
var music: Music var music: Music
var velocity: float = 0.0 var velocity: float = 0.0
var rings: Array[Ring] = [] var rings: Array[Ring] = []
var finished_rings_count: int = 0 var finished_rings_count: int = 0
func _ready() -> void: func _ready() -> void:
assert(len(id) > 0, self.name + " has no id!")
var children = get_children() var children = get_children()
for child in children: for child in children:
if is_instance_of(child, Music): if is_instance_of(child, Music):
@ -31,8 +33,3 @@ func collect_ring():
if finished_rings_count >= len(rings): if finished_rings_count >= len(rings):
completed.emit() completed.emit()
func _process(delta: float) -> void:
seconds_spent += delta
velocity = abs($Player.velocity.x) + abs($Player.velocity.y)
music.adaptInstrumentsToVelocity(velocity, delta)

View file

@ -40,7 +40,9 @@ func changeVolume(db: float) -> void:
AudioServer.set_bus_volume_db(bus_index, db + Settings.volume_music) AudioServer.set_bus_volume_db(bus_index, db + Settings.volume_music)
AudioServer.set_bus_mute(bus_index, Settings.volume_music <= -15.0) AudioServer.set_bus_mute(bus_index, Settings.volume_music <= -15.0)
func adaptInstrumentsToVelocity(velocity: float, delta: float) -> void: func adaptInstrumentsToVelocity(velocity: float) -> void:
## temp
const delta = 0.00833333333333
var instruments_needed = floor(velocity / 8) var instruments_needed = floor(velocity / 8)
var instruments_playing = instruments.filter(func(i: AudioStreamPlayer): return i.volume_db > -50) var instruments_playing = instruments.filter(func(i: AudioStreamPlayer): return i.volume_db > -50)

View file

@ -1,6 +1,5 @@
[gd_scene load_steps=14 format=3 uid="uid://drnqmu4lka22d"] [gd_scene load_steps=14 format=3 uid="uid://drnqmu4lka22d"]
[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://dw0xl8644x166" path="res://elements/gravity.tscn" id="2_lfplq"]
@ -9,6 +8,21 @@
[ext_resource type="PackedScene" uid="uid://b4jtpua36m6b1" path="res://elements/star.tscn" id="7_ltcl0"] [ext_resource type="PackedScene" uid="uid://b4jtpua36m6b1" path="res://elements/star.tscn" id="7_ltcl0"]
[ext_resource type="PackedScene" uid="uid://da6lkdiskdh8v" path="res://elements/tree.tscn" id="8_kgstj"] [ext_resource type="PackedScene" uid="uid://da6lkdiskdh8v" path="res://elements/tree.tscn" id="8_kgstj"]
[sub_resource type="GDScript" id="GDScript_akhnt"]
script/source = "extends Level
func _init() -> void:
self.id = \"night\"
func _process(delta: float) -> void:
$Tree.rotate_x(delta / 3)
$Tree.rotate_y(delta)
func _on_player_velocity_change(new_velocity: float) -> void:
self.velocity = new_velocity
self.music.adaptInstrumentsToVelocity(new_velocity * 2)
"
[sub_resource type="Gradient" id="Gradient_x6q8u"] [sub_resource type="Gradient" id="Gradient_x6q8u"]
[sub_resource type="GradientTexture1D" id="GradientTexture1D_lu6nv"] [sub_resource type="GradientTexture1D" id="GradientTexture1D_lu6nv"]
@ -28,7 +42,7 @@ ambient_light_color = Color(1, 1, 1, 1)
reflected_light_source = 2 reflected_light_source = 2
[node name="Night" type="Node3D"] [node name="Night" type="Node3D"]
script = ExtResource("1_3m1pa") script = SubResource("GDScript_akhnt")
metadata/_custom_type_script = "uid://w3fetao1pegm" metadata/_custom_type_script = "uid://w3fetao1pegm"
[node name="Gravity" parent="." instance=ExtResource("2_lfplq")] [node name="Gravity" parent="." instance=ExtResource("2_lfplq")]
@ -193,7 +207,7 @@ transform = Transform3D(-1.31134e-07, -3, 0, 3, -1.31134e-07, 0, 0, 0, 3, -104.2
transform = Transform3D(0.5, 0, 0, 0, 0.5, 0, 0, 0, 0.5, -12.3896, -2, 0) transform = Transform3D(0.5, 0, 0, 0, 0.5, 0, 0, 0, 0.5, -12.3896, -2, 0)
[node name="Tree" parent="." instance=ExtResource("8_kgstj")] [node name="Tree" parent="." instance=ExtResource("8_kgstj")]
transform = Transform3D(-3.79443, -7.04289, 0, 7.04289, -3.79443, 0, 0, 0, 8, 28.958, -413.185, -93.8242) transform = Transform3D(-3.79271, -7.04382, 0, 7.04382, -3.79271, 0, 0, 0, 8, 28.958, -413.185, -93.8242)
[node name="Signs" type="Node3D" parent="."] [node name="Signs" type="Node3D" parent="."]
@ -327,6 +341,8 @@ transform = Transform3D(-0.99693, 0.0731445, -0.0279554, -0.0555776, -0.912445,
[node name="Star32" parent="Stars" instance=ExtResource("7_ltcl0")] [node name="Star32" parent="Stars" instance=ExtResource("7_ltcl0")]
transform = Transform3D(-0.99693, 0.0731445, -0.0279554, -0.0555776, -0.912445, -0.405407, -0.055161, -0.402609, 0.913709, 0.952739, 0.24193, 7.10684) transform = Transform3D(-0.99693, 0.0731445, -0.0279554, -0.0555776, -0.912445, -0.405407, -0.055161, -0.402609, 0.913709, 0.952739, 0.24193, 7.10684)
[connection signal="velocity_change" from="Player" to="." method="_on_player_velocity_change"]
[editable path="Signs/Sign"] [editable path="Signs/Sign"]
[editable path="Signs/Sign4"] [editable path="Signs/Sign4"]
[editable path="Signs/Sign2"] [editable path="Signs/Sign2"]

View file

@ -16,7 +16,7 @@ func _on_btn_exit_pressed() -> void:
get_tree().quit() get_tree().quit()
" "
[node name="StartMenu" type="Control"] [node name="InitialMenu" type="Control"]
layout_mode = 3 layout_mode = 3
anchors_preset = 15 anchors_preset = 15
anchor_right = 1.0 anchor_right = 1.0

View file

@ -0,0 +1,42 @@
[gd_scene load_steps=2 format=3 uid="uid://d3b12iqla7uh6"]
[sub_resource type="GDScript" id="GDScript_rmgh7"]
script/source = "extends Control
signal request_play_level
const levels = [
preload(\"res://levels/base/level.tscn\"),
preload(\"res://levels/forest/level.tscn\"),
preload(\"res://levels/night/level.tscn\"),
]
var selected_level := -1
func _ready() -> void:
for i in len(levels):
var btn := Button.new()
btn.text = \"Level \" + str(i + 1)
btn.connect(\"pressed\", func(): request_play_level.emit(levels[i]))
$VBoxContainer/Carousel.add_child(btn)
"
[node name="LevelSelectionMenu" type="Control"]
layout_mode = 3
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
script = SubResource("GDScript_rmgh7")
[node name="VBoxContainer" type="VBoxContainer" parent="."]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
[node name="Carousel" type="HBoxContainer" parent="VBoxContainer"]
layout_mode = 2
alignment = 1

View file

@ -1,38 +1,48 @@
[gd_scene load_steps=10 format=3 uid="uid://ikeidrgprk8k"] [gd_scene load_steps=10 format=3 uid="uid://ikeidrgprk8k"]
[ext_resource type="PackedScene" uid="uid://wlhsarkeqe8r" path="res://menus/main/panel.tscn" id="1_qfa5o"] [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_0jxef"] [ext_resource type="PackedScene" uid="uid://cnnvwotv33u1b" path="res://elements/player.tscn" id="2_2rexg"]
[sub_resource type="GDScript" id="GDScript_bt14i"] [sub_resource type="GDScript" id="GDScript_bt14i"]
script/source = "extends Node3D script/source = "extends Node3D
signal request_start signal request_play_level
var start_menu = preload(\"res://menus/main/start_menu.tscn\")
var save_file_manager = preload(\"res://menus/main/save_file_manager.tscn\")
var settings_menu = preload(\"res://menus/main/settings_menu.tscn\")
# Display on Panel 1
const res_initial_menu = preload(\"res://menus/main/initial_menu.tscn\")
func _ready() -> void: func _ready() -> void:
$Menus/Panel2.connect(\"request_return\", func(): rotate_cube_to(0)) $Menus/Panel2.connect(\"request_return\", func(): rotate_cube_to(0))
$Menus/Panel3.connect(\"request_return\", func(): rotate_cube_to(90)) $Menus/Panel3.connect(\"request_return\", func(): rotate_cube_to(90))
$Menus/Panel4.connect(\"request_return\", func(): rotate_cube_to(180)) $Menus/Panel4.connect(\"request_return\", func(): rotate_cube_to(180))
var sm = start_menu.instantiate() var initial_menu := res_initial_menu.instantiate()
sm.connect(\"request_start\", start) initial_menu.connect(\"request_start\", start)
sm.connect(\"request_settings\", settings) initial_menu.connect(\"request_settings\", settings)
$Menus/Panel1.change_menu(sm, false) $Menus/Panel1.change_menu(initial_menu, false)
func start() -> void:
var svm = save_file_manager.instantiate()
svm.connect(\"request_start\", func(): request_start.emit())
$Menus/Panel2.change_menu(svm)
rotate_cube_to(90)
# Display on Panel 2
const res_settings_menu = preload(\"res://menus/main/settings_menu.tscn\")
func settings() -> void: func settings() -> void:
var sm = settings_menu.instantiate() var settings_menu := res_settings_menu.instantiate()
$Menus/Panel2.change_menu(sm) $Menus/Panel2.change_menu(settings_menu)
rotate_cube_to(90) rotate_cube_to(90)
const res_save_file_manager = preload(\"res://menus/main/save_file_manager.tscn\")
func start() -> void:
var save_file_manager := res_save_file_manager.instantiate()
save_file_manager.connect(\"request_start\", level_selection)
$Menus/Panel2.change_menu(save_file_manager)
rotate_cube_to(90)
# Display on Panel 3
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: PackedScene): request_play_level.emit(level))
$Menus/Panel3.change_menu(level_selection_menu)
rotate_cube_to(180)
# cube
func rotate_cube_to(degrees: int) -> void: func rotate_cube_to(degrees: int) -> void:
if $Menus/AnimationPlayer.is_playing(): if $Menus/AnimationPlayer.is_playing():
return return
@ -98,23 +108,23 @@ ambient_light_source = 3
ambient_light_color = Color(0.986752, 0.986752, 0.986752, 1) ambient_light_color = Color(0.986752, 0.986752, 0.986752, 1)
reflected_light_source = 2 reflected_light_source = 2
[node name="Area" type="Node3D"] [node name="MainMenu" type="Node3D"]
process_mode = 3 process_mode = 3
script = SubResource("GDScript_bt14i") script = SubResource("GDScript_bt14i")
[node name="Menus" type="CSGBox3D" parent="."] [node name="Menus" type="CSGBox3D" parent="."]
use_collision = true use_collision = true
[node name="Panel1" parent="Menus" instance=ExtResource("1_qfa5o")] [node name="Panel1" parent="Menus" instance=ExtResource("1_5vmsf")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0.501) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0.501)
[node name="Panel2" parent="Menus" instance=ExtResource("1_qfa5o")] [node name="Panel2" parent="Menus" instance=ExtResource("1_5vmsf")]
transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, 0.501, 0, 0) transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, 0.501, 0, 0)
[node name="Panel3" parent="Menus" instance=ExtResource("1_qfa5o")] [node name="Panel3" parent="Menus" instance=ExtResource("1_5vmsf")]
transform = Transform3D(-1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, 0, 0, -0.501) transform = Transform3D(-1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, 0, 0, -0.501)
[node name="Panel4" parent="Menus" instance=ExtResource("1_qfa5o")] [node name="Panel4" parent="Menus" instance=ExtResource("1_5vmsf")]
transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, -0.501, 0, 0) transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, -0.501, 0, 0)
[node name="AnimationPlayer" type="AnimationPlayer" parent="Menus"] [node name="AnimationPlayer" type="AnimationPlayer" parent="Menus"]
@ -133,7 +143,7 @@ environment = SubResource("Environment_qfa5o")
[node name="DirectionalLight3D" type="DirectionalLight3D" parent="."] [node name="DirectionalLight3D" type="DirectionalLight3D" parent="."]
transform = Transform3D(0.819152, -0.412596, 0.39844, 0, 0.694658, 0.71934, -0.573576, -0.589249, 0.569031, 0, 0, 0) 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_0jxef")] [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, 1.87335, 0)
[node name="Camera" parent="Player" index="0"] [node name="Camera" parent="Player" index="0"]

View file

@ -114,10 +114,12 @@ libraries = {
} }
[node name="Label" type="Label" parent="VSplitContainer"] [node name="Label" type="Label" parent="VSplitContainer"]
custom_minimum_size = Vector2(1, 1)
layout_mode = 2 layout_mode = 2
text = "MENU NAME" text = "MENU NAME"
label_settings = SubResource("LabelSettings_2d4ws") label_settings = SubResource("LabelSettings_2d4ws")
horizontal_alignment = 1 horizontal_alignment = 1
autowrap_mode = 3
uppercase = true uppercase = true
[node name="MarginContainer" type="MarginContainer" parent="VSplitContainer"] [node name="MarginContainer" type="MarginContainer" parent="VSplitContainer"]