MagicNStuff/source/src/globals/autoloads/scene_fader/scene_fader.gd

79 lines
1.7 KiB
GDScript

extends CanvasLayer
const _ANIM_LOADING: StringName = &"hover"
var fade_in_duration: float = 2.0
var fade_out_duration: float = 2.0
var is_fading: bool = false
var is_loading: bool = false
@onready var interactive_loader: InteractiveLoader = %InteractiveLoader
@onready var color_rect: ColorRect = %ColorRect
@onready var loading_hint_animations: AnimationPlayer = %LoadingHintAnimations
@onready var loading_hint: TextureRect = %LoadingHint
@onready var loading_label: RichTextLabel = $LoadingLabel
func _ready() -> void:
loading_label.hide()
color_rect.hide()
color_rect.color.a = 0.0
func load_to_path(path: String) -> void:
if is_loading:
return
is_loading = true
await fade_in()
await get_tree().create_timer(1.0).timeout
var scene: PackedScene = await interactive_loader.load_threaded(path)
assert(is_instance_valid(scene), "Scene is invalid.")
get_tree().change_scene_to_packed(scene)
get_tree().paused = false
fade_out()
is_loading = false
func fade_in() -> void:
color_rect.show()
is_fading = true
var tween: Tween = create_tween()
tween.tween_property(color_rect, ^"color:a", 1.0, fade_in_duration)
await tween.finished
is_fading = false
set_loading_hints_visible(true)
func fade_out() -> void:
set_loading_hints_visible(false)
is_fading = true
var tween: Tween = create_tween()
tween.tween_property(color_rect, ^"color:a", 0.0, fade_out_duration)
await tween.finished
color_rect.hide()
is_fading = false
func set_loading_hints_visible(value: bool) -> void:
loading_hint.visible = value
loading_label.visible = value
if value:
loading_label.set_text(loading_label.text) # Restart the effect.
loading_hint_animations.play(_ANIM_LOADING)
else:
loading_hint_animations.stop()