Cutscene WIP! EaseMover/Wipe cleanup (=

This commit is contained in:
Harmony Honey 2022-12-19 18:55:38 -05:00
parent 43359fec63
commit 528cc2c0d7
22 changed files with 187 additions and 312 deletions

View file

@ -44,10 +44,10 @@ var is_turn := false
var pickup_angle := 12.0
onready var push_ease := EaseMover.new(null, 0.2)
onready var turn_ease := EaseMover.new(null, 0.2)
onready var respawn_ease := EaseMover.new(null, 1.0)
onready var pickup_ease := EaseMover.new(null, 0.2)
onready var push_ease := EaseMover.new(0.2)
onready var turn_ease := EaseMover.new(0.2)
onready var respawn_ease := EaseMover.new(1.0)
onready var pickup_ease := EaseMover.new(0.2)
var velocity := 0.0
export var start_velocity := 100.0

View file

@ -8,21 +8,24 @@ export var from_back := Color("af00ff")
export var to_fill := Color("fffb00")
export var to_back := Color("ffdd00")
var fade_ease = EaseMover.new(0.7)
var is_change := false
var fade_easy = EaseMover.new()
var is_fade := false
func _physics_process(delta):
if is_change:
if !fade_ease.is_complete:
fade_ease.count(delta)
gem_back.color = from_back.linear_interpolate(to_back, fade_ease.smooth())
gem_fill.color = from_fill.linear_interpolate(to_fill, fade_ease.smooth())
else:
is_change = false
if is_fade:
fade_easy.count(delta)
gem_back.color = from_back.linear_interpolate(to_back, fade_easy.smooth())
gem_fill.color = from_fill.linear_interpolate(to_fill, fade_easy.smooth())
if fade_easy.clock == 0 or fade_easy.is_complete:
is_fade = false
func set_color(is_collected := true):
gem_back.color = to_back if is_collected else from_back
gem_fill.color = to_fill if is_collected else from_fill
func fade_color(is_collected := true):
is_change = true
func fade_color(arg := true):
is_fade = true
fade_easy.show = arg
fade_easy.clock = 0 if arg else fade_easy.time

View file

@ -4,6 +4,7 @@ onready var sprites = $Sprites
onready var gem := $Sprites/Gem
onready var area = $Area2D
onready var start_pos := position
var shine_easy := EaseMover.new(0.8)
var player = null
var is_collected := false
@ -26,6 +27,10 @@ func _ready():
sprites.modulate = Color(c,c,c, 0.2)
func _physics_process(delta):
if shine_easy.clock > 0:
shine_easy.count(delta, false)
sprites.scale = Vector2.ONE * lerp(1.0, 1.8, shine_easy.smooth())
# follow player
if is_collected and player != null and is_follow:
var target = player.position + player.rot(Vector2.UP * 20)
@ -36,15 +41,16 @@ func turning(angle):
func pickup(ply):
if is_collected: return
player = ply
is_collected = true
area.set_deferred("monitorable", false)
player = ply
start_pos = position
#area.monitorable = false
area.set_deferred("monitorable", false)
Audio.play(Audio.gem_collect)
func cheat_code(cheat):
if "konami" in cheat:
pass#pickup(Shared.player)
func shine():
shine_easy.clock = shine_easy.time
Audio.play(Audio.gem_show)

View file

@ -6,7 +6,7 @@ var box : Box = null
var is_deploy := false
var last_deploy := false
var easy := EaseMover.new(0.3)
var easy := EaseMover.new()
var _delta := 1.0 / 60.0

View file

@ -10,6 +10,7 @@ onready var anim : AnimationPlayer = $AnimationPlayer
onready var sprites := $Sprites
onready var spr_root := $Sprites/Root
onready var spr_body := $Sprites/Root/Body
var spr_easy := EaseMover.new()
onready var spr_hand_l := $Sprites/Hands/Left
onready var spr_hand_r := $Sprites/Hands/Right
@ -123,6 +124,7 @@ func _enter_tree():
MenuPause.connect("closed", self, "unpause")
UI.connect("dialog_closed", self, "unpause")
Shared.connect("scene_changed", self, "scene")
Wipe.connect("start", self, "wipe_start")
func _ready():
set_hair_back()
@ -135,6 +137,9 @@ func _ready():
l.bezier_track_set_key_value(2, i, -l.bezier_track_get_key_value(2, i))
anim.add_animation("idle_left", l)
func wipe_start(arg):
spr_easy.show = arg
func scene():
# go to last door
if is_instance_valid(Shared.door_in):
@ -166,6 +171,8 @@ func scene():
func _physics_process(delta):
if Engine.editor_hint: return
sprites.modulate.a = spr_easy.count(delta)
if is_dead:
sprites.position += rot(velocity) * delta
sprites.rotate(deg2rad(-dir_x * 240) * delta)
@ -239,6 +246,7 @@ func _physics_process(delta):
# finished
if goal_step > 2:
goal_step = 0
is_goal = false
goal.gem.z_as_relative = false
goal.is_follow = true
@ -678,7 +686,6 @@ func release_anim():
rel.bezier_track_set_key_value(rh, 0, spr_hand_r.position.x)
rel.bezier_track_set_key_value(rh + 1, 0, spr_hand_r.position.y)
anim.add_animation("release", rel)
anim.play("release")
func enter_door():

View file

@ -479,7 +479,7 @@ end_cap_mode = 2
[node name="Torso" type="Line2D" parent="Sprites/Root/Body/Fit"]
position = Vector2( 0, -9.5 )
points = PoolVector2Array( 0, 0, 0, 20 )
points = PoolVector2Array( 0, -5, 0, 20 )
width = 25.0
width_curve = SubResource( 13 )
default_color = Color( 1, 1, 1, 1 )

View file

@ -11,7 +11,7 @@ func _ready():
if Engine.editor_hint: return
CheatCode.connect("activate", self, "cheat_code")
if arrow.is_locked:
if !arrow.is_locked:
arrow.is_locked = Shared.gem_count < gem_count
func set_gem(arg := gem_count):

View file

@ -4,7 +4,7 @@
[ext_resource path="res://media/image/door/door.png" type="Texture" id=2]
[ext_resource path="res://src/actor/door/DoorLittle.gd" type="Script" id=3]
[ext_resource path="res://src/actor/Clock.tscn" type="PackedScene" id=4]
[ext_resource path="res://src/actor/Gem.tscn" type="PackedScene" id=6]
[ext_resource path="res://src/actor/Gem.gd" type="Script" id=5]
[node name="Door" instance=ExtResource( 1 )]
script = ExtResource( 3 )
@ -15,8 +15,17 @@ scale = Vector2( 0.1, 0.1 )
[node name="Door" type="Sprite" parent="Sprites" index="0"]
texture = ExtResource( 2 )
[node name="Gem" parent="." index="3" instance=ExtResource( 6 )]
[node name="Gem" type="Node2D" parent="." index="3"]
position = Vector2( 0, -5 )
script = ExtResource( 5 )
[node name="Back" type="Polygon2D" parent="Gem" index="0"]
color = Color( 0.686275, 0, 1, 1 )
polygon = PoolVector2Array( -30, 0, 0, -30, 30, 0, 0, 30 )
[node name="Fill" type="Polygon2D" parent="Gem/Back" index="0"]
color = Color( 1, 0, 0.913725, 1 )
polygon = PoolVector2Array( -20, 0, 0, -20, 20, 0, 0, 20 )
[node name="Clock" parent="." index="4" instance=ExtResource( 4 )]
visible = false

View file

@ -30,6 +30,11 @@ var zoom_steps := 2
var rot_offset := Vector2.ZERO
var is_pan := false
var pan_ease := EaseMover.new(1.0)
signal pan_complete
func _enter_tree():
Shared.connect("scene_changed", self, "scene_changed")
@ -41,25 +46,32 @@ func _input(event):
start_zoom(zoom_step + 1)
func _process(delta):
# zoom
if is_zoom:
zoom = Vector2.ONE * lerp(zoom_from, zoom_to, zoom_ease.count(delta))
if zoom_ease.is_complete:
is_zoom = false
# rotation
if is_rotating:
if turn_ease.clock < turn_ease.time:
rotation = lerp_angle(turn_from, turn_to, turn_ease.count(delta))
emit_signal("turning", rotation)
# track target
if is_instance_valid(target_node):
target_pos = target_node.global_position
# position
if is_moving:
global_position = global_position.linear_interpolate(target_pos + turn_offset.rotated(rotation), 0.08)
# zoom
if is_zoom:
zoom = Vector2.ONE * lerp(zoom_from, zoom_to, zoom_ease.count(delta))
if zoom_ease.is_complete:
is_zoom = false
if is_pan:
global_position = pan_ease.move(delta)
if pan_ease.is_complete:
emit_signal("pan_complete")
#print("pan_complete")
is_pan = false
else:
# track target
if is_instance_valid(target_node):
target_pos = target_node.global_position
# position
if is_moving:
global_position = global_position.linear_interpolate(target_pos + turn_offset.rotated(rotation), 0.08)
func turn(arg):
turn_from = rotation
@ -99,3 +111,11 @@ func snap_to(pos, turn):
reset_smoothing()
force_update_scroll()
force_update_transform()
func pan(pos : Vector2):
pan_ease.clock = 0
is_pan = true
target_pos = pos
pan_ease.from = global_position
pan_ease.to = target_pos
pan_ease.time = lerp(0.3, 1.0, clamp(pan_ease.from.distance_to(pan_ease.to) / 100.0, 0, 20) / 20)

View file

@ -115,7 +115,7 @@ Vector2(1920, 1080), Vector2(2560, 1440), Vector2(3840, 2160)]
var is_demo := false
func _ready():
Wipe.connect("wipe_out", self, "wipe_out")
Wipe.connect("complete", self, "wipe_complete")
#set_volume(0, 50)
set_volume(1, 50)
set_volume(2, 50)
@ -204,10 +204,11 @@ func wipe_scene(arg, last := csfn):
return false
func wipe_out():
func wipe_complete(arg):
if is_wipe:
Wipe.start(true)
is_wipe = false
change_scene()
Wipe.start(true)
func reset():
wipe_scene(csfn)
@ -216,10 +217,8 @@ func change_scene():
is_wipe = false
boxes.clear()
Cutscene.end_all()
emit_signal("scene_before")
is_reload = next_scene == csfn
if is_reload:
get_tree().reload_current_scene()

