120 lines
3.2 KiB
GDScript
120 lines
3.2 KiB
GDScript
class_name PopochiuTransitionLayer
|
|
extends Control
|
|
## Used to play different transition animations when moving between rooms, skipping a cutscene,
|
|
## and so on.
|
|
|
|
signal transition_finished(transition_name: String)
|
|
|
|
## Available transition types.
|
|
enum {
|
|
## Fades in and out.
|
|
FADE_IN_OUT,
|
|
## Fades in.
|
|
FADE_IN,
|
|
## Fades out.
|
|
FADE_OUT,
|
|
## Passes down and up.
|
|
PASS_DOWN_IN_OUT,
|
|
## Passes down.
|
|
PASS_DOWN_IN,
|
|
## Passes up.
|
|
PASS_DOWN_OUT,
|
|
}
|
|
|
|
|
|
#region Godot ######################################################################################
|
|
func _ready() -> void:
|
|
# Connect to childrens' signals
|
|
$AnimationPlayer.animation_finished.connect(_transition_finished)
|
|
$Curtain.modulate = PopochiuUtils.e.settings.fade_color
|
|
|
|
# Make sure the transition layer is ready
|
|
# if it has to be visible in the first room
|
|
if PopochiuUtils.e.settings.show_tl_in_first_room and Engine.get_process_frames() == 0:
|
|
$Curtain.show()
|
|
_show()
|
|
else:
|
|
$AnimationPlayer.play("RESET")
|
|
await get_tree().process_frame
|
|
|
|
_hide()
|
|
|
|
|
|
#endregion
|
|
|
|
#region Public #####################################################################################
|
|
## Plays a transition with the animation identified by [param type] and that lasts [param duration]
|
|
## (in seconds). The transition can be one of the following:
|
|
## [enum PopochiuTransitionLayer.FADE_IN_OUT], [enum PopochiuTransitionLayer.FADE_IN],
|
|
## [enum PopochiuTransitionLayer.FADE_OUT], [enum PopochiuTransitionLayer.PASS_DOWN_IN_OUT],
|
|
## [enum PopochiuTransitionLayer.PASS_DOWN_IN], [enum PopochiuTransitionLayer.PASS_DOWN_OUT].
|
|
func play_transition(type := FADE_IN, duration := 1.0) -> void:
|
|
_show()
|
|
|
|
# ---- Play RESET in order to fix #168 ---------------------------------------------------------
|
|
$AnimationPlayer.play("RESET")
|
|
await get_tree().process_frame
|
|
# --------------------------------------------------------- Play RESET in order to fix #168 ----
|
|
|
|
$AnimationPlayer.speed_scale = 1.0 / duration
|
|
|
|
match type:
|
|
FADE_IN_OUT:
|
|
$AnimationPlayer.play("fade")
|
|
await $AnimationPlayer.animation_finished
|
|
$AnimationPlayer.play_backwards("fade")
|
|
await $AnimationPlayer.animation_finished
|
|
_hide()
|
|
FADE_IN:
|
|
$AnimationPlayer.play("fade")
|
|
FADE_OUT:
|
|
$AnimationPlayer.play_backwards("fade")
|
|
await $AnimationPlayer.animation_finished
|
|
_hide()
|
|
PASS_DOWN_IN_OUT:
|
|
$AnimationPlayer.play("pass")
|
|
await $AnimationPlayer.animation_finished
|
|
$AnimationPlayer.play_backwards("pass")
|
|
await $AnimationPlayer.animation_finished
|
|
_hide()
|
|
PASS_DOWN_IN:
|
|
$AnimationPlayer.play("pass")
|
|
PASS_DOWN_OUT:
|
|
$AnimationPlayer.play_backwards("pass")
|
|
await $AnimationPlayer.animation_finished
|
|
_hide()
|
|
|
|
|
|
## Shows the curtain without playing any transition.
|
|
func show_curtain() -> void:
|
|
$Curtain.modulate = PopochiuUtils.e.settings.fade_color
|
|
$Curtain.show()
|
|
_show()
|
|
|
|
|
|
## Hides the transition layer.
|
|
func hide_curtain() -> void:
|
|
_hide()
|
|
|
|
|
|
#endregion
|
|
|
|
#region Private ####################################################################################
|
|
func _transition_finished(anim_name := "") -> void:
|
|
if anim_name == "RESET":
|
|
return
|
|
|
|
transition_finished.emit(anim_name)
|
|
|
|
|
|
func _show() -> void:
|
|
show()
|
|
PopochiuUtils.g.hide_interface()
|
|
|
|
|
|
func _hide() -> void:
|
|
hide()
|
|
PopochiuUtils.g.show_interface()
|
|
|
|
|
|
#endregion
|