Skip to content

Core UI e Overlay

Alessandro Bria edited this page Sep 21, 2026 · 3 revisions

UI e overlay

Il core offre due modi diversi per disegnare elementi sopra o sotto una scena di gioco:

  • una UIScene, inserita nello stack globale delle scene;
  • una OverlayScene, collegata direttamente a una GameScene.

La differenza non è soltanto grafica: cambia chi possiede la scena, come viene aggiornata e quale sistema di coordinate usa.

Domanda UIScene OverlayScene
Dove si registra? Nello stack di Game con pushScene() Nelle liste di sfondo/primo piano di GameScene
Può bloccare il gioco? Sì, tramite blocking nello stack No: non partecipa direttamente allo stack
Quale camera segue? La propria View La View della GameScene, modulata da parallaxVel
Quando si aggiorna? Una volta per frame, se raggiunta dalla propagazione Durante GameScene::updateOverlayScenes()

UIScene

UIScene deriva da Scene ed è pensata per menu, schermate di pausa, HUD e interfacce. Usa un passo temporale variabile: a ogni frame riceve direttamente il tempo trascorso.

La sua View nasce dal rettangolo passato al costruttore. Non viene automaticamente agganciata alla camera della GameScene: un HUD deve usare coordinate scelte per l'interfaccia, non quelle del personaggio. Poiché UIScene usa Object e RenderableObject come una scena di gioco, pulsanti e scritte possono essere oggetti aggiornabili e interrogabili.

Essendo una scena nello stack di Game, può decidere se bloccare quelle sottostanti:

  • con blocking() == true, input e aggiornamento non raggiungono le scene sotto di essa;
  • con blocking() == false, può funzionare come interfaccia trasparente sopra il gioco.

Il rendering parte comunque dalle scene più basse e arriva a quelle più alte. Una UI non bloccante può quindi essere disegnata sopra la scena di gioco senza fermarla.

Per un menu di pausa, inserisci una UIScene bloccante sopra la scena di gioco. Gli eventi e l'update si fermeranno lì, ma Window::render() disegnerà prima il gioco e poi il menu. Per un HUD che deve lasciare giocare, usa una scena non bloccante. Ricorda che l'input di un HUD non bloccante può raggiungere anche la scena sottostante.

auto hud = new UIScene(gameScene->rect(), gameScene->pixelUnitSize());
hud->setBlocking(false);
Game::instance()->pushScene(hud);

OverlayScene

OverlayScene è collegata a una GameScene e usa lo stesso spazio di gioco. È adatta a sfondi, primi piani e layer di parallax che devono seguire la camera.

Il vettore parallaxVel stabilisce quanto l'overlay si muove rispetto alla camera:

  • (0, 0): l'immagine resta ferma;
  • (1, 1): segue completamente la camera;
  • valori intermedi: producono l'effetto di profondità.

Con seamless == true, il piano viene dimensionato per poter essere ripetuto durante lo scorrimento. In questo caso lo sprite usato come sfondo deve supportare il riempimento ripetuto, normalmente tramite FilledSprite.

Il costruttore crea una propria View e un RenderableObject per lo sfondo. Durante update(), aggiorna l'eventuale animazione dello sfondo e sposta la vista in proporzione alla camera della GameScene. Un overlay non riceve direttamente gli eventi generali: GameScene::event() gli inoltra quelli di finestra, necessari per aggiornare il viewport.

Una GameScene può separare overlay di sfondo e di primo piano. In questo modo l'ordine concettuale è:

overlay di sfondo -> oggetti di gioco -> overlay di primo piano -> UI

Clipper

Clipper è un RenderableObject speciale che imposta un rettangolo di clipping nel renderer. Agisce sugli oggetti disegnati nei layer successivi, quindi il suo layer determina da quale punto della sequenza di rendering inizia il ritaglio.

Con la modalità invertita il core ridisegna dentro il rettangolo il colore e le immagini di sfondo della scena. Questo permette, per esempio, di nascondere una parte del livello o costruire una finestra visiva.

Poiché modifica uno stato globale del renderer, va posizionato consapevolmente nella sequenza dei layer.

View::render() imposta il clipping iniziale del viewport prima di disegnare gli oggetti. Quando il Clipper compare nell'ordinamento per layer, sostituisce il rettangolo di clipping SDL; gli oggetti successivi nella stessa vista vengono ritagliati. Non è un collider e non modifica il contenuto degli oggetti: agisce soltanto sul disegno.

Quale scegliere

Necessità Componente
Menu o pausa che intercetta l'input UIScene bloccante
HUD sopra il gioco UIScene non bloccante
Sfondo o primo piano con parallax OverlayScene
Limitare il disegno a una regione Clipper

active, visible e blocking non sono sinonimi. La Scene base usa visible per decidere se disegnare, mentre l'update delle sottoclassi usa active; blocking riguarda la propagazione nello stack. Nota pratica: l'override di GameScene::render() controlla _active e non il flag _visible della classe base. Se vuoi nascondere soltanto la scena di gioco mantenendone l'update, verifica questo comportamento nella tua sottoclasse.

Sorgenti

Prosegui con Quadtree.

Clone this wiki locally