stars.gd 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. class_name Stars
  2. extends Control
  3. ## A row of stars, [member filled] of [member count] lit. Earned stars pop in one by one
  4. ## when [method reveal] is called.
  5. @export var count := 3:
  6. set(value):
  7. count = value
  8. _resize()
  9. @export var filled := 0:
  10. set(value):
  11. filled = value
  12. queue_redraw()
  13. @export var star_size := 36.0:
  14. set(value):
  15. star_size = value
  16. _resize()
  17. @export var spacing := 10.0
  18. ## Per-star scale while popping in.
  19. var _pop: Array[float] = [1.0, 1.0, 1.0]
  20. func _ready() -> void:
  21. _resize()
  22. ## Lights the first [param stars] stars one after another with a small pop.
  23. func reveal(stars: int) -> void:
  24. filled = stars
  25. _pop.resize(count)
  26. _pop.fill(0.0)
  27. var tween := create_tween()
  28. for i in count:
  29. tween.tween_method(_set_pop.bind(i), 0.0, 1.0, 0.25).set_trans(Tween.TRANS_BACK).set_ease(Tween.EASE_OUT)
  30. func _set_pop(value: float, index: int) -> void:
  31. _pop[index] = value
  32. queue_redraw()
  33. func _resize() -> void:
  34. custom_minimum_size = Vector2(count * star_size + (count - 1) * spacing, star_size)
  35. _pop.resize(count)
  36. for i in count:
  37. if _pop[i] == 0.0:
  38. _pop[i] = 1.0
  39. queue_redraw()
  40. func _draw() -> void:
  41. var start := (size.x - custom_minimum_size.x) / 2.0
  42. for i in count:
  43. var center := Vector2(start + star_size / 2.0 + i * (star_size + spacing), size.y / 2.0)
  44. var lit := i < filled
  45. var color := Params.COLOR_ORANGE if lit else Color(1, 1, 1, 0.15)
  46. var points := _star_points(center, star_size / 2.0 * (_pop[i] if lit else 1.0))
  47. draw_colored_polygon(points, color)
  48. points.append(points[0])
  49. draw_polyline(points, color, 1.0, true)
  50. static func _star_points(center: Vector2, radius: float) -> PackedVector2Array:
  51. var points := PackedVector2Array()
  52. for i in 10:
  53. var r := radius if i % 2 == 0 else radius * 0.45
  54. var angle := -PI / 2.0 + i * PI / 5.0
  55. points.append(center + Vector2(cos(angle), sin(angle)) * r)
  56. return points