Repository navigation
Core Editor
Il core include un piccolo editor visuale per descrivere la geometria di un livello. L'editor non crea direttamente nemici, piattaforme o portali: salva geometrie, categorie e nomi opzionali in JSON, conservando le proprietà aggiuntive. LevelData legge e valida il formato comune; il loader del progetto interpreta i dati e crea le entità.
| Classe | Responsabilità |
|---|---|
EditorScene |
Gestisce modalità, input, griglia, camera e salvataggio |
EditorUI |
Mostra aiuti, coordinate, cursore e campi di testo |
EditableObject |
Rappresenta una forma selezionabile e serializzabile, conservando le proprietà JSON aggiuntive |
LevelData |
Condivide lettura, validazione, conversioni geometriche e salvataggio con i loader |
Quando si apre l'editor, EditorScene e EditorUI vengono aggiunte allo stack sopra la GameScene. La vista dell'editor parte dalla vista corrente del gioco e le sue variazioni vengono sincronizzate con essa.
EditableObject supporta tre tipi di geometria:
- rettangolo allineato agli assi (
rect); - rettangolo ruotato (
rotRect); - spezzata composta da più punti (
multiline).
Ogni forma possiede inoltre:
- una categoria numerica, mostrata con un colore distinto;
- il nome della categoria;
- un nome libero opzionale, utile soltanto quando occorre identificare una regione specifica.
Dal gioco, E apre il JSON effettivamente caricato dalla scena. LevelData::configure() registra questo percorso tramite setJsonPath().
In modalità normale si può selezionare un oggetto con il tasto sinistro, eliminarlo con il destro e spostare la vista con il tasto centrale. Gli strumenti principali sono:
| Comando | Azione |
|---|---|
R |
Disegna un rettangolo |
L |
Disegna una spezzata |
Spazio |
Passa alla categoria successiva durante il disegno |
R su categoria/oggetto |
Rinomina l'elemento corrente |
S |
Attiva o disattiva lo snap alla griglia |
G |
Mostra o nasconde la griglia |
Ctrl+S |
Salva il JSON |
Q in modalità normale |
Salva ed esce dall'editor |
Esc |
Disattiva lo strumento o la selezione; durante la rinomina annulla il testo inserito |
Esc non è un comando globale di uscita: raggiunge la scena dell'editor, che è bloccante e protegge il gioco sottostante dagli stessi input. L'annullamento pulisce anche trascinamento, ridimensionamento e pan in corso.
La rotellina controlla zoom o rotazione in base allo stato. Con Ctrl modifica invece la dimensione delle celle della griglia.
Il file contiene la versione del core, la configurazione scene, l'elenco delle categorie e gli oggetti geometrici:
{
"core_version": "3.7.3",
"categories": ["Static"],
"scene": {
"rect": {"x": 0, "y": 0, "width": 100, "height": 100, "yUp": false},
"pixelUnitSize": {"x": 16, "y": 16},
"dt": 0.01
},
"objects": [
{
"category": 0,
"rect": {
"x": 0,
"y": 12,
"width": 20,
"height": 1,
"yUp": false
}
}
]
}Per un rettangolo ruotato vengono salvati centro, dimensioni e angolo in gradi; LevelData lo converte in radianti a runtime. Per una spezzata viene salvata la sequenza dei punti. La categoria è sufficiente per la maggior parte degli oggetti: name viene omesso quando è vuoto. In ActionRPG rimane, per esempio, sui due portali A che il loader deve collegare.
L'esempio mostra la struttura comune dei documenti. scene è obbligatorio per tutti e tre i prototipi e contiene dimensioni, pixel per unità e timestep; view e backgroundColor sono opzionali. Quando crea un nuovo documento, l'editor ricava questi parametri dalla scena di gioco. Formato completo, categorie dei giochi e campi backgroundImages/overlays sono descritti in LevelData e livelli JSON.
La separazione più importante è questa:
Editor -> JSON -> LevelData -> LevelLoader::loadJson() -> oggetti di gioco
Il core sa che una forma appartiene, per esempio, alla categoria Portal, ma non sa quale classe concreta istanziare. Questa associazione appartiene al caricatore del singolo motore o progetto. Di conseguenza lo stesso editor può servire giochi con regole molto diverse.
L'editor aggiorna geometrie, categorie e nomi, conservando campi come sprite, layer, range, vertical, configurazione della scena e sfondi. Le proprietà specifiche del gioco si modificano direttamente nel JSON: non c'è un pannello dedicato nell'editor.
In Box2DPlatformer, l'immagine complessiva del terreno è in backgroundImages; resta visibile senza diventare un grande rettangolo selezionabile. La polilinea Terrain in objects rappresenta invece i collider modificabili. Anche ActionRPG usa backgroundImages per overworld e casa: i collider e gli spawn dei personaggi restano in objects.
I JSON caricati sono copie accanto all'eseguibile. CMake li ricopia dai sorgenti a ogni build, anche senza modifiche C++. Dopo il salvataggio nell'editor, riporta quindi il file nel progetto prima della build successiva. Ricarica il livello o riavvia il gioco per ricreare le entità con le geometrie modificate.
Prosegui con Shader e post-processing.
- 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