Let's Program Doom di 3DSage, ma in LibGDX: Parte 1
Introduzione
Ci sono quei video che a volte danno il "la" a qualcosa nel tuo cervello. Qualcosa scatta e dici "devo provarci anche io", specie se quel video è un tutorial su qualcosa di inusuale, ad esempio come creare candele di soia o, nel mio caso, come programmare un renderer simile a quello di Doom
Il video sul renderer stile Doom aveva titillato quella parte di me che vuole far tutto per conto suo, sbattendo la testa e sporcandosi le mani. E mentre fino a poco tempo fa mi ero ripromesso di imparare a a lavorare con GZDoom, mi ha fatto venir voglia complicarmi la vita.
Si, ma in pratica?
Per farla molto breve, il vecchio Doom divideva le mappe in "settori". Ogni settore era fondamentalmente un poligono di n lati (praticamente il soffitto o il pavimento). Dai lati venivano estrusi dei rettangoli sempre perpendicolari al settore che rappresentavano i muri. Tanti settori consecutivi costruivano una o più "stanze" nel quale il personaggio si muove. Questa spiegazione è estremamente semplicistica, per questo consiglio, se siete davvero interessati, di approfondire in uno degli innumerevoli siti o video che ne spiegano il funzionamento.
Java vs C
Visto che la situazione di partenza non era abbastanza complicata, ho deciso di riscrivere tutto in Java, usando LibGDX che conoscevo bene. Che come idea fa già ridere: nel video il progetto è sviluppato in C e Opengl. Per chi sa di cosa sto parlando, basti sapere che LibGDX utilizza come backend una versione Java di Opengl, mascherando molta della logica di "basso livello". Per chi non sa di cosa sto parlando è invece inutile che glielo spieghi.
il buon 3DSage ha anche quello che io reputo un brutto vizio: usare nomi delle variabili molto corti. Sarò prolisso, ma quando scrivo codice ho bisogno che tutto mi sia immediatamente chiaro. Inoltre, mi sono preso la libertà di rendere il codice più vicino alle normali convenzioni di Java e di programmazione ad oggetti, non facendo così una semplice traduzione 1:1 del codice.
Le coordinate float, mannaggia a loro
Dal 2.5D al 3D
Finisco finalmente il progetto per come è indicato nel video. Vuoi aspettare la seconda parte prima di continuare, in modo da poter fare altro? Ovvio che no.
Ora, è noto a tutti che la Doom Engine non è letteralmente in 3D. Ci sono decine di discussioni portate avanti da centinaia di utenti su decine di forum e siti. Non voglio addentrarmi nel ginepraio, quindi mi limito a dire che il renderer che stiamo sviluppando è, di fatto, un 2.5D (giusto per confondere ancora di più le idee).
Ho quindi deciso di sviluppare parallelamente un vero renderer 3D: lo scopo è ottenere una classe Java che, predendo gli stessi dati della mappa da renderizzare di quello preso a modello dal video (chiamiamolo DoomLikeRenderer) , ottenga un vero modello 3D e lo renderizzi a dovere (chiamiamolo True3dRenderer). LibGDX mette a disposizione degli strumenti per costruire e renderizzare modelli 3D, quindi parto parzialmente avvantaggiato. O forse no, visto che è la prima volta che lavoro in ambiente 3D senza l'ausilio di engine come Unity o Godot.
Commenti
Posta un commento