XNA-Inhaltspipeline mit Dienstprogramm zur Kartenerstellung

7

Ich habe untersucht, wie die XNA Content-Pipeline für ein Spiel, an dem ich arbeite, angemessen verwendet werden kann. Es fiel mir jedoch schwer, meinen Kopf darum zu wickeln, und ich bin mir nicht sicher, wie ich am besten vorgehen soll.

Das konkrete Beispiel ist, ich habe ein 2-D-RPG-Spiel von oben nach unten. Ich möchte ein Dienstprogramm (wahrscheinlich Windows Forms) erstellen, mit dem ich Karten einfach erstellen und bearbeiten kann. Jede Karte besteht aus einer oder mehreren Grafikebenen, wobei jede Ebene ein N x N-Raster von Kacheln enthält. Jede Kachel beginnt wiederum als Bitmap.

Angesichts der obigen Informationen sehe ich einige Möglichkeiten, um fortzufahren:

  1. Speichern Sie die Karteninformationen in einer XML-Datei, die mit dem Content Pipeline XML Loader kompatibel ist. Jede Kachel wird als Zeichenfolgenreferenz auf das entsprechende Texturelement gespeichert. Textur-Assets werden im Spielprojekt hinzugefügt.
  2. Speichern Sie die Karteninformationen in einer XML-Datei, die mit dem Content Pipeline XML Loader kompatibel ist. Jede Kachel wird als Pfad zu den entsprechenden .bmp / ​​.png-Dateien gespeichert.

Nun gibt es Dinge, die ich an beiden Ansätzen wirklich nicht mag. Das Hauptproblem bei Ansatz 1 besteht darin, dass die Kartenerstellung und die Erstellung des .xnb-Textur-Assets vollständig getrennt sind. Die XML-Map-Datei wird vom Dienstprogramm erstellt, während das Textur-Asset meinem Inhalt in meinem Spiel hinzugefügt wird. Dies wird zu einem Problem, bei dem versucht wird, sicherzustellen, dass die XML-Zuordnungsdatei und alle Textur-Assets im Projekt synchron bleiben.

Ansatz zwei würde es mir ermöglichen, alle entsprechenden Bilddateien neben den Kartendateien mit dem Kartendienstprogramm zu speichern. Es scheint jedoch, dass ich so etwas nicht tun sollte. Außerdem müsste ich beim Laden der Karten intelligenter sein, damit ich nicht für jede Kachel schnell das gleiche Bild von der Disc lade.

Meine Frage lautet also: Wenn Sie ein Dienstprogramm zur Inhaltsgenerierung (wie einen Karteneditor) hinzufügen möchten, wie können Sie am besten sicherstellen, dass der benutzerdefinierte Inhalt (Kartendatei) mit den Textur-Assets synchron bleibt. Denken Sie auch daran, dass ich in meinem Karteneditor die Fähigkeit benötigen würde, die Textur-Assets zu laden und anzuzeigen.

Jede Eingabe wird sehr geschätzt.

DeusAduro
quelle

Antworten:

6

Sie möchten, dass Ihre Texturen basierend auf dem Inhalt der XML-Datei erstellt werden. Auf diese Weise müssen Sie die Texturen nicht zu Ihrem Inhaltsprojekt hinzufügen. Die Pipeline nimmt die Texturdatei automatisch in den Build für Sie auf.

Dazu müssen Sie einen benutzerdefinierten Inhaltsprozessor schreiben (Sie können weiterhin den Standard-XML-Importer verwenden) und ContentProcessorContext.BuildAssetin diesem Prozessor auf die externe Textur verweisen.

Ich denke, dass Sie eine benutzerdefinierte erstellen ContentTypeWriterund ContentTypeReaderschreiben und dann lesen müssen ExternalReference, BuildAssetdie Ihnen gibt.

Andrew Russell
quelle
Andrew ist hier ganz richtig!
Roy T.
2

Fügen Sie alle Ihre Kachelbilder in eine einzelne Bilddatei ein und referenzieren Sie sie anhand der Kachelnummer.

Dies ist viel leistungsfähiger und fehlersicherer und hat den Vorteil, dass Sie Ihre Ebenen in einem Kachel-Editor wie Tiled einrichten können .

BlueRaja - Danny Pflughoeft
quelle
Funktioniert dies nicht nur bei extrem kleinen Spielen leistungsfähiger, da das Laden einer zu großen Textur langsam und über bestimmte Auflösungen hinaus unmöglich ist
Roy T.
1
@Roy T: Wenn Sie so viele Fliesen haben , dass Ihre verpackte Textur „zu groß“ ist, stehen die Chancen sind Sie wahrscheinlich benötigen für Rendering - Leistung , um sie in eine oder mehrere Texturen zu packen.
Andrew Russell
@ Andrew Russel, ja das habe ich gemeint :). Aber ich habe gerade mit dem Berechnen begonnen und eine 4096x4096-Textur (maximal bei älteren Videokarten) kann 64x64 (auch bekannt als 4096) Sprites von 64x64 packen, also ist es vielleicht nicht so ein Problem, wie ich dachte.
Roy T.
1

Ich bin mir nicht 100% sicher, ob ich Ihre Frage klar im Kopf habe, aber versuchen Sie Folgendes:

Sie müssen den Karteneditor führend machen und Ihrem Content-Projekt keine Assets hinzufügen, außer einer XML-Datei (game.xml oder so). Lassen Sie jetzt Ihren Level-Editor die Datei game.xml bearbeiten, indem Sie Links zu anderen Dateien hinzufügen. Wenn Sie beispielsweise eine neue Ebene in <level rank=5>Content/MyLevel/level5.xml/>Ihrem Ebeneneditor erstellen, wird das Tag Ihrer XML-Datei hinzugefügt.

Um alles zu erstellen, müssen Sie eine benutzerdefinierte Inhaltspipeline-Erweiterung schreiben. (Stellen Sie sicher, dass Sie den neuen Importer und Prozessor in Ihrer Datei game.xml anstelle des Standard-XML-Prozessors festlegen.)

Dieser Prozessor durchläuft die XML-Dateien und erstellt alle Assets, indem er die entsprechenden Importeure und Prozessoren aufruft. So haben Sie alles gut gebaut und müssen nicht mehr zum Inhaltsprojekt und Ihrem Editor wechseln.

Ressourcen: http://msdn.microsoft.com/en-us/library/bb447754.aspx

Roy T.
quelle