Table of Contents
src / player / hair / hair.tscn
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)
Instantiators
Scene Tree
-
Hair Node2D
Signal Connections
|
Note
|
No signal connections. |
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