133 lines
4.1 KiB
GDScript
133 lines
4.1 KiB
GDScript
@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.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.2, 0.35)
|
||
# 最后一个印章消失后,稍加等待,发射完成信号
|
||
tween.tween_callback(_final_effect)
|
||
tween.tween_interval(4.5)
|
||
tween.tween_callback(_jump_scare)
|
||
tween.tween_interval(1.5)
|
||
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 tween = create_tween()
|
||
# 毛玻璃模糊 / 熔蜡扭曲
|
||
# 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()
|
||
|
||
var l1 = $DirectionalLight2D
|
||
var l2 = $DirectionalLight2D2
|
||
var polygon = $"../../Polygon2D"
|
||
tween.tween_property(l1, "energy", 1.0, 0.2)
|
||
tween.parallel().tween_property(l2, "energy", 2.0, 0.2)
|
||
tween.parallel().tween_property(polygon, "color:a", 0.5, 0.1)
|
||
tween.tween_property(l1, "energy", 0.0, 0.2)
|
||
tween.parallel().tween_property(l2, "energy", 0.0, 0.2)
|
||
tween.parallel().tween_property(polygon, "color:a", 0.0, 0.2)
|
||
|
||
|
||
# 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)
|
||
|
||
|
||
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)
|