Files
autgame/scripts/hearts_display.gd
T

65 lines
2.0 KiB
GDScript

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