41 lines
1.4 KiB
GDScript
41 lines
1.4 KiB
GDScript
extends Node2D
|
|
var _texture: Texture2D
|
|
var _visual_size := 56.0
|
|
var _angle := 0.0
|
|
var _time := 0.0
|
|
var _pieces: Array[Dictionary] = []
|
|
|
|
func configure(texture: Texture2D, visual_size: float, angle: float) -> void:
|
|
_texture = texture
|
|
_visual_size = visual_size
|
|
_angle = angle
|
|
var grid := 3
|
|
var cell := Vector2(texture.get_size())/grid
|
|
for y in grid:
|
|
for x in grid:
|
|
var offset := Vector2(x-1,y-1)*visual_size/3.0
|
|
var direction := offset.normalized() if offset.length()>0 else Vector2.RIGHT.rotated(randf()*TAU)
|
|
_pieces.append({"region":Rect2(Vector2(x,y)*cell,cell),"offset":offset.rotated(angle),"velocity":direction.rotated(angle)*randf_range(75,180),"spin":randf_range(-5,5)})
|
|
|
|
func _ready() -> void:
|
|
z_index = 35
|
|
light_mask = 4
|
|
|
|
func _process(delta: float) -> void:
|
|
_time += delta
|
|
if _time >= 1.1: queue_free()
|
|
queue_redraw()
|
|
|
|
func _draw() -> void:
|
|
if _texture == null: return
|
|
var fade := clampf(1.0-_time/1.1,0,1)
|
|
for ring in 3:
|
|
draw_arc(Vector2.ZERO,_visual_size*0.3+_time*(95+ring*45),0,TAU,48,Color(1,0.45+ring*0.15,0.1,fade*0.4),2,true)
|
|
for piece in _pieces:
|
|
var center: Vector2 = piece.offset+piece.velocity*_time
|
|
draw_set_transform(center,_angle+piece.spin*_time)
|
|
var extent := Vector2.ONE*_visual_size/3.0
|
|
draw_texture_rect_region(_texture,Rect2(-extent*0.5,extent),piece.region,Color(1.0,0.8,0.6,fade))
|
|
draw_line(Vector2.ZERO,Vector2(-8,0),Color(1,0.6,0.12,fade),2,true)
|
|
draw_set_transform(Vector2.ZERO)
|