Domanda
Quando hai un gioco 2D che utilizza immagini molto grandi (più grandi di quelle che il tuo hardware può supportare), cosa fai? Forse c'è qualche soluzione interessante a questo problema che non mi è mai successo prima.
In pratica sto lavorando a una sorta di creatore di giochi di avventura grafica. Il mio target di riferimento sono persone con poca o nessuna esperienza di sviluppo (e programmazione) di giochi. Se stessi lavorando con un'applicazione del genere, non preferiresti che gestisse il problema internamente piuttosto che dirti di "dividere le tue immagini"?
Contesto
È noto che le carte grafiche impongono una serie di restrizioni sulla dimensione delle trame che possono usare. Ad esempio, quando lavori con XNA sei limitato a una dimensione massima della trama di 2048 o 4096 pixel a seconda del profilo che scegli.
Di solito questo non rappresenta un grosso problema nei giochi 2D perché la maggior parte di essi ha livelli che possono essere costruiti da singoli pezzi più piccoli (ad esempio tessere o folletti trasformati).
Ma pensa ad alcuni classici giochi di avventura grafica point'n'click (ad esempio Monkey Island). Le stanze nei giochi di avventura grafica sono generalmente progettate nel loro insieme, con sezioni poco o niente ripetibili, proprio come un pittore che lavora su un paesaggio. O forse un gioco come Final Fantasy 7 che utilizza grandi sfondi pre-renderizzati.
Alcune di queste stanze possono diventare piuttosto grandi, spesso occupando tre o più schermi di larghezza. Se consideriamo questi sfondi nel contesto di un moderno gioco ad alta definizione, supereranno facilmente le dimensioni massime della trama supportate.
Ora, la soluzione ovvia a questo è quella di dividere lo sfondo in sezioni più piccole che si adattano ai requisiti e disegnarli fianco a fianco. Ma tu (o il tuo artista) dovresti essere tu a dividere tutte le tue trame?
Se stai lavorando con un'API di alto livello, non dovrebbe forse essere preparato per affrontare questa situazione e fare la divisione e l'assemblaggio delle trame internamente (o come pre-processo come Content Pipeline di XNA o in fase di esecuzione)?
modificare
Ecco cosa stavo pensando, dal punto di vista dell'implementazione di XNA.
Il mio motore 2D richiede solo un piccolo sottoinsieme della funzionalità di Texture2D. Posso effettivamente ridurlo a questa interfaccia:
public interface ITexture
{
int Height { get; }
int Width { get; }
void Draw(SpriteBatch spriteBatch, Vector2 position, Rectangle? source, Color color, float rotation, Vector2 origin, Vector2 scale, SpriteEffects effects, float layerDepth);
}
L'unico metodo esterno che utilizzo che si basa su Texture2D è SpriteBatch.Draw () in modo da poter creare un ponte tra di loro aggiungendo un metodo di estensione:
public static void Draw(this SpriteBatch spriteBatch, ITexture texture, Vector2 position, Rectangle? sourceRectangle, Color color, float rotation, Vector2 origin, Vector2 scale, SpriteEffects effects, float layerDepth)
{
texture.Draw(spriteBatch, position, sourceRectangle, color, rotation, origin, scale, effects, layerDepth);
}
Ciò mi consentirebbe di utilizzare un ITexture in modo intercambiabile ogni volta che ho usato un Texture2D prima.
Quindi potrei creare due diverse implementazioni di ITexture, ad esempio RegularTexture e LargeTexture, in cui RegularTexture semplicemente avvolgerebbe un normale Texture2D.
D'altra parte, LargeTexture manterrebbe un Elenco di Texture2D ciascuno corrispondente a uno dei pezzi divisi dell'immagine completa. La parte più importante è che la chiamata a Draw () su LargeTexture dovrebbe essere in grado di applicare tutte le trasformazioni e disegnare tutti i pezzi come se fossero solo un'immagine contigua.
Infine, per rendere trasparente l'intero processo, creerei una classe di caricatore di texture unificata che fungerebbe da metodo Factory. Prenderebbe il percorso della trama come parametro e restituirebbe una ITexture che sarebbe una RegularTexture o una LargeTexture a seconda della dimensione dell'immagine che supera o meno il limite. Ma l'utente non aveva bisogno di sapere quale fosse.
Un po 'eccessivo o suona bene?