Skip to content

CustomPlatformer

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

CustomPlatformer

CustomPlatformer è un platform 2D dimostrativo ispirato a una piccola porzione di Super Mario Bros. Riusa il core per finestra, scene, eventi, camera, sprite e audio, ma implementa direttamente il moto e le collisioni, senza Box2D. È il primo esempio da studiare per capire dove termina il framework comune e dove iniziano le regole di un gioco.

Schermata di CustomPlatformer

Mappa del progetto

flowchart TD
    Game[Game del core] --> PG[PlatformerGame]
    GameScene[GameScene del core] --> PGS[PlatformerGameScene]
    Renderable[RenderableObject del core] --> Movable[MovableObject]
    Movable --> Collidable[CollidableObject]
    Collidable --> Dynamic[DynamicObject]
    Collidable --> Static[StaticObject]
    Collidable --> Kinematic[KinematicObject]
    Dynamic --> Mario
    Dynamic --> Enemy
    Kinematic --> Lift
Loading
Area Classi Domanda a cui rispondono
Avvio main, PlatformerGame Quali scene e servizi vengono creati?
Scena di gioco LevelLoader, PlatformerGameScene Quali oggetti compongono il livello e come si muove la camera?
Fisica MovableObject, CollidableObject Come si aggiornano velocità, posizione e contatti?
Tipi di corpo StaticObject, DynamicObject, KinematicObject Chi si muove, chi risolve le collisioni e chi trasporta altri oggetti?
Gameplay Mario, Enemy, HammerBrother, Lift, Trigger, Sword Quale effetto hanno input e contatti sul gioco?
Presentazione SpriteFactory, HUD, Menu Da dove arrivano immagini, numeri e schermate?

Il progetto non è una libreria fisica generale: i parametri e le risposte alle collisioni sono pensati per questo esempio. CollidableObject fornisce il meccanismo riusabile dentro il progetto, mentre Mario, nemici e piattaforme definiscono comportamenti specifici.

Il diagramma completo delle classi affianca questa mappa semplificata.

Dal main() al gioco

  1. main() registra PlatformerGame come istanza di Game, inizializza SpriteFactory, LevelLoader, Audio e, se abilitato, Fonts.
  2. PlatformerGame::init() carica "overworld", crea l'HUD e aggiunge il menu iniziale. L'ordine nello stack è scena di gioco -> HUD -> menu.
  3. Il menu è bloccante: finché rimane in cima, la scena di gioco viene disegnata ma non riceve update e input. New Game ne richiede la rimozione con popSceneLater().
  4. Game::run() passa gli eventi alle scene, aggiorna la simulazione con un semi-fixed timestep tramite GameScene e disegna con Window e View.

LevelLoader::load("overworld") legge levels/overworld.json attraverso LevelData e crea la scena con i parametri del documento. loadJson() converte le categorie Static, HammerBrother, Lift e Mario nelle rispettive entità. Terreno, scatole, tubi, nemici, ascensori e posizione del player sono quindi descritti nel JSON; il piccolo esempio di trigger rimane nel loader come lambda passata a un Trigger generico. Vedi LevelData e livelli JSON.

Percorso consigliato

  1. Scena e risorse: costruzione del livello, stack, input, camera, sprite e asset.
  2. Movimento e collisioni: integrazione, collider locali, CCD, AABB e notifiche.
  3. Entità e gameplay: Mario, nemici, piattaforme, trigger, attacco e game over.

Per ritrovare le classi comuni, torna a scene e oggetti del core e rendering. Per aggiungere rampe e scivolamento alla fisica personalizzata, prosegui con CustomPlatformerSlopes. Il confronto con Box2DPlatformer rende evidente quali responsabilità passano a un motore fisico esterno.

Sorgenti iniziali

Clone this wiki locally