View file

@ -1,45 +1,37 @@
extends CanvasLayer
onready var sprite : Sprite = $Sprite
onready var mat : ShaderMaterial = sprite.material
onready var audio := $AudioStreamPlayer
onready var mat : ShaderMaterial = $Sprite.material
signal wipe_in
signal wipe_out
signal start_wipe_in
signal start_wipe_out
signal start
signal complete
var is_wipe := false
var is_in := false
var clock := 0.0
var time := 0.5
var radius := 0.71
var easy = EaseMover.new()
func _ready():
sprite.visible = false
func _process(delta):
if is_wipe:
clock = clamp(clock + (-delta if is_in else delta), 0, time)
var s = smoothstep(0, 1, clock / time)
mat.set_shader_param("radius", easy.count(delta, !is_in) * radius)
mat.set_shader_param("radius", lerp(0, radius, s))
if (clock == 0 and is_in) or (clock == time and !is_in):
if (easy.clock == 0 and is_in) or (easy.clock == easy.time and !is_in):
is_wipe = false
sprite.visible = false
emit_signal("wipe_in") if is_in else emit_signal("wipe_out")
emit_signal("complete", is_in)
func start(arg := false):
is_in = arg
is_wipe = true
sprite.visible = true
clock = time if is_in else 0
emit_signal("start_wipe_in") if is_in else emit_signal("start_wipe_out")
easy.clock = easy.time if is_in else 0
emit_signal("start", is_in)
if !is_in:
audio.pitch_scale = rand_range(0.9, 1.1)
audio.play()

