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

@ -11,13 +11,10 @@ script/source = "extends Node
var playing: bool = false
var changing_level: bool = false
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\"),
]
var area_resource = preload(\"res://menus/main/area.tscn\")
var main_menu: Node
var current_level: Level
const res_main_menu = preload(\"res://menus/main/main_menu.tscn\")
@onready var gui_timer := $GUI/TopLeft/Timer
@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_restart\", restart_level)
launch_area()
set_main_menu()
func launch_area():
func set_main_menu():
Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE)
var area := area_resource.instantiate()
area.connect(\"request_start\", start_game)
$Levels.add_child(area)
## 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
main_menu = res_main_menu.instantiate()
main_menu.connect(\"request_play_level\", start_level)
add_child(main_menu)
func start_level(level_scene: PackedScene) -> void:
$VictoryScreen.hide()
var level = level_scene.instantiate()
$Levels.add_child(level)
level.connect(\"completed\", stop_level)
level.connect(\"ring_collected\", func():
gui_rings.remaining_rings = len(level.rings) - level.finished_rings_count
if is_instance_valid(current_level):
current_level.queue_free()
if is_instance_valid(main_menu):
main_menu.queue_free()
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
PhysicsServer3D.area_set_param(
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.enabled = true
func stop_level() -> void:
func finish_current_level() -> void:
gui_timer.enabled = false
PhysicsServer3D.area_set_param(get_viewport().find_world_3d().space, PhysicsServer3D.AREA_PARAM_GRAVITY, 1)
playing = false
@ -86,51 +80,27 @@ func stop_level() -> void:
SaveFiles.change_property(\"played_for\", gui_timer.seconds_spent_total, 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:
SaveFiles.change_property(property_name, gui_timer.seconds_spent_level_attempt, SaveFiles.selected_file)
var current_levels = get_current_levels()
for level in current_levels:
level.music.fadeOut(2)
await get_tree().create_timer(2).timeout
level.queue_free()
current_level.music.fadeOut(2)
await get_tree().create_timer(2).timeout
current_level.queue_free()
if len(levels) > current_level_int + 1:
current_level_int += 1
start_level(levels[current_level_int])
else:
win_game()
win_game()
func win_game() -> void:
$VictoryScreen.show()
await get_tree().create_timer(2).timeout
launch_area()
set_main_menu()
$VictoryScreen.hide()
func restart_level() -> void:
var current_levels := get_current_levels()
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])
return #idk yet
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
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)
func _process(_delta: float) -> void:
var current_levels = get_current_levels()
if len(current_levels):
var current_level = current_levels[0]
if is_instance_valid(current_level):
gui_speed.ball_velocity = current_level.velocity
func _input(_event: InputEvent) -> void:
@ -246,8 +214,6 @@ label_settings = SubResource("LabelSettings_1bs00")
horizontal_alignment = 1
vertical_alignment = 1
[node name="Levels" type="Node" parent="."]
[node name="PauseMenu" parent="." instance=ExtResource("4_3bfj3")]
[node name="DevInfos" type="Label" parent="."]