Skip to content

Core Editor

Alessandro Bria edited this page Sep 29, 2026 · 4 revisions

Editor dei livelli

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à.

Componenti

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.

Forme supportate

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.

Flusso di lavoro

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.

Formato JSON

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.

Dal JSON al gioco

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.

Proprietà conservate e file salvato

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.

Sorgenti

Prosegui con Shader e post-processing.

Clone this wiki locally