65 lines
2.0 KiB
GDScript
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
|