class_name Stars extends Control ## A row of stars, [member filled] of [member count] lit. Earned stars pop in one by one ## when [method reveal] is called. @export var count := 3: set(value): count = value _resize() @export var filled := 0: set(value): filled = value queue_redraw() @export var star_size := 36.0: set(value): star_size = value _resize() @export var spacing := 10.0 ## Per-star scale while popping in. var _pop: Array[float] = [1.0, 1.0, 1.0] func _ready() -> void: _resize() ## Lights the first [param stars] stars one after another with a small pop. func reveal(stars: int) -> void: filled = stars _pop.resize(count) _pop.fill(0.0) var tween := create_tween() for i in count: tween.tween_method(_set_pop.bind(i), 0.0, 1.0, 0.25).set_trans(Tween.TRANS_BACK).set_ease(Tween.EASE_OUT) func _set_pop(value: float, index: int) -> void: _pop[index] = value queue_redraw() func _resize() -> void: custom_minimum_size = Vector2(count * star_size + (count - 1) * spacing, star_size) _pop.resize(count) for i in count: if _pop[i] == 0.0: _pop[i] = 1.0 queue_redraw() func _draw() -> void: var start := (size.x - custom_minimum_size.x) / 2.0 for i in count: var center := Vector2(start + star_size / 2.0 + i * (star_size + spacing), size.y / 2.0) var lit := i < filled var color := Params.COLOR_ORANGE if lit else Color(1, 1, 1, 0.15) var points := _star_points(center, star_size / 2.0 * (_pop[i] if lit else 1.0)) draw_colored_polygon(points, color) points.append(points[0]) draw_polyline(points, color, 1.0, true) static func _star_points(center: Vector2, radius: float) -> PackedVector2Array: var points := PackedVector2Array() for i in 10: var r := radius if i % 2 == 0 else radius * 0.45 var angle := -PI / 2.0 + i * PI / 5.0 points.append(center + Vector2(cos(angle), sin(angle)) * r) return points