49 lines
1.6 KiB
GDScript
49 lines
1.6 KiB
GDScript
class_name AbilityButtonLayout
|
|
extends Node
|
|
|
|
# Keeps the aimed fleet abilities close to the firing thumb. One ability sits
|
|
# directly above the fire stick; multiple abilities fan through its upper-left
|
|
# quadrant instead of becoming a detached horizontal toolbar.
|
|
|
|
@export var arc_radius: float = 280.0
|
|
|
|
@onready var fire_stick: Control = get_node("../UI/FireStick")
|
|
@onready var buttons: Array = [
|
|
get_node("../UI/DashButton"),
|
|
get_node("../UI/GasBombButton"),
|
|
get_node("../UI/LaserButton"),
|
|
]
|
|
|
|
var visibility_signature: int = -1
|
|
|
|
|
|
func _ready() -> void:
|
|
get_viewport().size_changed.connect(_layout_visible_buttons)
|
|
_layout_visible_buttons.call_deferred()
|
|
|
|
|
|
func _process(_delta: float) -> void:
|
|
var signature: int = 0
|
|
for i in range(buttons.size()):
|
|
if buttons[i].visible:
|
|
signature |= 1 << i
|
|
if signature == visibility_signature:
|
|
return
|
|
visibility_signature = signature
|
|
_layout_visible_buttons()
|
|
|
|
|
|
func _layout_visible_buttons() -> void:
|
|
var visible_buttons: Array = buttons.filter(func(button): return button.visible)
|
|
if visible_buttons.is_empty():
|
|
return
|
|
var center: Vector2 = fire_stick.global_position + fire_stick.size * 0.5
|
|
for i in range(visible_buttons.size()):
|
|
# Screen coordinates grow downward: PI points left and 3*PI/2 points
|
|
# upward, tracing exactly the useful quarter around a bottom-right stick.
|
|
var weight: float = 1.0 if visible_buttons.size() == 1 \
|
|
else float(i) / float(visible_buttons.size() - 1)
|
|
var angle: float = lerpf(PI, PI * 1.5, weight)
|
|
var button: Control = visible_buttons[i]
|
|
button.global_position = center + Vector2.from_angle(angle) * arc_radius \
|
|
- button.size * 0.5
|