feat: Add a loading screen, a lobby scene, and a new main game script, along with a custom font.
This commit is contained in:
@@ -0,0 +1,108 @@
|
||||
extends Control
|
||||
|
||||
@export var tips: Array[String] = [
|
||||
"Use your cards wisely!",
|
||||
"Plan your moves ahead.",
|
||||
"Watch out for obstacles!",
|
||||
"Combine cards for powerful effects."
|
||||
]
|
||||
|
||||
var is_loading: bool = false
|
||||
var path: String = ""
|
||||
var progress: Array[float] = []
|
||||
|
||||
@onready var progress_bar = $progress_bar
|
||||
@onready var tip_value = $Control/tips/tip_value
|
||||
@onready var scene_name_label = $Control/scene_name/name_of_load_scene
|
||||
@onready var content_control = $Control
|
||||
|
||||
func _ready():
|
||||
set_process(false)
|
||||
|
||||
var load_start_time = 0.0
|
||||
var stuck_time = 0.0
|
||||
var last_progress = 0.0
|
||||
|
||||
func _process(delta):
|
||||
if is_loading:
|
||||
var status = ResourceLoader.load_threaded_get_status(path, progress)
|
||||
match status:
|
||||
ResourceLoader.THREAD_LOAD_IN_PROGRESS:
|
||||
if progress.size() > 0:
|
||||
var actual_progress = progress[0] * 100
|
||||
|
||||
# If progress is actually advancing, use it and reset stuck timer
|
||||
if actual_progress > last_progress:
|
||||
progress_bar.value = actual_progress
|
||||
last_progress = actual_progress
|
||||
stuck_time = 0.0
|
||||
else:
|
||||
# Progress is stuck, increment stuck timer
|
||||
stuck_time += delta
|
||||
|
||||
# If stuck for more than 0.5 seconds, start simulating progress
|
||||
if stuck_time > 0.5:
|
||||
# Calculate how much more progress needed
|
||||
var remaining_percent = 99.0 - progress_bar.value
|
||||
|
||||
# Adjust increment speed based on how much progress we've already made
|
||||
# Slower at the beginning, faster near the end
|
||||
var increment_speed = 5.0 + (progress_bar.value / 20.0)
|
||||
|
||||
# Apply increment
|
||||
progress_bar.value = min(progress_bar.value + increment_speed * delta, 99.0)
|
||||
|
||||
ResourceLoader.THREAD_LOAD_LOADED:
|
||||
progress_bar.value = 100
|
||||
call_deferred("_handle_load_complete")
|
||||
|
||||
ResourceLoader.THREAD_LOAD_FAILED:
|
||||
print("Loading failed: ", path)
|
||||
is_loading = false
|
||||
set_process(false)
|
||||
|
||||
func _handle_load_complete():
|
||||
var resource = ResourceLoader.load_threaded_get(path)
|
||||
if resource:
|
||||
change_scene(resource)
|
||||
else:
|
||||
print("Failed to get loaded resource")
|
||||
|
||||
set_process(false)
|
||||
is_loading = false
|
||||
|
||||
func change_scene(resource: PackedScene):
|
||||
print("Loading complete. Switching scene...")
|
||||
# The Lobby (parent) should be removed by the caller or we handle it here if we are the root.
|
||||
# But in this architecture, the Lobby is a child of root or MainMenu?
|
||||
# Actually, usually we use get_tree().change_scene_to_packed(resource)
|
||||
|
||||
get_tree().change_scene_to_packed(resource)
|
||||
|
||||
# Clean up self (Loading Screen)
|
||||
queue_free()
|
||||
|
||||
|
||||
func load_level(_path: String):
|
||||
print("Starting load for: ", _path)
|
||||
path = _path
|
||||
show()
|
||||
content_control.show()
|
||||
|
||||
if scene_name_label:
|
||||
scene_name_label.text = "Loading Game..." # _path.get_file().get_basename()
|
||||
|
||||
if tips.size() > 0:
|
||||
$Control/tips.show()
|
||||
tip_value.text = tips.pick_random()
|
||||
else:
|
||||
$Control/tips.hide()
|
||||
|
||||
# 1. Request Load
|
||||
var error = ResourceLoader.load_threaded_request(path)
|
||||
if error == OK:
|
||||
is_loading = true
|
||||
set_process(true)
|
||||
else:
|
||||
print("Failed to start loading: ", error)
|
||||
# Fallback?
|
||||
@@ -0,0 +1 @@
|
||||
uid://dffsxj8h5sud6
|
||||
Reference in New Issue
Block a user