View file

@ -10,11 +10,11 @@ var node
var is_complete setget , get_complete
func _init(_node := node, _time := time, _from := from, _to := to):
node = _node
func _init(_time := time, _from := from, _to := to, _node := node):
time = _time
from = _from
to = _to
node = _node
func count(delta, arg := show):
clock = clamp(clock + (delta if arg else -delta), 0, time)
@ -24,7 +24,7 @@ func move(delta, arg := show):
count(delta, arg)
current = from.linear_interpolate(to, smooth())
if node:
if is_instance_valid(node):
node.rect_position = current
return current

View file

@ -7,6 +7,8 @@ var is_show_goal := false
onready var gem_collect := $GemCollect
var is_collect := false
onready var clock_collect := $Clock
var is_clock := false
onready var start_game := $StartGame
@ -15,32 +17,22 @@ var is_start_game := false
func _enter_tree():
Shared.connect("scene_changed", self, "scene_changed")
func start():
is_playing = true
Cam.set_process_input(false)
Shared.map_clock = 0.0
func end():
is_playing = false
Cam.set_process_input(true)
func end_all():
for i in [gem_collect, goal_show, start_game]:
if i.is_playing:
i.end()
func scene_changed():
if is_playing: return
if is_show_goal:
is_show_goal = false
if is_instance_valid(Shared.goal):
Cutscene.goal_show.begin()
elif is_collect or Cutscene.is_clock:
Cutscene.is_collect = false
Cutscene.is_clock = false
if is_instance_valid(Shared.door_in):
Cutscene.gem_collect.begin()
goal_show.act()
elif is_collect:
is_collect = false
gem_collect.act()
# elif is_clock:
# is_clock = false
# if is_instance_valid(Shared.door_in):
# gem_collect.begin()
elif is_start_game:
Cutscene.is_start_game = false
Cutscene.start_game.begin()
is_start_game = false
start_game.act()

