Generare un file binario per gestire i fondali
Un fondale pre-renderizzato non è solo una banale immagine usata come sfondo, lo spazio 3d è presente a tutti gli effetti,
e ogni schermata può prevedere svariate interazioni:
oggetti e NPC con cui interagire, collisioni con muri, percorsi calpestabili e non, porte, ostacoli vari ecc.. capite bene che serve qualcosa
con cui poter definire cosa è presente nella scena per ogni singola schermata, definire da dove si arriva, da dove si esce,
cosa può succedere e cosa no.
Per fare questo ci sono svariati modi, per fare un gioco semplice sicuramente potremmo definire una struttura dati dove poi andare a inserire tutti i dati necessari per ogni scena, per fare le cose per bene dovremmo allocare la struttura dati nella heap, definire il tutto nello stack sarebbe impossibile, la ps1 ha solo 2MB di ram, e anche se possiamo definire quanta stack utilizzare quando inizializziamo la memoria, non ci possiamo permettere di utilizzare 100-500 KB solo per definire le schermate, e questo solo per un gioco che potrebbe avere solo qualche decina di schermate, ma pensate ai giochi come Final Fantasy VII o VIII, hanno centinaia di fondali.
Quindi anche se carichiamo tutti i dati nella heap, il problema rimane, lo spazio scarseggia, abbiamo quindi bisogno di qualcosa che possa
essere salvato nel cd-rom, e che possiamo leggere al bisogno, caricando in memoria solo le parti della schermata che ci interessa,
potremmo usare un file JSON, o un XML, dove definire ogni scena, con le sue proprietà, e poi fare una funzione che legga il file, ne
capisca la sintassi, e quindi estragga i valori necessari.
Oggi i file JSON e XML sono abusati, parser per questi tipi di file sono ormai uno standard, ma noi siamo negli anni 90, la cpu e la ram
sono sicuramente sufficienti per riuscire a fare una cosa del genere, ma è un operazione meno efficiente da effettuare,
e siccome siamo negli anni 90, ci piace ancora ottimizzare il più possibile, useremo un file binario.
Nel video qui sotto spiegherò nel dettaglio come ho implementato la lettura (lato PS1) di un file binario, e la scrittura.