Let's Program Doom di 3DSage, ma in LibGDX: Parte 2

Introduzione

La sera in cui Youtube mi ha notificato la seconda parte di questo tutorial mi ha caricato così tanto che ho fatto fatica ad addormentarmi. Il giorno dopo ero già pronto a convertire (e bestemmiare) il codice C++ del video in Java. Di cosa sto parlando? Dovete innanzitutto sapere che di questo post c'è una parte 1. Non ha senso leggere questo articolo senza prima aver letto quell'altro. Se invece sapete di cosa stiamo parlando, possiamo iniziare.


Il suo bellissimo micione c'è sempre

Partiamo subito bene

Il progetto di 3Dsage prevede che i file dei livelli e delle texture siano in un formato testuale. Come prima cosa, dunque, ho creato un parser per i file ".h" (header in C++) che il progetto usa per definire i livelli e le texture di questo piccolo engine. 3DSage ha fatto anche un mini level editor chiamato Grid2D, che permette di creare livelli da renderizzare (andrò magari a convertire il tutto in un formato Java friendly in un secondo momento). Appena iniziato, scopro che appartenemente il vecchio codice non funzionava più come prima.


Annamo bene...

Cominciamo subito alla grande: vengono mostrati muri che dovrebbero essere dietro e altre cose completamente a caso. I problemi principali sono stati due:

  • Non avevo capito bene alcuni limiti di Grid2. Si deve sempre partire dal muro "frontale" e andare in senso antiorario. 
  • Il codice di caricamento del file era comunque sbagliato. Il tempo passa e mi dimentico le cose.

Un tantinello meglio

Le texture

Il caricamento delle texture è stato in realtà più facile anche da convertire in Java, ma disegnare da un array di pixel rgb una texture è stato un piccolo bagno di sangue. Quello che come prima cosa vado a fare è prepararmi un oggetto che contiene una lista di oggetti Color della libreria LibGDX, utilizzando i numeri contenuti in un array per determinare i parametri RGB di ogni pixel. In pratica, ogni Color è un singolo Pixel all'interno di un array che mi tengo in memoria.

Nell'idea del tutorial, le texture per i muri vengono disegnati in modo molto semplice. Provo a spiegarla (abbiate pazienza, ma di queste cose sono un dilettante): Prendete un'immagine divisa in pixel. Ogni pixel è un quadrato 1x1. Per disegnarlo in prospettiva, bisogna allargare o stringere l'immagine e conseguentemente i suoi pixel senza però rispettare le proporzioni. C'è da considerare anche che la prospettiva lo deve distorcere.Visto che l'engine di 3D Sage lavora disegnando righe verticali, per ognuna si deve disegnare il pixel corretto nella giusta posizione, in modo da simulare questo effetto. Quindi se ad esempio l'immagine è 16x16 pixel, ma va trasformata in una 32x16, i pixel orizzontali verranno disegnati 2 volte ciascuno.

Interessante 'sta roba, eh? No. Comunque capire quale pixel disegnare della texture e in che posizione sullo schermo farlo è la base su come funziona il texture mapping dei muri. 

I pavimenti del demonio

I pavimenti erano fin da subito una delle cose che mi preoccupavano di più. E avevo ragione. Il video parte sul disegnare una scacchiera per fare un corretto texture mapping. Utilizzando la trigonometria, che per me è sempre stata magia nera. Prendendo paro paro le formule date dal buon 3DSage, mi son reso conto un grosso problema: i pavimenti "scivolavano".


Trip di acidi con i pavimenti che non si muovono mentre tutto il resto si. 

Alla fine sono riuscito a tenere il tutto "fermo", che in realtà vuol dire muoverlo con la stessa velocità con cui si muovevano i muri, Come? Con dei fantastici numeri magici. Cos'è un numero magico? Un valore arbitrario tirato fuori a tentativi e che funziona, appunto, per magia. Maggiori info qua . Questo però mi ha permesso di chiudere il tutto e fare texture mapping dei pavimenti. 3DSage non mostra la formula per intero nel suo video, ma non è difficile arrivarci: prendete il modulo della x e la y calcolata per disegnare un certo pixel a schermo e avrete il pixel da disegnare (che dovrebbe essere il texel, o magari mi sbaglio).


Il risultato finale

Cosa rimane fa fare? Usare le classi per le Texture di LibGDX, utilizzare immagini vere come asset invece di preconvertirle a file di testo e possibilmente convertire Grid2D in Java. Tanta roba insomma, ma per ora ci fermiamo a quanto a fatto da 3DSage.

Commenti

Post più popolari