View file

@ -8,11 +8,13 @@
[node name="Cutscene" type="Node"]
script = ExtResource( 1 )
[node name="GemCollect" type="Node" parent="."]
script = ExtResource( 2 )
[node name="StartGame" type="Node" parent="."]
script = ExtResource( 6 )
[node name="GoalShow" type="Node" parent="."]
script = ExtResource( 3 )
[node name="StartGame" type="Node" parent="."]
script = ExtResource( 6 )
[node name="GemCollect" type="Node" parent="."]
script = ExtResource( 2 )
[node name="Clock" type="Node" parent="."]

View file

@ -1,87 +1,24 @@
extends Node
var is_playing := false
var step := 0
var clock := 0.0
var easy := EaseMover.new(0.5)
var is_clock := false
var is_collect := false
var door_dest
var player
func _ready():
set_physics_process(false)
func _physics_process(delta):
clock += delta
func act():
Cutscene.is_playing = true
Shared.player.spr_easy.show = false
yield(Wipe, "complete")
match step:
0:
if clock > 0.15:
next_step()
easy.clock = 0
Audio.play(Audio.gem_collect, 0.8)
if is_collect:
UI.up.show = true
if is_clock:
UI.down.show = true
else:
door_dest.gem.fade_color()
1:
if is_clock:
door_dest.clock.scale = Vector2.ONE * easy.count(delta)
door_dest.gem.scale = Vector2.ONE * (1 - easy.smooth())
door_dest.clock.rotation_degrees = easy.smooth() * 720
door_dest.gem.rotation_degrees = easy.smooth() * -720
if clock > 1.0:
next_step()
easy.clock = 0
UI.gem_label.text = str(Shared.gem_count)
UI.clock_label.text = str(Shared.clock_rank)
2:
player.visible = true
player.modulate.a = easy.count(delta)
if clock > 0.5:
end()
func next_step():
clock = 0.0
step += 1
func begin():
player = Shared.player
door_dest = Shared.door_in
print(Shared.door_in)
for i in [player, door_dest]:
if !is_instance_valid(i):
return
is_playing = true
Cutscene.start()
is_clock = Cutscene.is_clock
is_collect = Cutscene.is_collect
set_physics_process(true)
clock = 0.0
step = 0
player.visible = false
if is_clock:
door_dest.clock.scale = Vector2.ZERO
door_dest.gem.visible = true
else:
door_dest.gem.set_color(false)
func end():
is_playing = false
Cutscene.end()
set_physics_process(false)
Audio.play(Audio.gem_collect, 0.8)
UI.up.show = true
yield(get_tree().create_timer(1.0), "timeout")
UI.gem_label.text = str(Shared.gem_count)
yield(get_tree().create_timer(0.5), "timeout")
Shared.player.spr_easy.show = true
UI.up.show = false
UI.down.show = false
Cutscene.is_playing = false

