This repository has been archived on 2024-04-19. You can view files and clone it, but cannot push or open issues or pull requests.
Jessist/addons/awesome_splash/core/BaseSplashContainer.gd

288 lines
6.8 KiB
GDScript3
Raw Normal View History

2022-06-18 13:05:48 +02:00
tool
extends "res://addons/awesome_splash/core/BaseTransitionScreen.gd"
enum SkipScreenType {
NONE,
SKIP_ONE_SCREEN_WHEN_CLICKED,
SKIP_ALL_SCREEN_WHEN_CLICKED,
}
enum SkipCustomNodeType {
AUTO, # wait in default_custom_node_time and go to next screen
CUSTOM,
}
signal finished
signal finished_all
var skip_custom_screen_type: int = 0
var skip_screen_type: int = 0
var current_screen
var list_screen = []
var awe_timer = AweTimer.new()
var default_custom_node_time: float = 1.0
### BUILD IN ENGINE METHODS ====================================================
func _get_configuration_warning():
var warnings = PoolStringArray()
if get_children().size() == 0:
warnings.append("%s is missing a AweSplashScreen or Custom Node" % name)
if move_to_scene == null:
warnings.append("%s still hasn't set move_to_scene" % name)
return warnings.join("\n")
func _ready():
if Engine.editor_hint:
return
_setup()
func _input(event):
if not _skip_awe_splash_by_event(event):
return
if _check_current_screen_is_custom() \
and skip_custom_screen_type == SkipCustomNodeType.CUSTOM:
return
if skip_screen_type == SkipScreenType.NONE:
return
if skip_screen_type == \
SkipScreenType.SKIP_ONE_SCREEN_WHEN_CLICKED:
status = TransitionStatus.NONE
awe_timer.cancel()
_on_finished_animation_screen_disappear()
if skip_screen_type == \
SkipScreenType.SKIP_ALL_SCREEN_WHEN_CLICKED:
status = TransitionStatus.NONE
for screen in list_screen:
screen.queue_free()
list_screen = []
awe_timer.cancel()
_on_finished_animation_screen_disappear()
func _get(property): # overridden
if property == "custom_node/type":
return skip_custom_screen_type
if property == "custom_node/default_time":
return default_custom_node_time
if property == "skip/type":
return skip_screen_type
func _set(property, value): # overridden
if property == "custom_node/type":
skip_custom_screen_type = value
if property == "custom_node/default_time":
default_custom_node_time = value
if property == "skip/type":
skip_screen_type = value
property_list_changed_notify() # update inspect
return true
func _get_property_list():
if not Engine.editor_hint or not is_inside_tree():
return []
var property_list = []
property_list.append(
{
"name": "custom_node/type",
"type": TYPE_INT,
"usage": PROPERTY_USAGE_DEFAULT,
"hint": PROPERTY_HINT_ENUM,
"hint_string": PoolStringArray(SkipCustomNodeType.keys()).join(","),
}
)
if skip_custom_screen_type == SkipCustomNodeType.AUTO:
property_list.append(
{
"name": "custom_node/default_time",
"type": TYPE_REAL,
"usage": PROPERTY_USAGE_DEFAULT,
"hint": PROPERTY_HINT_NONE,
}
)
property_list.append(
{
"name": "skip/type",
"type": TYPE_INT,
"usage": PROPERTY_USAGE_DEFAULT,
"hint": PROPERTY_HINT_ENUM,
"hint_string": PoolStringArray(SkipScreenType.keys()).join(","),
}
)
return property_list
### PUBLIC METHODS =============================================================
func start_play_list_screen():
var first_screen = list_screen.pop_front()
if first_screen:
play_screen(first_screen)
else:
emit_signal("finished")
emit_signal("finished_all")
func play_next_screen():
_remove_old_screen()
# Get next splash screen and remove it in queue (list_screen)
var next_screen = list_screen.pop_front()
if next_screen == null:
emit_signal("finished")
emit_signal("finished_all")
return
emit_signal("finished")
play_screen(next_screen)
# When you call func "play_screen":
# How it works:
# Presudocode:
# 1 - Run animation screen "appear" (ex: Fade, Diamond, ...).
# 2 - Wait for animation "appear" finished.
# 3 - Run animation of splash screen.
# 4 - Wait for animation of splash finished.
# 5 - Run animation "disappear".
# 6 - Wait for animation "disappear" finished.
# 7 - If the next screen exist in list_screen: call "play_screen" with
# next screen and return to step 1.
# - If the next screen doesn't exist: Emit signal "finished_all".
func play_screen(screen):
_remove_old_screen()
screen.visible = true
current_screen = screen
viewport.add_child(current_screen)
if screen is AweSplashScreen:
current_screen.connect(
"finished",
self,
"_on_finished_animation_splash_screen"
)
_update_screen_size_changed()
if _is_current_screen_skip_appear_trainsition():
_on_finished_animation_screen_appear()
else:
_start_animation_screen_will_appear()
func transition_next_screen():
if _check_current_screen_is_awe_screen():
play_next_screen()
else:
# Custom Node
_on_finished_waiting_custom_screen()
### PRIVATE METHODS ============================================================
func _setup():
_setup_transition()
add_child(awe_timer)
awe_timer.connect("finished", self, "_on_finished_waiting_custom_screen")
for node in get_children():
if node is AweTimer:
continue
if node == viewport_container:
continue
list_screen.append(node)
remove_child(node)
func _check_current_screen_is_awe_screen():
return self.current_screen is AweSplashScreen
func _check_current_screen_is_custom():
return not _check_current_screen_is_awe_screen()
func _update_screen_size_changed():
if Engine.editor_hint or self.current_screen == null:
return
._update_screen_size_changed()
if not _check_current_screen_is_custom():
var viewport_size = get_viewport_rect().size
self.current_screen.update_aspect_node_frame(viewport_size)
func _on_finished_waiting_custom_screen():
_start_animation_screen_will_disappear()
func _on_finished_animation_splash_screen():
if _is_current_screen_skip_disappear_trainsition():
_on_finished_animation_screen_disappear()
else:
_start_animation_screen_will_disappear()
func _on_finished_animation_screen_appear():
._on_finished_animation_screen_appear()
if _check_current_screen_is_awe_screen():
current_screen.play()
return
# current screen is custom
if current_screen.has_method("_custom_splash_did_appear"):
current_screen._custom_splash_did_appear()
if skip_custom_screen_type == SkipCustomNodeType.CUSTOM:
return
awe_timer.wait(default_custom_node_time)
func _on_finished_animation_screen_disappear():
._on_finished_animation_screen_disappear()
if current_screen.has_method("_custom_splash_did_disappear"):
current_screen._custom_splash_did_disappear()
play_next_screen()
func _remove_old_screen():
if is_instance_valid(current_screen):
current_screen.queue_free()
func _skip_awe_splash_by_event(event) -> bool:
return false
func _is_current_screen_skip_appear_trainsition() -> bool:
if "is_skip_appear_transition" in current_screen:
return current_screen.is_skip_appear_transition
return false
func _is_current_screen_skip_disappear_trainsition() -> bool:
if "is_skip_disappear_transition" in current_screen:
return current_screen.is_skip_disappear_transition
return false