Add animated transition beetween levels

This commit is contained in:
JPCard 2020-04-30 20:08:51 -03:00 committed by Nathan Lovato
parent 5c540c668b
commit 91e0659b8c
10 changed files with 392 additions and 79 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

View file

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="StreamTexture"
path="res://.import/loading_icon.png-e328504ca04771078a22cab4caafd41a.stex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/UI/loading_icon.png"
dest_files=[ "res://.import/loading_icon.png-e328504ca04771078a22cab4caafd41a.stex" ]
[params]
compress/mode=0
compress/lossy_quality=0.7
compress/hdr_mode=0
compress/bptc_ldr=0
compress/normal_map=0
flags/repeat=0
flags/filter=true
flags/mipmaps=false
flags/anisotropic=false
flags/srgb=2
process/fix_alpha_border=true
process/premult_alpha=false
process/HDR_as_SRGB=false
process/invert_color=false
stream=false
size_limit=0
detect_3d=true
svg/scale=1.0

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

View file

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="StreamTexture"
path="res://.import/player_art.png-7b84e8940437deef8a50bb0d84c732ca.stex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/UI/player_art.png"
dest_files=[ "res://.import/player_art.png-7b84e8940437deef8a50bb0d84c732ca.stex" ]
[params]
compress/mode=0
compress/lossy_quality=0.7
compress/hdr_mode=0
compress/bptc_ldr=0
compress/normal_map=0
flags/repeat=0
flags/filter=true
flags/mipmaps=false
flags/anisotropic=false
flags/srgb=2
process/fix_alpha_border=true
process/premult_alpha=false
process/HDR_as_SRGB=false
process/invert_color=false
stream=false
size_limit=0
detect_3d=true
svg/scale=1.0

View file

