Repository navigation
CustomPlatformer Scena e Risorse
Questa pagina segue il percorso dall'avvio alla prima immagine sullo schermo. Le classi Game, GameScene, UIScene, View e Sprite vengono dal core; le loro sottoclassi e le factory qui descritte appartengono a CustomPlatformer.
PlatformerGame crea una finestra intitolata CustomPlatformer e imposta il rapporto d'aspetto. Il suo init() inserisce in ordine:
LevelLoader::load("overworld") -> PlatformerGameScene
HUD -> UIScene
Menu::mainMenu() -> UIScene bloccante
Game aggiorna le scene dall'alto verso il basso fino alla prima bloccante e le disegna dal basso verso l'alto. Il menu iniziale ferma la scena di gioco e l'HUD, ma li lascia visibili sotto di sé; dopo New Game, la rimozione differita del menu permette al gioco di procedere. Il menu di pausa viene aggiunto con Return o Esc da PlatformerGameScene::event() e offre ripresa, reset e uscita.
LevelLoader::load("overworld") legge levels/overworld.json con LevelData. Il blocco scene fornisce il rettangolo RectF(0, -20, 224, 50), pixelUnitSize = {16, 16} e timestep _dt = 0,01 s per costruire PlatformerGameScene. loadJson() chiama level.configure(world), che applica anche la vista iniziale RectF(0, -12, 16, 15) e il colore di sfondo. Mappa e camera non hanno la stessa dimensione.
Il ciclo su level.objects() associa le categorie Static, HammerBrother, Lift e Mario ai costruttori, registrando Mario con setPlayer(). Le regioni usano rettangoli allineati agli assi; la classe del personaggio conserva dimensioni e collider, mentre il loader adatta la posizione ai suoi offset di spawn. Per gli ascensori legge anche vertical e range. Dopo gli oggetti crea il trigger di esempio in C++: geometria e lambda restano nel loader. Il formato condiviso descrive proprietà e controlli sugli errori.
I controlli continui vengono letti in updateControls(): frecce per la direzione orizzontale, spazio per il salto, Z per correre. La scena traduce questi input in chiamate a Mario::move(), jump() e run(); l'attacco con A è gestito invece come evento. La camera automatica segue Mario soltanto verso destra tramite un valore X non decrescente; in modalità manuale passa al comportamento della GameScene di base. La gestione dei tasti e del viewport è spiegata anche in Input ed eventi.
HUD deriva da UIScene e usa una propria View con coordinate 16 x 15. Crea oggetti grafici per punteggio, monete, world, livello, tempo e FPS. Il tempo scala nel suo update(); quando cambia il numero visualizzato, sostituisce lo sprite relativo. Non è il timer della simulazione: il suo update dipende dalla propagazione delle scene nello stack.
Menu è un'altra UIScene, con blocking = true. Ogni MenuItem è un RenderableObject con un'azione; le frecce cambiano la selezione e Return esegue l'azione. Le schermate sono scene, non un sistema UI separato dal core. PlatformerGame::gameover() aggiunge una nuova UIScene con l'immagine di game over e avvia la musica corrispondente.
SpriteFactory carica le spritesheet una volta usando il renderer del Game e funzioni grafiche di utils. Mantiene le texture per nome e associa ID come "mario_walk", "terrain" o "hud_coin" a nuovi Sprite, AnimatedSprite, FilledSprite e TiledSprite. Alcuni rettangoli delle immagini vengono rilevati automaticamente dalle spritesheet; il testo dell'HUD è composto con tile grafici da getText(), non con TextSprite.
Un oggetto conserva un puntatore allo sprite restituito dalla factory; la texture sottostante è condivisa. Quando HUD o MenuItem rigenerano una scritta, usano setSprite(..., true) per eliminare lo sprite precedente. La gestione della durata delle texture resta una responsabilità distinta dalla vita degli oggetti della scena.
Le entità specifiche scelgono gli sprite nei propri costruttori: Lift, per esempio, richiede platform. Per gli StaticObject generici il loader può leggere sprite dal JSON e passarlo al costruttore.
Il CMake del progetto copia gli asset grafici e audio accanto all'eseguibile, con suoni e font sotto assets/. Il target copy_levels aggiorna levels/ a ogni build, anche senza ricompilare il C++. SpriteFactory, servizi e loader costruiscono i percorsi a partire da SDL_GetBasePath(): l'avvio da un'altra directory non cambia la ricerca.
load(name) cerca levels/<name>.json, quindi un altro livello può essere scelto passando il suo nome. Il tasto E apre il file effettivamente caricato. L'editor salva la copia di esecuzione: riportala nel progetto prima della build successiva e ricarica il livello per applicare le modifiche.
Il progetto copia inoltre gli shader condivisi in assets/shaders/: i tasti 1-9 e 0 attivano o disattivano i dieci effetti GPU descritti in Shader e post-processing.
CustomPlatformer/levels/overworld.jsonPlatformerGame.cppPlatformerGameScene.cppLevelLoader.cpp-
HUD.cppeMenu.cpp SpriteFactory.cppCMakeLists.txt
Prosegui con Movimento e collisioni.
- 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