74 lines
2.3 KiB
GDScript
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
|