@ -17,6 +17,11 @@ points = PoolVector2Array( 0, 0, 40, 0, 40, 40, 0, 40 )
0/tile_mode = 0
0/occluder_offset = Vector2( 0, 0 )
0/navigation_offset = Vector2( 0, 0 )
0/shape_offset = Vector2( 0, 0 )
0/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 )
0/shape = SubResource( 1 )
0/shape_one_way = false
0/shape_one_way_margin = 1.0
0/shapes = [ {
"autotile_coord": Vector2( 0, 0 ),
"one_way": false,
@ -33,6 +38,11 @@ points = PoolVector2Array( 0, 0, 40, 0, 40, 40, 0, 40 )
1/tile_mode = 0
1/occluder_offset = Vector2( 0, 0 )
1/navigation_offset = Vector2( 0, 0 )
1/shape_offset = Vector2( 0, 0 )
1/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 )
1/shape = SubResource( 2 )
1/shape_one_way = true
1/shape_one_way_margin = 1.0
1/shapes = [ {
"autotile_coord": Vector2( 0, 0 ),
"one_way": true,
@ -49,6 +59,10 @@ points = PoolVector2Array( 0, 0, 40, 0, 40, 40, 0, 40 )
2/tile_mode = 0
2/occluder_offset = Vector2( 0, 0 )
2/navigation_offset = Vector2( 0, 0 )
2/shape_offset = Vector2( 0, 0 )
2/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 )
2/shape_one_way = false
2/shape_one_way_margin = 0.0
2/shapes = [ ]
2/z_index = 0
3/name = "purple"
@ -59,5 +73,9 @@ points = PoolVector2Array( 0, 0, 40, 0, 40, 40, 0, 40 )
3/tile_mode = 0
3/occluder_offset = Vector2( 0, 0 )
3/navigation_offset = Vector2( 0, 0 )
3/shape_offset = Vector2( 0, 0 )
3/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 )
3/shape_one_way = false
3/shape_one_way_margin = 0.0
3/shapes = [ ]
3/z_index = 0

View file

@ -59,6 +59,11 @@ points = PoolVector2Array( 0, 0, 80, 0, 80, 80, 0, 80 )
3/autotile/z_index_map = [ ]
3/occluder_offset = Vector2( 0, 0 )
3/navigation_offset = Vector2( 0, 0 )
3/shape_offset = Vector2( 0, 0 )
3/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 )
3/shape = SubResource( 1 )
3/shape_one_way = false
3/shape_one_way_margin = 1.0
3/shapes = [ {
"autotile_coord": Vector2( 0, 1 ),
"one_way": false,

View file

@ -1,12 +1,14 @@
extends Node
# Loads and unloads levels
onready var scene_tree := get_tree()
var _game: Node = null
var _player: Player = null
var _level: Node2D = null
onready var scene_tree := get_tree()
func setup(game: Node, player: Player, Level: PackedScene) -> void:
_game = game
@ -15,32 +17,35 @@ func setup(game: Node, player: Player, Level: PackedScene) -> void:
func trigger(NewLevel: PackedScene, portal_name: String = "") -> void:
_game.remove_child(_player)
if _level:
scene_tree.paused = true
# _game.transition.animation_player.play("transition")
_game.transition.start_transition_animation()
# Covers the screen before changing the level to avoid visual discrepancies
yield(_game.transition, "screen_covered")
_level.queue_free()
yield(_level, "tree_exited")
# The player is removed after the transition is covering the screen
_game.remove_child(_player)
_level = NewLevel.instance()
var player_position_node: Node2D = (
_level.get_node("Checkpoints").get_child(0)
if portal_name.empty()
else _level.get_node("Portals/%s" % portal_name))
else _level.get_node("Portals/%s" % portal_name)
)
_player.global_position = player_position_node.global_position
_player.has_teleported = not portal_name.empty()
for checkpoint_name in _game.visited_checkpoints.get(_level.name, []):
var checkpoint: Area2D = _level.get_node("Checkpoints/%s" % checkpoint_name)
checkpoint.is_visited = true
# if _game.transition.animation_player.current_animation == "transition":
# yield(_game.transition, "peaked")
_game.level = _level
_game.add_child(_level)
_game.add_child(_player)
# The loading is done
_game.transition.finish_transition_animation()
scene_tree.paused = false

View file

@ -1,57 +1,12 @@
[gd_scene load_steps=9 format=2]
[gd_scene load_steps=8 format=2]
[ext_resource path="res://src/Main/Game.gd" type="Script" id=1]
[ext_resource path="res://assets/theme/gdquest.theme" type="Theme" id=2]
[ext_resource path="res://src/UI/debug/DebugDock.gd" type="Script" id=3]
[ext_resource path="res://src/UI/debug/DebugPanel.tscn" type="PackedScene" id=4]
[ext_resource path="res://src/Player/Player.tscn" type="PackedScene" id=5]
[ext_resource path="res://src/Levels/SkyParallaxBackground.tscn" type="PackedScene" id=6]
[sub_resource type="Animation" id=1]
resource_name = "<BASE>"
length = 0.001
tracks/0/type = "value"
tracks/0/path = NodePath(".:modulate")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/keys = {
"times": PoolRealArray( 0 ),
"transitions": PoolRealArray( 1 ),
"update": 0,
"values": [ Color( 1, 1, 1, 0 ) ]
}
[sub_resource type="Animation" id=2]
resource_name = "transition"
length = 0.6
tracks/0/type = "value"
tracks/0/path = NodePath(".:modulate")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/keys = {
"times": PoolRealArray( 0, 0.4, 0.6 ),
"transitions": PoolRealArray( 0.732043, 1.51572, 1 ),
"update": 0,
"values": [ Color( 1, 1, 1, 0 ), Color( 1, 1, 1, 1 ), Color( 1, 1, 1, 0 ) ]
}
tracks/1/type = "method"
tracks/1/path = NodePath(".")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/keys = {
"times": PoolRealArray( 0.4 ),
"transitions": PoolRealArray( 1 ),
"values": [ {
"args": [ "peaked" ],
"method": "emit_signal"
} ]
}
[ext_resource path="res://src/UI/Transition.tscn" type="PackedScene" id=5]
[ext_resource path="res://src/Player/Player.tscn" type="PackedScene" id=8]
[ext_resource path="res://src/Levels/SkyParallaxBackground.tscn" type="PackedScene" id=9]
[node name="Game" type="Node"]
script = ExtResource( 1 )
@ -92,21 +47,10 @@ mouse_filter = 2
reference_path = NodePath("../../../../../Game/Player/StateMachine")
properties = PoolStringArray( "_state_name" )
[node name="Transition" type="ColorRect" parent="UI"]
pause_mode = 2
modulate = Color( 1, 1, 1, 0 )
margin_right = 1920.0
margin_bottom = 1080.0
mouse_filter = 2
color = Color( 0, 0, 0, 1 )
[node name="Transition" parent="UI" instance=ExtResource( 5 )]
[node name="AnimationPlayer" type="AnimationPlayer" parent="UI/Transition"]
autoplay = "<BASE>"
anims/<BASE> = SubResource( 1 )
anims/transition = SubResource( 2 )
[node name="Player" parent="." instance=ExtResource( 8 )]
[node name="Player" parent="." instance=ExtResource( 5 )]
[node name="SkyParallaxBackground" parent="." instance=ExtResource( 6 )]
[node name="SkyParallaxBackground" parent="." instance=ExtResource( 9 )]
[editable path="Player"]

View file

@ -1,6 +1,36 @@
extends ColorRect
signal screen_covered
signal peaked
var _loading_anim_started := false
onready var animation_player: AnimationPlayer = $AnimationPlayer
onready var _animation_player: AnimationPlayer = $AnimationPlayer
# The level transition animations will be fade_outin->[fade_in_extras->
# loading->fade_out_extras->]fade_out
# [fade_in_extras->loading->fade_out_extras->] is optional and its
# length depends on the extra time the LevelLoader takes to load the next level
func start_transition_animation() -> void:
_animation_player.play("fade_in")
func finish_transition_animation() -> void:
if _loading_anim_started:
_animation_player.play("fade_out_extras")
_loading_anim_started = false
else:
_animation_player.play("fade_out")
func _on_AnimationPlayer_animation_finished(anim_name: String) -> void:
if anim_name == "fade_in":
emit_signal("screen_covered")
_animation_player.play("fade_in_extras")
elif anim_name == "fade_in_extras":
_loading_anim_started = true
_animation_player.play("loading")
elif anim_name == "fade_out_extras":
_animation_player.play("fade_out")

243
game/src/UI/Transition.tscn Normal file
View file

@ -0,0 +1,243 @@
[gd_scene load_steps=10 format=2]
[ext_resource path="res://assets/UI/loading_icon.png" type="Texture" id=1]
[ext_resource path="res://assets/UI/player_art.png" type="Texture" id=2]
[ext_resource path="res://src/UI/Transition.gd" type="Script" id=3]
[sub_resource type="Animation" id=1]
resource_name = "<BASE>"
length = 0.001
loop = true
tracks/0/type = "value"
tracks/0/path = NodePath(".:modulate")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/keys = {
"times": PoolRealArray( 0 ),
"transitions": PoolRealArray( 1 ),
"update": 0,
"values": [ Color( 1, 1, 1, 0 ) ]
}
[sub_resource type="Animation" id=2]
resource_name = "fade_in"
length = 0.6
tracks/0/type = "value"
tracks/0/path = NodePath(".:modulate")
tracks/0/interp = 1
tracks/0/loop_wrap = false
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/keys = {
"times": PoolRealArray( 0, 0.5, 0.6 ),
"transitions": PoolRealArray( 1, 1, 1 ),
"update": 0,
"values": [ Color( 1, 1, 1, 0 ), Color( 1, 1, 1, 1 ), Color( 1, 1, 1, 1 ) ]
}
tracks/1/type = "value"
tracks/1/path = NodePath("LoadingSprite:modulate")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/keys = {
"times": PoolRealArray( 0 ),
"transitions": PoolRealArray( 1 ),
"update": 0,
"values": [ Color( 1, 1, 1, 0 ) ]
}
tracks/2/type = "value"
tracks/2/path = NodePath("PlayerArtSprite:modulate")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/imported = false
tracks/2/enabled = true
tracks/2/keys = {
"times": PoolRealArray( 0 ),
"transitions": PoolRealArray( 1 ),
"update": 0,
"values": [ Color( 1, 1, 1, 0 ) ]
}
[sub_resource type="Animation" id=3]
resource_name = "fade_in_extras"
length = 0.3
tracks/0/type = "value"
tracks/0/path = NodePath("LoadingSprite:frame")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/keys = {
"times": PoolRealArray( 0 ),
"transitions": PoolRealArray( 1 ),
"update": 1,
"values": [ 0 ]
}
tracks/1/type = "value"
tracks/1/path = NodePath("LoadingSprite:modulate")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/keys = {
"times": PoolRealArray( 0, 0.3 ),
"transitions": PoolRealArray( 1, 1 ),
"update": 0,
"values": [ Color( 1, 1, 1, 0 ), Color( 1, 1, 1, 1 ) ]
}
tracks/2/type = "value"
tracks/2/path = NodePath("PlayerArtSprite:modulate")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/imported = false
tracks/2/enabled = true
tracks/2/keys = {
"times": PoolRealArray( 0, 0.3 ),
"transitions": PoolRealArray( 1, 1 ),
"update": 0,
"values": [ Color( 1, 1, 1, 0 ), Color( 1, 1, 1, 1 ) ]
}
tracks/3/type = "value"
tracks/3/path = NodePath("PlayerArtSprite:position")
tracks/3/interp = 1
tracks/3/loop_wrap = true
tracks/3/imported = false
tracks/3/enabled = true
tracks/3/keys = {
"times": PoolRealArray( 0 ),
"transitions": PoolRealArray( 1 ),
"update": 0,
"values": [ Vector2( 350, 862 ) ]
}
tracks/4/type = "value"
tracks/4/path = NodePath("PlayerArtSprite:flip_h")
tracks/4/interp = 1
tracks/4/loop_wrap = true
tracks/4/imported = false
tracks/4/enabled = true
tracks/4/keys = {
"times": PoolRealArray( 0 ),
"transitions": PoolRealArray( 1 ),
"update": 1,
"values": [ false ]
}
[sub_resource type="Animation" id=4]
length = 0.6
tracks/0/type = "value"
tracks/0/path = NodePath(".:modulate")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/keys = {
"times": PoolRealArray( 0, 0.1, 0.6 ),
"transitions": PoolRealArray( 1, 1, 1 ),
"update": 0,
"values": [ Color( 1, 1, 1, 1 ), Color( 1, 1, 1, 1 ), Color( 1, 1, 1, 0 ) ]
}
[sub_resource type="Animation" id=5]
resource_name = "fade_out_extras"
length = 0.3
tracks/0/type = "value"
tracks/0/path = NodePath("LoadingSprite:modulate")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/keys = {
"times": PoolRealArray( 0, 0.3 ),
"transitions": PoolRealArray( 1, 1 ),
"update": 0,
"values": [ Color( 1, 1, 1, 1 ), Color( 1, 1, 1, 0 ) ]
}
tracks/1/type = "value"
tracks/1/path = NodePath("PlayerArtSprite:modulate")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/keys = {
"times": PoolRealArray( 0, 0.3 ),
"transitions": PoolRealArray( 1, 1 ),
"update": 0,
"values": [ Color( 1, 1, 1, 1 ), Color( 1, 1, 1, 0 ) ]
}
[sub_resource type="Animation" id=6]
length = 3.6
loop = true
tracks/0/type = "value"
tracks/0/path = NodePath("LoadingSprite:frame")
tracks/0/interp = 0
tracks/0/loop_wrap = false
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/keys = {
"times": PoolRealArray( 0, 0.15, 0.3, 0.45, 0.6, 0.75, 0.9, 1.05, 1.2, 1.35, 1.5, 1.65, 1.8, 1.95, 2.1, 2.25, 2.4, 2.55, 2.7, 2.85, 3, 3.15, 3.3, 3.45 ),
"transitions": PoolRealArray( 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ),
"update": 1,
"values": [ 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7 ]
}
tracks/1/type = "value"
tracks/1/path = NodePath("PlayerArtSprite:position")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/keys = {
"times": PoolRealArray( 0, 0.2, 0.4, 0.6, 0.8, 1, 1.2, 1.4, 1.6, 1.8, 2, 2.2, 2.4, 2.6, 2.8, 3, 3.2, 3.4 ),
"transitions": PoolRealArray( 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ),
"update": 0,
"values": [ Vector2( 350, 862 ), Vector2( 450, 832 ), Vector2( 550, 862 ), Vector2( 650, 832 ), Vector2( 750, 862 ), Vector2( 850, 832 ), Vector2( 950, 862 ), Vector2( 1050, 832 ), Vector2( 1150, 862 ), Vector2( 1250, 832 ), Vector2( 1150, 862 ), Vector2( 1050, 832 ), Vector2( 950, 862 ), Vector2( 850, 832 ), Vector2( 750, 862 ), Vector2( 650, 832 ), Vector2( 550, 862 ), Vector2( 450, 832 ) ]
}
tracks/2/type = "value"
tracks/2/path = NodePath("PlayerArtSprite:flip_h")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/imported = false
tracks/2/enabled = true
tracks/2/keys = {
"times": PoolRealArray( 0, 1.8 ),
"transitions": PoolRealArray( 1, 1 ),
"update": 1,
"values": [ false, true ]
}
[node name="Transition" type="ColorRect"]
pause_mode = 2
modulate = Color( 1, 1, 1, 0 )
margin_right = 1920.0
margin_bottom = 1080.0
mouse_filter = 2
color = Color( 0, 0, 0, 1 )
script = ExtResource( 3 )
__meta__ = {
"_edit_use_anchors_": false
}
[node name="AnimationPlayer" type="AnimationPlayer" parent="."]
autoplay = "<BASE>"
anims/<BASE> = SubResource( 1 )
anims/fade_in = SubResource( 2 )
anims/fade_in_extras = SubResource( 3 )
anims/fade_out = SubResource( 4 )
anims/fade_out_extras = SubResource( 5 )
anims/loading = SubResource( 6 )
[node name="LoadingSprite" type="Sprite" parent="."]
modulate = Color( 1, 1, 1, 0 )
position = Vector2( 1809.7, 975.4 )
scale = Vector2( 2, 2 )
texture = ExtResource( 1 )
hframes = 8
[node name="PlayerArtSprite" type="Sprite" parent="."]
modulate = Color( 1, 1, 1, 0 )
position = Vector2( 350, 862 )
texture = ExtResource( 2 )
[connection signal="animation_finished" from="AnimationPlayer" to="." method="_on_AnimationPlayer_animation_finished"]