simple level selection menu, change level logic (#3)
This commit is contained in:
parent
9890e0a625
commit
59bed24acd
13 changed files with 199 additions and 134 deletions
102
index.tscn
102
index.tscn
|
@ -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="."]
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue