diff --git a/scripts/ball_snake/ball_snake.gd b/scripts/ball_snake/ball_snake.gd new file mode 100644 index 0000000..46c17fd --- /dev/null +++ b/scripts/ball_snake/ball_snake.gd @@ -0,0 +1,46 @@ +@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) diff --git a/scripts/ball_snake/ball_snake.svg b/scripts/ball_snake/ball_snake.svg new file mode 100644 index 0000000..ef860ed --- /dev/null +++ b/scripts/ball_snake/ball_snake.svg @@ -0,0 +1,60 @@ + + + + + + + + + + + + diff --git a/scripts/ball_snake/ball_snake.svg.import b/scripts/ball_snake/ball_snake.svg.import new file mode 100644 index 0000000..6110a95 --- /dev/null +++ b/scripts/ball_snake/ball_snake.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cy5okmvoymixp" +path="res://.godot/imported/ball_snake.svg-6567e5e61b47a0f257c46421c9a9fdb0.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://scripts/ball_snake/ball_snake.svg" +dest_files=["res://.godot/imported/ball_snake.svg-6567e5e61b47a0f257c46421c9a9fdb0.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false