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 dellepagine. 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:
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
Posta un commento