65 lines
1.4 KiB
GDScript
65 lines
1.4 KiB
GDScript
class_name ScreenFade
|
|
extends ColorRect
|
|
|
|
signal transition_completed(generation: int, faded_to_black: bool)
|
|
|
|
@export_range(0.01, 3.0, 0.01) var fade_out_duration: float = 0.4
|
|
@export_range(0.01, 3.0, 0.01) var fade_in_duration: float = 0.45
|
|
|
|
var _fade_tween: Tween
|
|
|
|
|
|
func _ready() -> void:
|
|
modulate.a = 0.0
|
|
visible = false
|
|
|
|
|
|
func fade_to_black(generation: int) -> void:
|
|
_start_fade(1.0, fade_out_duration, generation, true)
|
|
|
|
|
|
func fade_from_black(generation: int) -> void:
|
|
visible = true
|
|
modulate.a = 1.0
|
|
_start_fade(0.0, fade_in_duration, generation, false)
|
|
|
|
|
|
func reset_immediately() -> void:
|
|
if _fade_tween != null and _fade_tween.is_valid():
|
|
_fade_tween.kill()
|
|
_fade_tween = null
|
|
modulate.a = 0.0
|
|
visible = false
|
|
|
|
|
|
func _start_fade(
|
|
target_alpha: float,
|
|
duration: float,
|
|
generation: int,
|
|
faded_to_black: bool,
|
|
) -> void:
|
|
if _fade_tween != null and _fade_tween.is_valid():
|
|
_fade_tween.kill()
|
|
visible = true
|
|
_fade_tween = create_tween()
|
|
_fade_tween.set_trans(Tween.TRANS_QUAD)
|
|
_fade_tween.set_ease(
|
|
Tween.EASE_IN if faded_to_black else Tween.EASE_OUT
|
|
)
|
|
_fade_tween.tween_property(
|
|
self,
|
|
"modulate:a",
|
|
target_alpha,
|
|
maxf(duration, 0.01)
|
|
)
|
|
_fade_tween.finished.connect(
|
|
_on_fade_finished.bind(generation, faded_to_black),
|
|
CONNECT_ONE_SHOT
|
|
)
|
|
|
|
|
|
func _on_fade_finished(generation: int, faded_to_black: bool) -> void:
|
|
_fade_tween = null
|
|
if not faded_to_black:
|
|
visible = false
|
|
transition_completed.emit(generation, faded_to_black)
|