From 909afe17a195807a6292cccafd9fcf6201489abc Mon Sep 17 00:00:00 2001 From: Haze Weathers Date: Sat, 1 Mar 2025 21:15:10 -0500 Subject: [PATCH] port revo's ballsnake, when the sanke he balll he balls --- scripts/ball_snake.gd | 45 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 scripts/ball_snake.gd diff --git a/scripts/ball_snake.gd b/scripts/ball_snake.gd new file mode 100644 index 0000000..d793ada --- /dev/null +++ b/scripts/ball_snake.gd @@ -0,0 +1,45 @@ +@tool +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)