View file

@ -1,82 +1,20 @@
extends Node
var is_playing := false
var step := 0
var clock := 0.0
var player
var goal
var cam_from := Vector2.ZERO
var cam_to := Vector2.ZERO
var cam_time := 1.0
func _ready():
set_physics_process(false)
func _physics_process(delta):
clock += delta
func act():
if !is_instance_valid(Shared.goal): return
match step:
0:
if clock > 0.3:
next_step()
cam_target(goal.global_position)
1:
cam_move()
if clock > cam_time:
next_step()
2:
if clock > 0.1:
next_step()
Audio.play(Audio.gem_show)
3:
var limit = 0.8
var t = min(clock, limit)
var s = smoothstep(0, 1, t / limit)
goal.scale = Vector2.ONE * lerp(1.8, 1.0, s)
if clock > limit:
next_step()
cam_target(player.global_position)
4:
cam_move()
if clock > cam_time:
end()
func next_step():
clock = 0.0
step += 1
func begin():
player = Shared.player
goal = Shared.goal
Cutscene.is_playing = true
Cam.target_node = null
yield(Wipe, "complete")
for i in [player, goal]:
if !is_instance_valid(i):
return
Cam.pan(Shared.goal.global_position)
yield(Cam, "pan_complete")
is_playing = true
Cutscene.start()
Cam.set_process(false)
Shared.goal.shine()
yield(get_tree().create_timer(0.8), "timeout")
set_physics_process(true)
clock = 0.0
step = 0
func end():
is_playing = false
Cutscene.end()
Cam.set_process(true)
set_physics_process(false)
func cam_target(target):
cam_from = Cam.global_position
cam_to = target
Cam.pan(Shared.player.position)
yield(Cam, "pan_complete")
var d = cam_from.distance_to(cam_to) / 100.0
cam_time = lerp(0.3, 1.0, clamp(d, 0, 20) / 20)
func cam_move():
var s = smoothstep(0, 1, min(clock, cam_time) / cam_time)
Cam.global_position = cam_from.linear_interpolate(cam_to, s)
Cam.target_node = Shared.player
Cutscene.is_playing = false

View file

