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.
Partiamo subito 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.
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".
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).
Commenti
Posta un commento