In-Game Level Design mit XNA?

10

Ich wundere mich über das Design im Spiel. Meine aktuelle Situation dreht sich um Kacheln - ich habe viele verschiedene Ebenen mit unterschiedlichen Objekttypen (für alle, die mit Kacheln nicht vertraut sind, ist ein Objekt nichts anderes als eine Koordinate mit beliebigen Eigenschaften).

Ich kompiliere das Spiel derzeit jedes Mal neu, wenn ich eine kleine Änderung an meiner Kartendatei vornehme, um festzustellen, ob alles richtig positioniert ist. Gibt es eine Möglichkeit für mich, dass mein Spiel das Level automatisch neu lädt, wenn eine Änderung der Kartendatei festgestellt wird? Erlaubt XNA dies überhaupt oder erlaubt die Funktionsweise der Inhaltspipeline keinen dynamischen Inhalt auf diese Weise? Alle Tipps oder Vorschläge sind absolut willkommen.

Christopher Horenstein
quelle

Antworten:

8

Ich gehe davon aus, dass Ihre Kartendateien über die Inhaltspipeline verarbeitet und dann zur Laufzeit mit Content.Load geladen werden. Sie haben zwei Möglichkeiten:

  • Speichern Sie Ihre Karten als XML-Datei über IntermediateSerializer.Serialize. Zur Laufzeit können Sie sie dann mit IntermediateSerializer.Deserialize lesen, um die Änderungen anzuzeigen.
  • Dies ist schwieriger: Rufen Sie MSBuild zur Laufzeit auf, um Ihre Dateien in die richtigen XNBs zu kompilieren, und laden Sie sie mit dem ContentManager neu. Dieses Beispiel macht das.
r2d2rigo
quelle
Ich bin mir sicher, dass ich zwischen den beiden etwas regeln kann. Vielen Dank!
Christopher Horenstein
2

Sie können auch Karvonite verwenden, wenn Sie dies schnell erledigen möchten.

Es ist ein agiles Persistenz-Framework. Ich bin nicht sicher, ob die neue Version unter Windows Phone 7 oder Xbox funktioniert.

Sie würden eine Persistenzdefinition mit ihrem Persistenzeditor erstellen (es ist ziemlich einfach, Sie importieren einfach die Assembly und überprüfen die Felder / Eigenschaften der Klassen / Strukturen, die beibehalten werden sollen). Sie initiieren einen ObjectSpace im Code und fügen Objekte hinzu / entfernen / holen sie ab . (Diese Objekte bleiben bestehen)

Wenn Sie eine Abstraktion erstellen könnten, damit die Kachel-Engine oder wie auch immer Sie sie nennen, es nicht genau interessiert, wie sie die Karte erhält, sondern nur, dass sie die gewünschte erhält. Dann können Sie zurückgehen und den XmlSerializer oder den Intermediate verwenden. (je nachdem, was Sie bevorzugen) Alles, was Sie tun müssen, um diese anderen Serializer zu implementieren, ist eine weitere Implementierung der Abstraktion zu erstellen (eine Schnittstelle oder eine abstrakte Klasse).

Ich denke, es gibt ein Beispiel dafür, wie Inhalte zur Laufzeit auf der Club-Website des XNA-Erstellers erstellt werden. Es wird jedoch möglicherweise nicht mit dem neuesten Framework erstellt. Auf diese Weise können Sie Ihren alten Code behalten, wenn Sie bereits die Inhaltspipeline verwenden. Hier ist der Link: Winform Series 2: Laden von Inhalten

Michael Coleman
quelle
Ich fühle mich ein bisschen albern, wenn ich das frage, aber können Sie beschreiben, wie Sie sich den Workflow mit diesem Framework vorstellen? Es klingt wirklich ordentlich, aber ich bin mir nicht sicher, wie ich es angehen soll.
Christopher Horenstein
1
Nun, Sie definieren die Serialisierung in ihrem Persistenz-Editor. (Es ist ganz einfach, Sie importieren einfach Ihre Objektassembly und aktivieren einige Kontrollkästchen für die Strukturen / Klassen und die Felder / Eigenschaften, die beibehalten werden sollen.) Anschließend können Sie einfach einen Objektbereich initialisieren, der Ihre Objekte serialisiert / deserialisiert . Es ist ziemlich ordentlich und schnell, um loszulegen.
Michael Coleman
1
Sie können sich dieses Projekt auch auf Codeplex ansehen, um ein besseres Beispiel für das Erstellen von Inhalten außerhalb von Visual Studio zu erhalten. ( xnadevru.codeplex.com/… )
Michael Coleman