| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
- 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
|