Robert.Torna al playground05 / 10

Playground · Flappy Bird

Per far volare un uccello, ho dovuto costruire gravità, collisioni e un mondo intero.

Un esperimento con HTML Canvas diventato il mio primo piccolo motore di gioco: niente framework, niente fisica pronta, soltanto JavaScript e parecchi tentativi.

Partita di Flappy Bird ambientata in una foresta notturna
Un uccello, una foresta a più livelli e il primo tentativo di trasformare numeri e intervalli in movimento.

01 · Il punto di partenza

Il gioco era conosciuto. Il modo per farlo esistere, per me, era tutto nuovo.

Volevo capire davvero Canvas. Flappy Bird aveva abbastanza poche regole da lasciarmi sperimentare, ma abbastanza movimento da obbligarmi a ragionare su spazio, tempo, gravità e collisioni.

Canvas
Un mondo ridisegnato a ogni frame.Lo scenario veniva composto e aggiornato continuamente, livello dopo livello.
JavaScript
Movimento, regole e collisioni.Ogni salto e ogni ostacolo dipendevano da coordinate, intervalli e controlli scritti a mano.
Illustrator
La foresta era interamente mia.Ho disegnato paesaggio, alberi, montagne, tubi e interfaccia. Soltanto lo sprite dell’uccello era esterno.

02 · Una copia che non voleva sembrare una copia

Dal Flappy Bird originale ho preso le regole. Il resto è diventato una foresta mezza innevata.

Partendo da alcune reference boschive ho costruito una direzione più scura, silenziosa e quasi cinematografica. Ogni elemento visivo è stato disegnato in Illustrator per appartenere allo stesso paesaggio.

03 · L’esperimento dentro l’esperimento

Se tutto scorre alla stessa velocità, non è un mondo. È una fotografia.

Ho separato il paesaggio in sei livelli e assegnato a ciascuno una velocità diversa. Gli elementi lontani si muovono lentamente, quelli vicini corrono: il parallasse crea la profondità che la scena non possiede davvero.

010.25×
020.50×
030.75×
041.00×
051.25×
061.50×

Ogni immagine viene disegnata due volte, affiancata a se stessa. Quando una copia esce dallo schermo, riparte dall’altra parte e il paesaggio sembra non finire mai.

04 · La prima fisica

Il primo salto non era un’animazione. Era una trattativa continua tra click e gravità.

A ogni click l’uccello riceveva una spinta verso l’alto. Quando quella spinta terminava, un intervallo lo riportava verso il basso. Era semplice, numerico e sorprendentemente difficile da far sembrare naturale.

Click · spintaSagoma dell’uccelloIntervallo · gravità
  1. 01

    Il primo click avvia il gioco, gli ostacoli e il conteggio.

    Start
  2. 02

    Ogni click successivo sposta progressivamente l’uccello verso l’alto.

    Jump
  3. 03

    Quando la spinta finisce, la gravità riprende a trascinarlo verso il terreno.

    Fall
  4. 04

    Su mobile cambiano dimensioni e intensità per conservare una giocabilità simile.

    Adapt

Non c’era un motore fisico a decidere cosa fosse credibile. C’erano valori scelti, provati e corretti finché il movimento non iniziava a sembrare vivo.

05 · La parte che non si vede

Volare era soltanto metà del problema. L’altra metà era capire esattamente quando smettere.

A ogni aggiornamento confrontavo manualmente il rettangolo dell’uccello con quelli dei due ostacoli e con il terreno. Una sovrapposizione bastava a fermare ogni intervallo e mostrare il risultato.

UccelloPlayer boxTube boxesGround limit
  1. Controllo 01L’uccello ha toccato il terreno?
  2. Controllo 02La sua area si sovrappone al tubo superiore?
  3. Controllo 03Oppure è entrata nel tubo inferiore?
  4. Se sìFerma gravità, ostacoli e punteggio. Mostra il game over.

06 · La cosa di cui vado più fiero

Non avevo un motore di gioco. Quindi, senza chiamarlo così, ne ho costruito uno piccolo.

Canvas disegnava il mondo, CSS faceva scorrere gli ostacoli e JavaScript teneva insieme input, gravità, collisioni, punteggio e stato della partita.

Render
Sei livelli ridisegnati e riposizionati continuamente.Due copie per livello creavano un ambiente infinito senza interrompere lo scorrimento.
Game loop
Intervalli diversi governavano fisica, ostacoli e punteggio.Il gioco nasceva dalla sincronizzazione di sistemi semplici, non da un’unica libreria.
State
Un click avvia tutto. Una collisione ferma tutto.L’intero ciclo di vita della partita veniva gestito direttamente nel browser.
Partita completa di Flappy Bird in esecuzione

07 · Il risultato

Giocabile, responsive e abbastanza completo. Il best score un po’ meno.

Il gioco aveva schermata iniziale, caricamento, partita, ostacoli casuali, punteggio, game over e adattamento mobile. Il salvataggio del record tramite cookie funzionava, ma non era esattamente la parte più solida del progetto.

Schermata finale di Flappy Bird con punteggio e pulsante replay
Completo
Un ciclo di gioco intero, dall’avvio al replay.
Responsive
Dimensioni e movimento adattati anche agli schermi piccoli.
Onestamente
Il best score c’era. La sua implementazione oggi durerebbe pochissimo.
Eredità
Il primo passo concreto verso fisica, scene e successivi esperimenti 3D.

Oggi

Rifarei la grafica e tutta la fisica. Ma non cancellerei il progetto che mi ha portato verso il 3D.

Non era un engine nel senso professionale del termine. Era però la prima volta in cui ho dovuto ragionare come se lo fosse: disegnare una scena, aggiornarla, applicare forze, rilevare collisioni e conservare lo stato.