@ -1,58 +1,22 @@
extends Node
var is_playing := false
var step := 0
var clock := 0.0
var player
func _ready():
set_physics_process(false)
func _physics_process(delta):
clock += delta
match step:
0:
if clock > 0.5:
next_step()
1:
if clock > 0.6:
next_step()
Cam.set_process(true)
2:
if clock > 0.3:
end()
func next_step():
clock = 0.0
step += 1
func begin():
player = Shared.player
if !is_instance_valid(player):
return
is_playing = true
Cutscene.start()
func act():
Cutscene.is_playing = true
Cam.set_process(false)
player.move_and_collide(Vector2(0, -850))
player.anim.play("jump")
Cam.position += Vector2(0, -400)
#MenuMakeover.outfit(MenuMakeover.pale)
if is_instance_valid(Shared.player):
var p = Shared.player
p.move_and_collide(Vector2(0, -850))
p.is_floor = false
p.has_jumped = true
p.anim.play("jump")
if is_instance_valid(Shared.door_in):
Shared.door_in.visible = false
Shared.door_in.arrow.is_locked = true
set_physics_process(true)
clock = 0.0
step = 0
func end():
is_playing = false
Cutscene.end()
yield(get_tree().create_timer(1.2), "timeout")
Cam.set_process(true)
set_physics_process(false)
yield(get_tree().create_timer(0.2), "timeout")
Cutscene.is_playing = false

View file

@ -18,6 +18,7 @@ sprite_path = NodePath("Images/Petals")
[node name="Spring" type="Node2D" parent="."]
position = Vector2( 2, 1 )
script = ExtResource( 6 )
sprites_path = NodePath("../Images")
add_vel = 5.0
weight = 3.0
audio_path = NodePath("../Audio/Hit")

View file

@ -1,7 +1,7 @@
extends CanvasLayer
onready var label := $Label
onready var label_ease := EaseMover.new(null, 1.5)
onready var label_ease := EaseMover.new(1.5)
var is_start := false
var is_back := false

View file

@ -3,11 +3,11 @@ extends MenuBase
onready var hub_label := $Control/Menu/List/Items/Hub
func _ready():
Wipe.connect("start_wipe_out", self, "start_wipe_out")
Wipe.connect("wipe_out", self, "wipe_out")
Wipe.connect("wipe_in", self, "wipe_in")
Wipe.connect("complete", self, "wipe_complete")
func _input(event):
if Wipe.is_wipe: return
if is_open:
if event.is_action_pressed("ui_pause") and !is_sub_menu and (fade_ease.frac() > 0.5):
self.is_open = false
@ -32,18 +32,12 @@ func accept():
"exit":
Shared.wipe_scene(Shared.title_path)
func start_wipe_out():
set_process_input(false)
func wipe_out():
# close menu
func wipe_complete(arg):
if is_open:
# close menu
set_open(false, false)
fade_ease.clock = 0
func wipe_in():
set_process_input(true)
func set_open(arg := is_open, is_audio := true):
.set_open(arg)

View file

@ -2,7 +2,7 @@ extends MenuBase
onready var control := $Control
onready var prompt_ease := EaseMover.new($Control/Prompt)
onready var prompt_ease := EaseMover.new()
var is_prompt := false
onready var prompt_key := $Control/Prompt/VBoxContainer/Key
onready var prompt_timer_label := $Control/Prompt/VBoxContainer/Timer
@ -16,7 +16,7 @@ export var is_gamepad := false
onready var header := $Control/Header
onready var header_back := $Control/Header/Back
onready var header_ease := EaseMover.new(null, 0.2)
onready var header_ease := EaseMover.new(0.2)
onready var header_track := $Control/Menu/List/Spacer
onready var title_label := $Control/Menu/List/Title
@ -25,6 +25,7 @@ var defaults := {}
func _ready():
# get default binds
defaults = Shared.default_keys.duplicate()
prompt_ease.node = $Control/Prompt
func _input(event):
if !is_open: return

View file

@ -0,0 +1,10 @@
shader_type canvas_item;
uniform float radius : hint_range(0.0, 1.0) = 0.5;
uniform vec4 inside_color : hint_color = vec4(0.0);
uniform vec4 outside_color : hint_color = vec4(1.0);
void fragment(){
float dist = distance(vec2(0.5, 0.5), UV);
COLOR = mix(inside_color, outside_color, float(dist > radius));
}