Tales-of-PKMN/game/ui/loading_screen/loading_screen.gd

74 lines
2.3 KiB
GDScript

extends CanvasLayer
@onready var transition_rect : ColorRect = $TransitionRect
@onready var status_label : Label = %StatusLabel
@onready var progress_bar : ProgressBar = %ProgressBar
const FADE_DURATION := 0.6
const MIN_DISPLAY_TIME := 0.4 # évite le flash sur les chargements instantanés
func _ready() -> void:
transition_rect.visible = false
process_mode = Node.PROCESS_MODE_ALWAYS
func change_scene(scene_path : String, message : String = "Chargement...") -> void:
var start_ms := Time.get_ticks_msec()
# --- 1. Afficher l'écran de chargement (fade in) ---
status_label.text = message
progress_bar.value = 0
transition_rect.modulate.a = 0.0
transition_rect.visible = true
var fade_in := create_tween()
fade_in.tween_property(transition_rect, "modulate:a", 1.0, FADE_DURATION)
await fade_in.finished
# --- 2. Lancer le chargement en arrière-plan ---
var err := ResourceLoader.load_threaded_request(scene_path)
if err != OK:
push_error("Échec du lancement du chargement : %s (err %d)" % [scene_path, err])
await _fade_out()
return
# --- 3. Boucle jusqu'à ce que la scène soit prête ---
var prog : Array = []
while true:
var status := ResourceLoader.load_threaded_get_status(scene_path, prog)
match status:
ResourceLoader.THREAD_LOAD_IN_PROGRESS:
if prog.size() > 0:
progress_bar.value = prog[0] * 100.0
await get_tree().process_frame
ResourceLoader.THREAD_LOAD_LOADED:
break
_:
push_error("Échec du chargement de %s" % scene_path)
await _fade_out()
return
var packed : PackedScene = ResourceLoader.load_threaded_get(scene_path)
if packed == null:
push_error("PackedScene nulle pour %s" % scene_path)
await _fade_out()
return
# --- 4. Durée minimale visible (anti-flash) ---
var elapsed := (Time.get_ticks_msec() - start_ms) / 1000.0
if elapsed < MIN_DISPLAY_TIME:
await get_tree().create_timer(MIN_DISPLAY_TIME - elapsed).timeout
# --- 5. Changer de scène ---
get_tree().change_scene_to_packed(packed)
# --- 6. Laisser la nouvelle scène s'initialiser, puis fade out ---
await get_tree().process_frame
await get_tree().process_frame
await _fade_out()
func _fade_out() -> void:
var tween := create_tween()
tween.tween_property(transition_rect, "modulate:a", 0.0, FADE_DURATION)
await tween.finished
transition_rect.visible = false