extends Node2D ## Mostra i cuori della modalità Survival: 4 cuori, pieni o vuoti. const MAX_LIVES := 4 const HEART_GAP := 44.0 const FILLED_COLOR := Color("#e0566e") const EMPTY_COLOR := Color("#aaa49a") const OUTLINE_COLOR := Color("#633725") var lives := MAX_LIVES func _ready() -> void: queue_redraw() func set_lives(v: int) -> void: lives = clampi(v, 0, MAX_LIVES) queue_redraw() func _draw() -> void: for i in MAX_LIVES: var filled := i < lives _draw_heart(Vector2(i * HEART_GAP, 0.0), FILLED_COLOR if filled else EMPTY_COLOR, filled) func _draw_heart(origin: Vector2, color: Color, filled: bool) -> void: var points := _heart_points(origin) var shadow := PackedVector2Array() for point in points: shadow.append(point + Vector2(0.0, 3.0)) draw_colored_polygon(shadow, Color(0.18, 0.10, 0.07, 0.24)) draw_colored_polygon(points, color) var outline := points.duplicate() outline.append(points[0]) draw_polyline(outline, OUTLINE_COLOR, 2.5, true) # Piccolo riflesso da pallina smaltata, coerente con gli altri elementi HUD. var shine_alpha := 0.72 if filled else 0.38 draw_circle(origin + Vector2(10.5, 9.0), 3.4, Color(1.0, 0.94, 0.91, shine_alpha)) func _heart_points(origin: Vector2) -> PackedVector2Array: # Quattro curve cubiche formano un cuore pieno di 36x35 px. var points := PackedVector2Array() var segments := [ [Vector2(18, 34), Vector2(15, 30), Vector2(2, 22), Vector2(2, 11)], [Vector2(2, 11), Vector2(2, 3), Vector2(12, 0), Vector2(18, 7)], [Vector2(18, 7), Vector2(24, 0), Vector2(34, 3), Vector2(34, 11)], [Vector2(34, 11), Vector2(34, 22), Vector2(21, 30), Vector2(18, 34)], ] for segment in segments: for step in range(8): var t := float(step) / 8.0 points.append(origin + _cubic(segment[0], segment[1], segment[2], segment[3], t)) points.append(origin + Vector2(18, 34)) return points func _cubic(a: Vector2, b: Vector2, c: Vector2, d: Vector2, t: float) -> Vector2: var u := 1.0 - t return u * u * u * a + 3.0 * u * u * t * b + 3.0 * u * t * t * c + t * t * t * d