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