Langobarda Horribilis: in Trebia Post Mortem

Idee rinate

Langobardia Horribilis è quel progetto che porti avanti da tanto tempo, ha cambiato forma dozzine di volte e non ha ancora trovato una via definitiva. È partito come videogioco in stile Diablo, è diventato Gioco di ruolo, ha cambiato ambientazione due volte. Ed infine, è tornato a essere anche un videogioco. Langobardia Horribilis: in Trebia è una lettera d'amore ai giochi survival horror e ai giochi per il vecchio Game Boy Color. Una lettera scritta in Java e bestemmie nell'arco di tre anni 

Si, ma in pratica?


Doveva chiamarsi "in Padus", poi "in Tarum". Alla fine la storia dello scriptorium di San Colombano mi ha fatto propendere per "in Trebia".

Un gioco inspirato da FAITH, con un po' di Legend of Zelda e di stile roguelite. Lo stile è volutamente retrò: la grafica ha la stessa risoluzione e i limiti di palette e colori dei giochi esclusivi per Game Boy Color. Per chi si vuole documentare meglio, ecco delle pagine. C'è un certo grado di approssimazione, ovviamente. Sviluppare su Gameboy Color è possibile anche oggi (vedi GBStudio o le SDK ) ma non era il mio scopo.

Game Design mon amour

Visto che i precedenti tentativi di sviluppare un gioco con LibGDX si erano mostrati troppo ambiziosi per le mie sole forze, ho deciso di semplificarlo al punto di ottenere un'idea del prodotto del quale vi parlavo nel precedente paragrafo. Mi sono sforzato di non buttarmi subito a scrivere codice a cannone, concentrandomi invece sul documento di design e buttare giù qualche schizzo in matita del gioco.

 
Alcune cose sono state scartate, e alcune di queste riconsiderate dopo.

Il risultato è lontano da un vero e proprio Game Design Document, ma mi è bastato per avere le idee più chiare e una serie di appunti, sì sparsi e disordinati, ma comunque scritti e riguardabili. Sono anche serviti per dare indicazioni a 2dipixel e Gilian Adam, rispettivamente un artista di pixel art e un musicista per videogiochi con cui ho collaborato.


Schizzi per dare un'idea di base ai collaboratori riguardo ad un determinato nemico
. Si ringrazia poi 2dipixel e Arnocyreus per averlo reso, rispettivamente, in grafica e musica.

Strumenti del mestiere

Avevo già fatto un post su itch.io al riguardo. Visto che non voglio dilungarmi troppo, mi limito a dire che ho utilizzato:

  • Piskel per sprite e animazioni.
  • Intellij come IDE.
  • Hiero per la conversione del font stile Gameboy ad un BitmapFont compatibile con la libreria.
  • Tiled come level editor.
  • Audacity and Pico8 per il (piccolo) lavoro di sound editing.
Altri dettagli li potete trovare nel post sopra indicato.

Le non sistematiche NullPointerException

Lo sviluppo è stato un interessante esercizio di Java. Vorrei poter dire di aver flexato le mie skill scrivendo roba figa in reflection con un'architettura OO elegante come gli ingranaggi di un orologio artigianale, ma nella pratica c'era una componente di bestemmie, schiantoni e martellate qua e là che dà un'immagine molto meno romantica del processo. 

Uno dei problemi che ho trovato era un bug enorme che solo il mio vecchio computer dell'università che montava Ubuntu GNOME ha tirato fuori.


 In rosso il punto incriminato. In blu lo shape che NON dovevo usare, in verde quello che avrei dovuto usare.

Nel codice un punto andava in NullPointerException. O meglio, avrebbe dovuto tirare la suddetta eccezione in modo sistematico. Ma mentre il mio gaming pc Windows 10 del 2016 questo non accadeva senza spiegazione, il vegliardo con Linux era molto meno tollerante.  

Le mitiche coordinate float

Se avete già letto questo post, sapete già di cosa sto parlando. Per gli altri, vi basti sapere che LibGDX utilizza un sistema di coordinate float. Questo vuol dire che potrebbero esserci valori non interi, specialmente in un caso in cui la fisica del gioco è simulata da un engine fisico potente come Box2D. Il che causava questo glitch.


Notare il glitch sulla parte sinistra del mostro: il rendering del pixel viene"approssimato" male per via delle coordinate non intere.


Voi direte "ma come, avevi già incontrato questo problema e ci sei ricascato dopo due anni?". Si, è la dimostrazione che l'esperienza serve solo se si presta attenzione.

Sempre all'erta!

 

Il bagno di sangue della web build

