Skip to content

Box2DPlatformer

Alessandro Bria edited this page Oct 31, 2026 · 6 revisions

Box2DPlatformer

Questo esempio conserva la struttura del core, ma affida la simulazione fisica a Box2D 3.x invece di risolvere le collisioni con il codice di CustomPlatformer. È utile per confrontare due modi di costruire un platform sopra le stesse astrazioni di scena, vista, sprite e UI.

Schermata di Box2DPlatformer

Il diagramma completo delle classi è raccolto in una pagina dedicata.

Mappa del progetto

flowchart TD
    Game[Game del core] --> CPG[PlatformerGame]
    GameScene[GameScene del core] --> CPGS[PlatformerGameScene]
    Renderable[RenderableObject del core] --> Rigid[RigidObject]
    Rigid --> Dynamic[DynamicObject]
    Rigid --> Static[StaticObject]
    Rigid --> Kinematic[KinematicObject]
    Rigid --> Trigger
    Dynamic --> Player
    Dynamic --> Box
    Dynamic --> Enemy
    Enemy --> Slime
    Dynamic --> Fire
    Static --> Terrain
    Kinematic --> Gear
Loading
Modulo Ruolo
PlatformerGame, LevelLoader Inizializzano lo stack e costruiscono il livello.
PlatformerGameScene Crea il Box2D world, esegue b2World_Step() con timestep fisso, legge i contatti e gestisce input e camera.
RigidObject, DynamicObject, StaticObject, KinematicObject Collegano oggetti visibili, body e shape Box2D alle regole di gioco.
Player, Terrain, Gear, Box, Slime, Fire, Trigger Definiscono movimento, superfici, ostacoli e interazioni.
SpriteFactory, HUD, Menu Gestiscono texture, animazioni e interfaccia.

PlatformerGameScene::updateWorld() sostituisce l'aggiornamento fisico generico di GameScene: per ogni passo _dt applica i controlli fisici, avanza il Box2D world, legge gli eventi di inizio/fine contatto e aggiorna gli oggetti con _dt. La classe conserva comunque input, camera e rendering del core. Nella View l'asse Y della scena è orientato verso l'alto (yUp), coerentemente con la gravità negativa e il salto positivo. Il progetto usa gli ID di world, body e shape dell'API Box2D 3, non le vecchie classi C++ di Box2D 2.

Dal main() al livello

  1. main() crea e registra PlatformerGame. Il costruttore del gioco inizializza SpriteFactory, Audio e i font opzionali; LevelLoader offre metodi statici e non richiede inizializzazione.
  2. PlatformerGame::init() aggiunge nell'ordine level0, HUD e menu iniziale. Il menu è bloccante; New Game lo chiude.
  3. LevelLoader::load("level0") legge levels/level0.json con LevelData e crea la scena con parametri definiti nel C++; loadJson() istanzia i collider del terreno, gli ingranaggi e il giocatore dalle regioni JSON. Immagini del mondo e overlay sono configurati nel loader C++.
  4. Durante il gioco, Game gestisce il ciclo delle scene; PlatformerGameScene avanza Box2D e distribuisce i suoi eventi; RigidObject sincronizza la trasformazione del body con il rendering.

La distinzione essenziale è questa: Box2D decide moto e contatti fisici, mentre gli oggetti del progetto decidono cosa quei contatti significano per il gameplay. RigidObject::collision() è il punto di raccordo, non un secondo solver.

Le classi di avvio e scena si chiamano PlatformerGame e PlatformerGameScene; Box2DPlatformer rimane il nome del progetto. Il formato dei livelli e il ruolo dei loader sono descritti in LevelData e livelli JSON.

Percorso consigliato

  1. Scena e risorse: avvio, livello, stack, camera, input e asset.
  2. World, body e contatti: timestep, ID Box2D 3, shape, filtri, notifiche e sensori.
  3. Entità e gameplay: giocatore, pendenze, ingranaggi, proiettili e nemici.

Parti da architettura del core e scene e oggetti se non conosci ancora il framework. Il confronto con CustomPlatformer mostra quali responsabilità vengono delegate al motore fisico.

Sorgenti iniziali

Clone this wiki locally