Files
agame/scripts/ui/main_menu_ui.gd
T
2026-09-12 22:18:23 +08:00

72 lines
1.9 KiB
GDScript

class_name MainMenuUI
extends Control
signal host_pressed(nickname: String, skin: String)
signal join_pressed(nickname: String, skin: String, address: String)
signal quit_pressed
const SKIN_OPTIONS: Array[String] = ["Blue", "Yellow", "Green", "Red"]
const SAFE_AREA_MARGIN := 24.0
@onready var skin_input: OptionButton = $MainContainer/MainMenu/Option2/SkinInput
@onready var nick_input: LineEdit = $MainContainer/MainMenu/Option1/NickInput
@onready var address_input: LineEdit = $MainContainer/MainMenu/Option3/AddressInput
@onready var main_container: VBoxContainer = $MainContainer
func _ready() -> void:
skin_input.clear()
for skin_name in SKIN_OPTIONS:
skin_input.add_item(skin_name)
skin_input.select(0)
resized.connect(_update_responsive_layout)
call_deferred("_update_responsive_layout")
func _on_host_pressed() -> void:
var nickname = nick_input.text.strip_edges()
var skin = get_skin()
host_pressed.emit(nickname, skin)
func _on_join_pressed() -> void:
var nickname = nick_input.text.strip_edges()
var skin = get_skin()
var address = address_input.text.strip_edges()
join_pressed.emit(nickname, skin, address)
func _on_quit_pressed():
quit_pressed.emit()
func show_menu():
show()
call_deferred("_update_responsive_layout")
func hide_menu():
hide()
func is_menu_visible() -> bool:
return visible
func _update_responsive_layout() -> void:
if not main_container:
return
var available_size := Vector2(
maxf(1.0, size.x - SAFE_AREA_MARGIN * 2.0), maxf(1.0, size.y - SAFE_AREA_MARGIN * 2.0)
)
var content_size := main_container.get_combined_minimum_size()
if content_size.x <= 0.0 or content_size.y <= 0.0:
return
var scale_factor := minf(1.0, minf(available_size.x / content_size.x, available_size.y / content_size.y))
main_container.pivot_offset = main_container.size * 0.5
main_container.scale = Vector2.ONE * scale_factor
func get_skin() -> String:
return skin_input.get_item_text(skin_input.selected).to_lower()