46 lines
1.1 KiB
GDScript
46 lines
1.1 KiB
GDScript
@tool
|
|
@icon("ball_snake.svg")
|
|
class_name BallSnake
|
|
extends Node2D
|
|
|
|
|
|
@export var texture: Texture2D
|
|
@export var target: Node2D
|
|
@export var segments: int = 1
|
|
@export var head_segment: bool = true
|
|
@export var tail_segment: bool = true
|
|
@export var auto_density: bool = false:
|
|
set(value):
|
|
auto_density = value
|
|
if auto_density:
|
|
pixels_per_segment = pixels_per_segment
|
|
@export_range(1,2,1,"or_greater") var pixels_per_segment: float = 1.0:
|
|
set(value):
|
|
pixels_per_segment = value
|
|
if auto_density and target:
|
|
segments = int(global_position.distance_to(target.global_position) / pixels_per_segment) - 1
|
|
|
|
|
|
func _process(delta: float) -> void:
|
|
if auto_density:
|
|
pixels_per_segment = pixels_per_segment
|
|
queue_redraw()
|
|
|
|
|
|
func _draw() -> void:
|
|
if not target:
|
|
return
|
|
|
|
if tail_segment:
|
|
draw_texture(texture, -texture.get_size() * 0.5)
|
|
|
|
var end_pos = to_local(target.global_position)
|
|
for i in segments:
|
|
var weight = 1.0 / float(segments + 1) * float(i + 1)
|
|
draw_texture(
|
|
texture,
|
|
lerp(Vector2.ZERO, end_pos, weight) - texture.get_size() * 0.5
|
|
)
|
|
|
|
if head_segment:
|
|
draw_texture(texture, end_pos - texture.get_size() * 0.5)
|