Prima di tutto, lasciami dire che i giochi di ruolo 2D sono vicini e cari al mio cuore e lavorano con i vecchi motori DX7 VB6 MORPG (non ridere, è stato 8 anni fa, ora :-)) è ciò che mi ha interessato per lo sviluppo del gioco . Più recentemente, ho iniziato a convertire un gioco su cui ho lavorato in uno di quei motori per usare XNA.
Detto questo, la mia raccomandazione è di usare una struttura a tessere con strati per la tua mappa. Con qualsiasi API grafica che usi, avrai un limite alla dimensione delle trame che puoi caricare. Per non parlare dei limiti di memoria della trama della scheda grafica. Quindi, considerando questo, se vuoi massimizzare la dimensione delle tue mappe non solo minimizzando la quantità e la dimensione delle trame che carichi in memoria, ma anche diminuendo la dimensione delle tue risorse sul disco rigido dell'utente E i tempi di caricamento, sei sicuramente vorrai andare con le piastrelle.
Per quanto riguarda l'implementazione, sono andato nei dettagli su come l'ho gestito su alcune domande qui su GameDev.SE e sul mio blog (entrambi collegati di seguito), e non è esattamente quello che mi stai chiedendo, quindi mi limiterò a vai alle basi qui. Prenderò anche nota delle caratteristiche delle tessere che le rendono utili rispetto al caricamento di diverse immagini pre-renderizzate di grandi dimensioni. Se qualcosa non è chiaro, fammi sapere.
- La prima cosa che devi fare è creare un foglio di piastrelle. Questa è solo una grande immagine che contiene tutte le tessere allineate in una griglia. Questo (e forse uno in più a seconda del numero di tessere) sarà l'unica cosa che devi caricare. Solo 1 immagine! Puoi caricare 1 per mappa o uno con ogni tessera del gioco; qualunque organizzazione lavori per te.
- Successivamente, devi capire come puoi prendere quel "foglio" e tradurre ogni tessera in un numero. Questo è piuttosto semplice con qualche semplice matematica. Nota che la divisione qui è divisione intera , quindi le posizioni decimali vengono eliminate (o arrotondate per difetto, se preferisci).
OK, ora che hai suddiviso il foglio in una serie di celle (numeri), puoi prendere quei numeri e inserirli in qualsiasi contenitore ti piaccia. Per semplicità, puoi semplicemente usare un array 2D.
int[,] mapTiles = new int[100,100]; //Map is 100x100 tiles without much overhead
Quindi, vuoi disegnarli. Uno dei modi in cui puoi renderlo MOLTO più efficiente (a seconda delle dimensioni della mappa) è calcolare solo le celle che la videocamera sta attualmente visualizzando e scorrere quelle. Puoi farlo recuperando le coordinate dell'array di riquadri della mappa degli angoli superiore sinistro ( tl
) e inferiore destro ( br
) della videocamera . Quindi loop da tl.X to br.X
e, in un loop nidificato, da tl.Y to br.Y
per disegnarli. Esempio di codice di seguito:
for (int x = tl.X; x <= br.X;x++) {
for (int y = tl.Y; y <= br.Y;y++) {
//Assuming tileset setup from image
Vector2 tilesetCoordinate = new Vector2((mapTiles[x,y] % 8) * 32,(mapTiles[x,y] / 8) * 32);
//Draw 32x32 tile using tilesetCoordinate as the source x,y
}
}
- Montepremi! Queste sono le basi del motore delle piastrelle. Puoi vedere che è facile avere anche una mappa 1000x1000 con un sovraccarico eccessivo. Inoltre, se hai meno di 255 riquadri, puoi utilizzare un array di byte che riduce la memoria di 3 byte per cella. Se un byte è troppo piccolo, un ushort probabilmente sarebbe sufficiente per le tue esigenze.
Nota: ho tralasciato il concetto di coordinate del mondo (che è su cui si baserà la posizione della fotocamera) poiché, a mio avviso, non rientra nell'ambito di questa risposta. Puoi leggerlo qui su GameDev.SE.
Risorse per il mio Tile-Engine
Nota: tutti questi sono indirizzati a XNA, ma si applica praticamente a qualsiasi cosa: devi solo cambiare le chiamate di sorteggio.
- La mia risposta a questa domanda delinea come gestisco le celle della mappa e la stratificazione nel mio gioco. (Vedi terzo link.)
- La mia risposta a questa domanda spiega come archiviare i dati in un formato binario.
- Questo è il primo post sul blog (bene, tecnicamente il secondo, ma il primo "tecnico") sullo sviluppo del gioco su cui stavo lavorando. L'intera serie contiene informazioni su cose come pixel shader, illuminazione, comportamenti delle piastrelle, movimento e tutte quelle cose divertenti. In realtà ho aggiornato il post per includere il contenuto della mia risposta al primo link che ho pubblicato sopra, quindi potresti volerlo leggere (potrei aver aggiunto delle cose). Se hai domande, puoi lasciare un commento lì o qui e sarei felice di aiutarti.
Altre risorse del Tile-Engine
- Il tutorial sul motore delle tessere di questo sito mi ha fornito le basi che ho usato per creare le mie mappe.
- In realtà non ho ancora visto questi tutorial video perché non ho avuto il tempo, ma probabilmente sono utili. :) Tuttavia, potrebbero essere obsoleti se si utilizza XNA.
- Questo sito ha alcuni tutorial che (penso) si basano sui video sopra. Potrebbe valere la pena dare un'occhiata.