Bene, formulato in questo modo sono sicuro che suona oscuro, ma farò del mio meglio per descrivere il mio problema.
Prima di tutto, lasciami spiegare cosa c'è che non va nel mio vero codice sorgente.
Sto facendo un platform, e qui sono i componenti attuali del mio gioco: un livello , che sta tenendo una propria griglia di piastrelle e anche i fogli di mattonelle e una Tile , che mantiene solo il nome del suo foglio di piastrelle e l'indice all'interno della foglio di piastrelle. Tutti questi sono all'interno di un progetto di gioco XNA separato, chiamato GameLib.
Ecco come sono formattati i miei livelli in un file di testo:
x x . . . . .
. . . b g r .
. . . . . . .
X X X X X X X
Dove .
rappresenta una tessera vuota, b
rappresenta una piattaforma blu, X
rappresenta un blocco con un colore casuale, ecc.
Invece di fare tutto il lavoro di caricamento di un livello all'interno della classe Level , ho deciso di sfruttare l'estensione della pipeline di contenuti e creare LevelContentPipelineExtension.
Appena ho iniziato, ho capito rapidamente che non volevo codificare più di 20 righe del tipo:
if (symbol == 'b')
return new Tile(/*...*/);
Quindi, nella speranza di almeno centralizzare tutta la creazione del contenuto in una classe, ho creato una classe statica, denominata LevelContentCreation , che contiene le informazioni su quale simbolo crea cosa e tutto questo tipo di cose. Contiene anche un elenco di tutti i percorsi delle risorse dei fogli a tessere, per caricarli in seguito. Questa classe rientra nel mio progetto di libreria di giochi GameLib.
Il problema è che sto usando questa classe statica LevelContentCreation sia nella mia classe Level (per caricare i fogli delle tessere effettive) sia nella mia estensione della pipeline di contenuti (per sapere quale simbolo rappresenta quale tessera) ...
Ed ecco come appare la mia classe LevelContentCreation :
public static class LevelContentCreation
{
private static Dictionary<char, TileCreationInfo> AvailableTiles =
CreateAvailableTiles();
private static List<string> AvailableTileSheets { get; set; }
/* ... rest of the class */
}
Ora, poiché la classe LevelContentCreation fa parte della libreria di giochi, l'estensione della pipeline di contenuti tenta di usarla ma la chiamata a CreateAvailableTiles () non avviene mai e non riesco a caricare un oggetto Level dalla pipeline di contenuti.
Lo so perché la pipeline di contenuti viene eseguita prima della compilazione effettiva o qualcosa del genere, ma come posso risolvere il problema?
Non riesco davvero a spostare la classe LevelContentCreation sull'estensione della pipeline, perché quindi la classe Level non sarebbe in grado di usarla ... Sono piuttosto persa e non so cosa fare ... Conosco questi sono decisioni di progettazione piuttosto sbagliate e mi piacerebbe se qualcuno potesse indicarmi la giusta direzione.
Grazie per il tuo prezioso tempo.
Se qualcosa non è abbastanza chiaro o se dovessi fornire ulteriori informazioni / codice, lascia un commento qui sotto.
Qualche informazione in più sui miei progetti:
- Gioco - Progetto di gioco XNA per Windows. Contiene riferimenti a: Engine, GameLib e GameContent
- GameLib - Progetto di libreria di giochi XNA. Contiene riferimenti a: Motore
- GameContent - Progetto di contenuto XNA. Contiene riferimenti a: LevelContentPipelineExtension
- Motore : progetto della libreria di giochi XNA. Nessun riferimento
- LevelContentPipelineExtension - Estensione della pipeline del contenuto XNA. Contiene riferimenti a: Engine e GameLib
So quasi nulla di XNA 4.0 e sono un po 'perso su come funzionano i contenuti ora. Se hai bisogno di maggiori informazioni, dimmelo.