xiandie/scene/little_game/书架/陆小蝶名字.gd

105 lines
3.3 KiB
GDScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

@tool
extends Sprite2D
signal finished
@export_tool_button("Reset Stamps", "Callable") var reset_action := _debug_reset_stamps
func play() -> void:
visible = true
var tween = create_tween()
tween.tween_interval(2.0)
# var final_modulate = Color.PALE_VIOLET_RED
tween.tween_property(self, "self_modulate:a", 0.0, 4.0)
# tween.parallel().tween_property(get_parent(), "modulate", final_modulate, 12.0)
tween = create_tween()
# 在小蝶名字消失的末尾(还没完全消失),开始盖章
tween.tween_interval(4.5)
# 小蝶名字消失后再显示其他名字
var interval = 1.0
# var interval = 0.1 # 很快,测试用
var children = $seals.get_children()
# 前四个按顺序,后面的乱序
var part1 = children.slice(0, 4)
var part2 = children.slice(4, children.size())
part2.shuffle()
for c in part1:
c.visible = false
tween.tween_interval(interval)
tween.tween_callback(_stamp_seal.bind(c))
for c in part2:
c.visible = false
tween.tween_interval(interval)
tween.tween_callback(_stamp_seal.bind(c))
interval = lerpf(interval, 0.15, 0.35)
# 最后一个印章消失后,稍加等待,发射完成信号
tween.tween_callback(_final_effect)
tween.tween_interval(4.5)
tween.tween_callback(_jump_scare)
tween.tween_interval(1.0)
tween.tween_callback(finished.emit)
# 共 6 画 28 个印章,+前 4 个独立布置,共至少 32 seals
var points_per_stroke = [5, 3, 6, 4, 7, 3]
func _debug_reset_stamps():
print("Reset Stamps")
var paths_root = $PathRoot
var stroke_id = 0
var stamp_id = 5 # 从 5 开始1-4 手动布置
for p in paths_root.get_children():
if p is Path2D:
var p_follow = p.get_node("PathFollow2D") as PathFollow2D
var stroke_points = points_per_stroke[stroke_id]
for i in range(stroke_points):
var stamp = get_node("seals/seal%d" % stamp_id) as Sprite2D
stamp_id += 1
p_follow.progress_ratio = float(i) / float(stroke_points)
stamp.global_position = p_follow.global_position
stamp.rotation = p_follow.rotation + PI / 2.0
stroke_id += 1
func _final_effect():
# TODO 渐进的铃铛声
SceneManager.pop_debug_dialog_info("音效", "渐进的铃铛声")
func _jump_scare():
# 毛玻璃模糊 / 熔蜡扭曲
# var e_materaial = $"../effect".material
# tween.tween_property(e_materaial, "shader_parameter/intensity", 0.05, 1.0)
# tween.tween_property(e_materaial, "shader_parameter/tint_amount", 0.4, 1.0)
# # 屏幕四周闪红jump scare屏幕抖动效果
# var shading_layer = SceneManager.get_shading_layer()
# shading_layer.flash_palette()
# shading_layer.flash_glitch()
# 闪烁
$AnimationPlayer.play("flash")
# TODO 哈气
SceneManager.pop_debug_dialog_info("音效", "突然哈气")
$"SfxScare".play()
func _stamp_seal(seal: Sprite2D) -> void:
# rand self_modulate
seal.self_modulate = Color(randf_range(.8, 1.), randf_range(.8, 1.), randf_range(.8, 1.), 1.)
# # rand rotation
# seal.rotation = randf_range(-1., 1.)
# # rand position within area
# seal.position = Vector2(
# randf_range(-area_size.x * 0.5, area_size.x * 0.5),
# randf_range(-area_size.y * 0.5, area_size.y * 0.5)
# )
# stamp
$"SfxStamp".play()
# show
seal.visible = true
var origin_scale = seal.scale
create_tween().tween_property(seal, "scale", origin_scale * Vector2(1.05, 1.05), .1)
create_tween().tween_property(seal, "scale", origin_scale * Vector2(1.0, 1.), .1)