Release v0.2: refine menus and JuggleBoard

This commit is contained in:
enne2
2026-09-06 22:53:52 +02:00
parent f4a9da6bc3
commit ea5b2aebbf
34 changed files with 832 additions and 437 deletions
+42 -41
View File
@@ -1,26 +1,17 @@
class_name P2AJuggleMenuScreen
extends Control
## P2a: configurazione visuale del percorso JuggleBoard.
## Il numero palline è deliberatamente locale al menu e non modifica il gioco.
## P2a: schermata JuggleBoard composta dal mockup approvato.
## I controlli trasparenti mantengono input mouse e touch senza alterare la grafica.
signal back_requested
signal mode_requested
signal feedback_requested(frequency: float)
const BG := preload("res://menus/assets/p2a/2a_sfondo.png")
const CLOUDS := preload("res://menus/assets/common/1_nuvole.png")
const TENT := preload("res://menus/assets/p2a/2a_tendone.png")
const TITLE := preload("res://menus/assets/p2a/2a_titolo.png")
const LEFT_ARROW := preload("res://menus/assets/common/freccina_sx.png")
const RIGHT_ARROW := preload("res://menus/assets/common/freccina_dx.png")
const BACK_BUTTON := preload("res://menus/assets/common/pulsante_indietro.png")
const SETTINGS_BUTTON := preload("res://menus/assets/common/pulsante_rotellina.png")
const PLAY_BUTTON := preload("res://menus/assets/common/pulsante_gioca.png")
const MOCKUP := preload("res://menus/assets/p2a/p2a_menu_mockup.jpg")
var balls_count := 5
var count_patch: ColorRect
var count_label: Label
var left_button: TextureButton
var right_button: TextureButton
func _ready() -> void:
@@ -29,42 +20,52 @@ func _ready() -> void:
func _build() -> void:
MenuUI.add_full_texture(self, BG)
MenuUI.add_full_texture(self, CLOUDS, MenuUI.ambient_material(1.0, 0.16))
MenuUI.add_image(self, TENT, Vector2(0.28, 0.59), Vector2(0.56, 0.78), MenuUI.ambient_material(0.60, 0.20))
MenuUI.add_image(self, TITLE, Vector2(0.68, 0.22), Vector2(0.34, 0.28))
# Il mockup è la composizione grafica di riferimento: STRETCH_SCALE conserva
# posizione reciproca e proporzioni di tendone, titolo, barra e controlli.
var artwork := TextureRect.new()
artwork.set_anchors_and_offsets_preset(Control.PRESET_FULL_RECT)
artwork.texture = MOCKUP
artwork.expand_mode = TextureRect.EXPAND_IGNORE_SIZE
artwork.stretch_mode = TextureRect.STRETCH_SCALE
artwork.mouse_filter = Control.MOUSE_FILTER_IGNORE
add_child(artwork)
var back := MenuUI.add_image_button(self, BACK_BUTTON, Vector2(0.075, 0.13), Vector2(0.09, 0.14))
back.pressed.connect(func(): back_requested.emit())
MenuUI.add_image(self, SETTINGS_BUTTON, Vector2(0.91, 0.13), Vector2(0.09, 0.14))
_build_selector()
var play := MenuUI.add_image_button(self, PLAY_BUTTON, Vector2(0.79, 0.83), Vector2(0.30, 0.115))
play.pressed.connect(func():
feedback_requested.emit(784.0)
mode_requested.emit()
)
_add_hotspot(Vector2(0.12, 0.14), Vector2(0.10, 0.14), func(): back_requested.emit())
_add_hotspot(Vector2(0.775, 0.64), Vector2(0.07, 0.10), func(): _change_balls(-1))
_add_hotspot(Vector2(0.895, 0.64), Vector2(0.07, 0.10), func(): _change_balls(1))
_add_hotspot(Vector2(0.79, 0.88), Vector2(0.30, 0.14), _start_game)
_build_dynamic_count()
func _build_selector() -> void:
MenuUI.add_label(self, "N° palline", Vector2(0.68, 0.57), Vector2(0.23, 0.06), 22)
left_button = MenuUI.add_image_button(self, LEFT_ARROW, Vector2(0.68, 0.67), Vector2(0.055, 0.075))
left_button.pressed.connect(func(): _change_balls(-1))
right_button = MenuUI.add_image_button(self, RIGHT_ARROW, Vector2(0.87, 0.67), Vector2(0.055, 0.075))
right_button.pressed.connect(func(): _change_balls(1))
count_label = MenuUI.add_label(self, str(balls_count), Vector2(0.775, 0.67), Vector2(0.10, 0.09), 32)
_update_arrow_state()
func _add_hotspot(center: Vector2, normalized_size: Vector2, action: Callable) -> void:
var hotspot := MenuUI.add_hotspot(self, center, normalized_size)
hotspot.tooltip_text = ""
hotspot.pressed.connect(func(): action.call())
func _build_dynamic_count() -> void:
count_patch = ColorRect.new()
count_patch.color = Color(1.0, 1.0, 1.0, 0.96)
count_patch.mouse_filter = Control.MOUSE_FILTER_IGNORE
count_patch.visible = false
add_child(count_patch)
MenuUI.set_normalized_rect(count_patch, Vector2(0.835, 0.64), Vector2(0.055, 0.09))
count_label = MenuUI.add_label(self, str(balls_count), Vector2(0.835, 0.64), Vector2(0.055, 0.09), 32)
count_label.visible = false
func _change_balls(delta: int) -> void:
balls_count = clampi(balls_count + delta, 1, 5)
count_patch.visible = true
count_label.visible = true
count_label.text = str(balls_count)
feedback_requested.emit(440.0 + 45.0 * balls_count)
_update_arrow_state()
func _update_arrow_state() -> void:
left_button.disabled = balls_count <= 1
right_button.disabled = balls_count >= 5
left_button.modulate.a = 0.35 if left_button.disabled else 1.0
right_button.modulate.a = 0.35 if right_button.disabled else 1.0
func _start_game() -> void:
# Senza selettore: il menu P2A apre sempre la partita Target standard.
Settings.game_mode = 0
Settings.save_settings()
feedback_requested.emit(784.0)
mode_requested.emit()