Repository navigation
Core 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 unaGameScene.
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 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 è 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 è 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.
| 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.
Prosegui con Quadtree.
- Panoramica
- Diagramma delle classi
- Architettura e game loop
- Sequenza di un frame
- Input ed eventi
- Scene e oggetti
- Rendering e coordinate
- Sprite e testo
- UI e overlay
- Quadtree
- Servizi e asset
- Estendere il core
- Editor dei livelli
- LevelData e livelli JSON
- Shader