59 lines
1.5 KiB
GDScript
59 lines
1.5 KiB
GDScript
class_name EnergyBar
|
|
extends HBoxContainer
|
|
|
|
@export var segment_count := 10
|
|
|
|
var segments: Array[Panel] = []
|
|
|
|
|
|
func _ready() -> void:
|
|
_build_segments()
|
|
_event_bus().connect("player_energy_changed", refresh)
|
|
|
|
|
|
func refresh(current: float, maximum: float) -> void:
|
|
if segments.is_empty():
|
|
_build_segments()
|
|
var filled := clampi(int(round(current)), 0, min(segment_count, int(maximum)))
|
|
for index: int in range(segments.size()):
|
|
segments[index].modulate = Color(1.0, 1.0, 1.0, 1.0 if index < filled else 0.35)
|
|
|
|
|
|
func _build_segments() -> void:
|
|
if not segments.is_empty():
|
|
return
|
|
for child: Node in get_children():
|
|
var panel := child as Panel
|
|
if panel != null:
|
|
segments.append(panel)
|
|
if segments.size() >= segment_count:
|
|
return
|
|
for index: int in range(segments.size(), segment_count):
|
|
var panel := Panel.new()
|
|
panel.custom_minimum_size = Vector2(23, 16)
|
|
panel.modulate = Color(1.0, 1.0, 1.0, 0.35)
|
|
panel.add_theme_stylebox_override("panel", _make_segment_style())
|
|
add_child(panel)
|
|
segments.append(panel)
|
|
|
|
|
|
func _make_segment_style() -> StyleBoxFlat:
|
|
var style := StyleBoxFlat.new()
|
|
style.bg_color = Color(0.18, 0.66, 0.95, 1.0)
|
|
style.border_width_left = 1
|
|
style.border_width_top = 1
|
|
style.border_width_right = 1
|
|
style.border_width_bottom = 1
|
|
style.border_color = Color(0.66, 0.92, 1.0, 0.9)
|
|
return style
|
|
|
|
|
|
func _event_bus() -> Node:
|
|
var root := get_tree().root
|
|
var bus := root.get_node_or_null("EventBus")
|
|
if bus == null:
|
|
bus = load("res://autoload/event_bus.gd").new()
|
|
bus.name = "EventBus"
|
|
root.add_child(bus)
|
|
return bus
|