feat: Add a loading screen, a lobby scene, and a new main game script, along with a custom font.

This commit is contained in:
Yogi Wiguna
2026-03-17 11:11:00 +08:00
parent 49c8d794c2
commit b877f94e34
8 changed files with 345 additions and 17 deletions
+108
View File
@@ -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?
+1
View File
@@ -0,0 +1 @@
uid://dffsxj8h5sud6