Repository navigation
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.

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
| 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.
-
main()registraPlatformerGamecome istanza diGame, inizializzaSpriteFactory,LevelLoader,Audioe, se abilitato,Fonts. -
PlatformerGame::init()carica"overworld", crea l'HUD e aggiunge il menu iniziale. L'ordine nello stack è scena di gioco -> HUD -> menu. - Il menu è bloccante: finché rimane in cima, la scena di gioco viene disegnata ma non riceve update e input.
New Gamene richiede la rimozione conpopSceneLater(). -
Game::run()passa gli eventi alle scene, aggiorna la simulazione con un semi-fixed timestep tramiteGameScenee disegna conWindoweView.
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.
- Scena e risorse: costruzione del livello, stack, input, camera, sprite e asset.
- Movimento e collisioni: integrazione, collider locali, CCD, AABB e notifiche.
- 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.
- 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