Repository navigation
ActionRPG Scena e Risorse
Questa pagina segue la costruzione di overworld: chi crea la scena, dove si trovano le geometrie, come arrivano gli asset all'eseguibile e quali input sono gestiti dal progetto. La simulazione dei collider è nella pagina Movimento e collisioni.
main() crea e registra RPGGame, poi chiama init() e run(). Il costruttore di RPGGame inizializza SpriteFactory, Audio e, se abilitato, Fonts; il distruttore elimina prima le scene e poi i servizi. LevelLoader è una classe di utilità con metodi statici, non un singleton. RPGGame sceglie Rendering::SDL_GPU_SHADERS: la finestra può applicare gli shader GPU e conserva l'effetto CPU usato dai portali. init() aggiunge nell'ordine:
LevelLoader::load("overworld") -> HUD -> Menu iniziale
Il menu è una UIScene bloccante: il gameplay sotto resta visibile ma non riceve update e input finché New Game non rimuove il menu. L'HUD è una seconda scena UI, separata da RPGGameScene. Questo ordine nello stack spiega sia la pausa sia l'inventario.
LevelLoader::load("overworld") legge levels/overworld.json tramite LevelData. Il loader C++ passa al costruttore di RPGGameScene rettangolo 256 x 256, pixelUnitSize = {16, 16}, timestep 1/100 s e colore di sfondo. Il costruttore della scena imposta la vista iniziale di 16 x 14 unità, coerente con il rapporto 256/224. Questi parametri non sono nel JSON.
Il JSON contiene collider, portali e regioni NPC, Soldier e Link in objects. Le immagini overworld e linkhouse sono create esplicitamente nel loader C++ e registrate con addBackgroundImage() per mantenerle visibili anche nell'editor. I collider generici sono trasparenti, sovrapposti a questa grafica. Dialoghi, intelligenza artificiale, collisioni e transizioni rimangono nelle classi di gioco.
LevelLoader::load(name) cerca SDL_GetBasePath() + "levels/" + name + ".json", costruisce un LevelData, crea la scena con i parametri definiti nel C++ e registra il percorso con setJsonPath(path). Poi chiama loadJson(world, level) per convertire categorie e geometrie in entità. Lettura, validazione del formato e conversioni geometriche appartengono al core.
Un file mancante o malformato interrompe il caricamento; il main gestisce gli errori del progetto e quelli delle librerie. Il JSON non richiede un blocco scene. Occorre esattamente una regione di categoria Link.
| Dato JSON | Oggetto creato |
|---|---|
rect o rotRect in categoria Static o Bush
|
StaticObject con collider rettangolare, eventualmente ruotato. |
multiline |
Un StaticObject sottile per ciascun segmento valido. |
rect o rotRect in categoria Portal
|
Portal senza destinazione immediata. |
rect o rotRect in categoria Clipper
|
Clipper del core per limitare il rendering. |
rect o rotRect in categoria NPC
|
NPC nella posizione del rettangolo; sprite e dialogo definiti dalla classe. |
rect o rotRect in categoria Soldier
|
Soldier nella posizione del rettangolo, con area patrolRect letta dal JSON. |
rect o rotRect in categoria Link
|
Player nella posizione del rettangolo, registrato con setPlayer(). |
Il loader crea prima Link e poi le altre regioni: i portali trovano quindi il giocatore anche quando Link compare alla fine dell'array objects. Le classi dei personaggi scelgono sprite, dimensioni e collider nei propri costruttori; il rettangolo JSON ne determina lo spawn.
name è opzionale per le normali regioni: bastano categoria e geometria. Per Portal deve invece essere una stringa non vuota, perché identifica la coppia; il documento incluso conserva soltanto i due nomi A. Al termine il loader raggruppa i portali per nome e collega i gruppi di due; per un numero diverso stampa un avviso. LevelData converte gli angoli JSON da gradi a radianti.
L'editor conserva le proprietà aggiuntive mentre modifica le geometrie; è il loader a stabilire il significato delle categorie. Vedi LevelData e livelli JSON e Editor dei livelli.
La casa è disegnata fuori dal rettangolo nominale 0..256. RPGGameScene imposta _autoKillWhenOutsideScene = false; inoltre la radice del quadtree, creata dal core, è più ampia del rettangolo della scena. Perciò gli oggetti della casa possono restare indicizzati e visibili dopo il teletrasporto. Questo non amplia automaticamente la griglia di Pathfinding, che usa il rettangolo nominale della scena.
updateControls() legge lo stato continuo delle frecce e passa direzioni X/Y a Link::move(). event() gestisce A per l'attacco, I per l'interazione, Invio per l'inventario ed Esc per il menu di pausa. L applica temporaneamente un effetto luce CPU tramite GPUShaderWindow; è un comando dimostrativo. RPGGame::dispatchEvent() gestisce i tasti 1-9 e 0 per attivare o disattivare i dieci shader GPU condivisi. GameScene::event() resta responsabile dei controlli comuni del core, inclusi quelli di debug.
Il mouse e i tasti arrivano come eventi SDL3, ma le coordinate degli oggetti restano in unità della scena. La View gestisce la conversione verso pixel e viewport; i dettagli sono in Rendering e coordinate.
SpriteFactory legge le texture da SDL_GetBasePath() + "sprites/..." e costruisce sprite statici, animazioni e caratteri ricavati dallo spritesheet fonts.png. CMakeLists.txt copia dopo la build sprites/, assets/sounds/, assets/musics/, assets/fonts/, shaders/, gli shader GPU condivisi in assets/shaders/ nella cartella dell'eseguibile. Il target copy_levels copia invece levels/ accanto all'eseguibile a ogni build, anche se il C++ non cambia. L'avvio da un'altra working directory non dovrebbe cambiare i percorsi: il riferimento è SDL_GetBasePath().
E apre il JSON registrato nella scena. L'editor salva la copia di esecuzione: riportala in ActionRPG/levels/overworld.json prima della build successiva, poi ricarica il livello per ricostruire scena e oggetti.
V attiva/disattiva musica ed effetti anche nei menu e in pausa; M resta il comando per la camera manuale. Vedi Input ed eventi.
-
main.cppeRPGGame.cpp -
RPGGameScene.cppeLevelLoader.cpp -
SpriteFactory.cppelevels/overworld.json CMakeLists.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