Okay, so formuliert, ich bin sicher, es klingt dunkel, aber ich werde mein Bestes tun, um mein Problem zu beschreiben.
Lassen Sie mich zunächst erklären, was mit meinem echten Quellcode nicht stimmt.
Ich mache einen Plattformer, und hier sind die aktuellen Komponenten meines Spiels: ein Level , das ein eigenes Kachelraster enthält, sowie die Kachelblätter und eine Kachel , die nur den Namen des Kachelblatts und des Index innerhalb des Feldes enthält Fliesenblatt. All dies befindet sich in einem separaten XNA-Spielprojekt namens GameLib.
So werden meine Ebenen in einer Textdatei formatiert:
x x . . . . .
. . . b g r .
. . . . . . .
X X X X X X X
Wo .
eine leere Kachel darstellt, b
eine blaue Plattform darstellt, X
einen Block mit einer zufälligen Farbe darstellt usw.
Anstatt die gesamte Arbeit des Ladens eines Levels innerhalb der Level- Klasse zu erledigen, habe ich beschlossen, die Content-Pipeline-Erweiterung zu nutzen und eine LevelContentPipelineExtension zu erstellen.
Als ich anfing, wurde mir schnell klar, dass ich nicht mehr als 20 Zeilen fest codieren wollte:
if (symbol == 'b')
return new Tile(/*...*/);
In der Hoffnung, zumindest die gesamte Inhaltserstellung in einer Klasse zu zentralisieren, habe ich eine statische Klasse namens LevelContentCreation erstellt , die Informationen darüber enthält, welches Symbol was und all diese Dinge erstellt. Es enthält auch eine Liste aller Asset-Pfade der Kachelblätter, um sie später zu laden. Diese Klasse befindet sich in meinem GameLib-Spielbibliotheksprojekt.
Das Problem ist, dass ich diese statische LevelContentCreation- Klasse sowohl in meiner Level-Klasse (um die eigentlichen Kachelblätter zu laden) als auch in meiner Inhaltspipeline-Erweiterung (um zu wissen, welches Symbol welche Kachel darstellt) verwende ...
Und so sieht meine LevelContentCreation- Klasse aus:
public static class LevelContentCreation
{
private static Dictionary<char, TileCreationInfo> AvailableTiles =
CreateAvailableTiles();
private static List<string> AvailableTileSheets { get; set; }
/* ... rest of the class */
}
Jetzt, da die LevelContentCreation Klasse Teil des Spiel Bibliothek ist, die Content - Pipeline - Erweiterung versucht , es zu benutzen , aber der Anruf zu CreateAvailableTiles () nie passiert , und ich bin nicht in der Lage eine Stufe Objekt aus der Content - Pipeline zu laden.
Ich weiß, dass dies daran liegt, dass die Inhaltspipeline vor der eigentlichen Kompilierung oder ähnlichem ausgeführt wird. Aber wie kann ich das Problem beheben?
Ich kann die LevelContentCreation- Klasse nicht wirklich in die Pipeline-Erweiterung verschieben, da die Level- Klasse sie dann nicht verwenden kann. Ich bin ziemlich verloren und weiß nicht, was ich tun soll. Ich kenne diese sind ziemlich schlechte Designentscheidungen, und ich würde es gerne sehen, wenn mich jemand in die richtige Richtung weisen könnte.
Vielen Dank für Ihre wertvolle Zeit.
Wenn etwas nicht klar genug ist oder ich mehr Informationen / Code bereitstellen sollte, hinterlassen Sie bitte unten einen Kommentar.
Ein bisschen mehr Informationen zu meinen Projekten:
- Spiel - XNA Windows-Spielprojekt. Enthält Verweise auf: Engine, GameLib und GameContent
- GameLib - XNA- Spielbibliotheksprojekt . Enthält Verweise auf: Motor
- GameContent - XNA-Inhaltsprojekt. Enthält Verweise auf: LevelContentPipelineExtension
- Engine - XNA-Spielbibliotheksprojekt. Keine Referenzen.
- LevelContentPipelineExtension - Erweiterung der XNA-Inhaltspipeline. Enthält Verweise auf: Engine und GameLib
Ich weiß so gut wie nichts über XNA 4.0 und bin ein bisschen verloren darüber, wie Inhalte jetzt funktionieren. Wenn Sie weitere Informationen benötigen, sagen Sie es mir.