Partiamo dal presupposto che secondo la mia modesta opinione GWT è magia nera. GWT è un kit di sviluppo che traduce il Java in Javascript. Molti di voi saranno confusi o stupefatti da questa frase, e fidatevi lo ero pure io. Ma perché vi sto parlando di questo maligno strumento che trasforma le mele in arance? 

LibGDX è una libreria Java che permette, tra le altre cose, di rilasciare giochi su Desktop, Ios, Android e Web. In quest'ultimo caso il gioco sarà giocabile su un qualunque browser. Per realizzare ciò, la libreria utilizza GWT per tradurre il codice Java in Javascript. Facile, no? Basta lanciare un comando di build e fa tutto lui. E invece no.    


Non sembra male, finché non devi capire classe per classe cosa inserire.

Bisogna tenere a mente una serie di cose: vanno innazitutto censite tutte le librerie esterne su un apposito file *.gwt.xml. Qualora poi nel codice venisse usata la reflection, non può essere usata nel modo "classico", ma bisogna usare una classe di utility fornita ClassReflection da LibGDX (ClassReflection), e censire sempre sul suddetto file le classi che la utilizzano. Questo non vuol dire che una volta finito questo censimento la build web fili liscia. Ci sono alcuni problemi che hanno richiesto soluzioni bizzarre, come ad esempio copiare una classe della libreria e relativi package nel progetto, e referenziarla nel suddetto file. Soluzione tampone trovata sul mai abbastanza glorificato StackOverflow.

Il misterioso caso della velocità del motore fisico

Nei paragrafi precedenti ho menzionato Box2D. In soldoni, è un engine per avere una simulazione fisica bidimensionale, e gestisce anche le collisioni. È molto potente e ha semplificato di molto il lavoro sulla gestione delle interazioni tra entità di gioco. Però, misteriosamente, sulla build web di Box2D sembra più veloce della versione desktop, risultando in movimenti più ampi e veloci. Come soluzione tampone ho moltiplicato per 0.75 tutti i valori che definivano la frequenza di update del motore fisico. Perché proprio 0.75? Questo numero è letteralmente tirato fuori io dal cilindro andando a tentoni. Ho risolto il problema definitivamente, secondo voi?

No, ovviamente. A pochi giorni prima del rilascio finale, ecco che misteriosamente tutto va più lento. O meglio, torna ad andare alla giusta velocità, quindi per il fatto che io avevo rallentato artificiosamente la fisica era a sua volta più lenta. Il motivo? Dopo aver chiesto aiuto alla community Discord di LibGDX, ho dedotto che il bug era probabilmente dovuto al fatto che la velocità di sync dello schermo e la temporizzazione dello "step" che doveva fare il motore fisico non erano allineate. Grazie ad un utente della community Discord di Libgdx ho avuto modo di leggere un articolo su Box2D e capire dove ero stato piuttosto ingenuo. 

Ovviamente l'argomento è abbastanza ampio, infatti c'è da leggere tutto questo articolo. Ma per farla breve, possiamo dire che fare le cose senza capire capire cosa si sta facendo è una cazzata.

Tirando le somme...


Va che lusso, dopo tutto sto mattone di post abbiamo pure un trailer.

Lo sviluppo di Langobardia Horribilis: in Trebia è stato lungo e comunque una bellissima esperienza. Aver costruito il tutto da 0 in Java è stato per me molto motivante, e se avessi lavorato con un engine come Godot o Unity probabilmente non l'avrei mai portato a termine. Questo mi ha fatto capire che bisogna sempre mettersi in condizione di avere motivazione al massimo possibile. Questo è valido ovviamente per tutti i lavori, e la programmazione non fa differenza. Dato che non avevo veri vincoli, mi sono concesso questa "complicazione" che in realtà è stata vero e proprio combustibile per portare avanti il lavoro.

Il lavoro di progettazione, sia tecnica che artistica, è stato fondamentale per ridurre i problemi, e tuttavia penso che mi sarei potuto permettere di prendere ancora più tempo.

Inoltre ho capito di aver fatto troppa poca promozione. Avrei dovuto iniziare fin dalle primissime fasi di sviluppo a diffondere screenshot e post social a riguardo. Fondamentalmente fare community. Questo ovviamente porta via molto (troppo) tempo, e nell'ultimo periodo non era fattibile. Prossimamente, complici forse tempi più tranquilli, dovrei riuscire a dedicarci del tempo.

Questi sono i punti che mi son portato a casa. E con questa ultima frase, possiamo anche chiudere questo lungo articolo, non prima però di avervi dato il link al repository del gioco.
 

Commenti

Post più popolari