@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)