66 lines
1.8 KiB
GDScript
66 lines
1.8 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()
|
|
|
|
|
|
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 = max(interval - 0.3, 0.4)
|
|
# 最后一个印章消失后,稍加等待,发射完成信号
|
|
tween.tween_interval(2.0)
|
|
tween.tween_callback(finished.emit)
|
|
|
|
|
|
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)
|