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

103 lines
3.1 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 var area_size := Vector2(60, 60):
set(val):
area_size = val
queue_redraw()
@export var gizmo_outline_color := Color(0.8, 0.3, 0.1, 0.8):
set(val):
gizmo_outline_color = val
queue_redraw()
@export_tool_button("Reset Stamps", "Callable") var reset_action := _debug_reset_stamps
func play() -> void:
visible = true
var tween = create_tween()
tween.tween_interval(3.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(7.0)
# 小蝶名字消失后再显示其他名字
var interval = 2.4
for c in $seals.get_children():
c.visible = false
tween.tween_interval(interval)
tween.tween_callback(_stamp_seal.bind(c))
interval = lerpf(interval, 0.25, 0.15)
# 最后一个印章消失后,稍加等待,发射完成信号
tween.tween_callback(_final_effect)
tween.tween_interval(2.0)
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():
# 屏幕四周闪红jump scare屏幕抖动效果
var shading_layer = SceneManager.get_shading_layer()
shading_layer.flash_vignette(Color(1.0, 0.0, 0.0))
# TODO 哈气
SceneManager.pop_debug_dialog_info("音效", "突然哈气")
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)
func _draw() -> void:
if Engine.is_editor_hint():
# draw gizmo
var area_rect = Rect2(-area_size * 0.5, area_size)
# fill
var fill_color = gizmo_outline_color
fill_color.a = 0.4
draw_rect(area_rect, fill_color)
# outline
draw_rect(area_rect, gizmo_outline_color, false, 1.0)