src / player / hair / hair.tscn

Diagram

Diagram

Overridden virtual functions

_ready

func _ready() -> void:
	positions.clear()
	for i in range(SEGMENT_COUNT):
		positions.append(global_position)

_process

func _process(delta: float) -> void:
	if positions.is_empty(): return
	positions[0] = global_position

	for i in range(1, SEGMENT_COUNT):
		var target = positions[i-1]
		var diff = positions[i] - target
		if diff.length() > MAX_DISTANCE:
			positions[i] = target + diff.normalized() * MAX_DISTANCE
		positions[i] = positions[i].lerp(target, LERP_SPEED * delta)

	queue_redraw()

_draw

func _draw() -> void:
	for i in range(SEGMENT_COUNT - 1, -1, -1):
		var r = BASE_RADIUS * (1.0 - float(i) / SEGMENT_COUNT * DECREASE_RATE)
		draw_circle(to_local(positions[i]), r + OUTLINE_WIDTH, Color.BLACK)

	for i in range(SEGMENT_COUNT - 1, -1, -1):
		var r = BASE_RADIUS * (1.0 - float(i) / SEGMENT_COUNT * DECREASE_RATE)
		draw_circle(to_local(positions[i]), r, color)

Scene Tree

  • Hair Node2D

Signal Connections

Note
No signal connections.

Properties

Table 1. Root properties
Name Value

script

hair.gd

@tool
extends Node2D

var base_color : Color = Color('e0872f')
var dash_color : Color = Color(0.1, 0.8, 1.0)
@onready var color : Color = base_color
const SEGMENT_COUNT := 5
const MAX_DISTANCE := 15.0
const LERP_SPEED := 20.0
const BASE_RADIUS := 3.8
const OUTLINE_WIDTH := 1.0
const DECREASE_RATE := 0.75

var positions: Array[Vector2] = []


func _ready() -> void:
	positions.clear()
	for i in range(SEGMENT_COUNT):
		positions.append(global_position)


func _process(delta: float) -> void:
	if positions.is_empty(): return
	positions[0] = global_position

	for i in range(1, SEGMENT_COUNT):
		var target = positions[i-1]
		var diff = positions[i] - target
		if diff.length() > MAX_DISTANCE:
			positions[i] = target + diff.normalized() * MAX_DISTANCE
		positions[i] = positions[i].lerp(target, LERP_SPEED * delta)

	queue_redraw()


func _draw() -> void:
	for i in range(SEGMENT_COUNT - 1, -1, -1):
		var r = BASE_RADIUS * (1.0 - float(i) / SEGMENT_COUNT * DECREASE_RATE)
		draw_circle(to_local(positions[i]), r + OUTLINE_WIDTH, Color.BLACK)

	for i in range(SEGMENT_COUNT - 1, -1, -1):
		var r = BASE_RADIUS * (1.0 - float(i) / SEGMENT_COUNT * DECREASE_RATE)
		draw_circle(to_local(positions[i]), r, color)


func set_dashed(val: bool) -> void:
	color = dash_color if val else base_color