Wie kann ich eine stark typisierte Struktur für den Zugriff auf Dateien in einem XNA Content Project erstellen?

8

Präambel:
Ich arbeite mit einem XNA-Content-Projekt, um all die verschiedenen Texturen (und möglicherweise andere Ressourcen) zu speichern, die ich im Rahmen der Entwicklung eines Spiels verwende.

Die Standardmethode zum Laden von Bildern aus dem Content-Projekt in ein XNA-Texturobjekt umfasst die Verwendung von fest codierten Zeichenfolgenliteralen, die auf die verschiedenen Dateien verweisen.

Ich möchte die Projektion der Verzeichnis- / Dateistruktur innerhalb des Inhaltsprojekts in eine Objekthierarchie automatisieren, um zu vermeiden, dass Zeichenkettenliterale direkt verwendet werden, und die Vorteile der Verwendung stark typisierter Objekte zu nutzen.


Beispiel:
Anstatt die Verwendung von Texture2D tex = Content.Load("Textures/defaultTexture32");
zu verwenden Ich würde viel lieber Texture2D tex = Content.Load(Content.Textures.defaultTexture32);

bevorzugen


Frage:
Gibt es eine bereits bestehende Lösung für dieses Problem? (Ich konnte mit Google nichts finden)


Zusätzliche Details:
Ich bin ziemlich sicher, dass dies durch eine T4-Vorlage getan werden kann; wahrscheinlich in Verbindung mit den DTE-Tools. Ich habe einen ersten Versuch unternommen, dies zu tun, aber aufgrund meiner Unerfahrenheit mit beiden Tool-Sets stoße ich immer wieder auf Blöcke, aber ich habe in der Vergangenheit mit T4MVC gearbeitet, die etwas ähnliches tut; Leider projiziert es Klassenstruktur und nicht das Dateisystem und ist nicht leicht anzupassen.

Ich brauche keine Lösung, um T4 oder DTE zu verwenden, sie scheinen einfach Teil einer Lösung zu sein.

Nur die Dateien, die Teil des VS-Projekts sind (und nicht das gesamte Dateisystem auf der Festplatte), wären vorzuziehen, aber nicht notwendig.

Die Möglichkeit, zusätzlich nach Dateitypen usw. zu filtern, wäre ein besonderer Bonus.

Für jeden, der nicht sofort die Vorteile sieht, dies zu tun; Überlegen Sie, was passieren würde, wenn Sie die Datei umbenennen oder löschen würden. Die Anwendung würde weiterhin gut kompilieren, aber es würde zur Laufzeit abstürzen. Vielleicht erst, wenn eine ganz bestimmte Reihe von Umständen für den Zugriff auf eine bestimmte Datei erfüllt ist. Wenn alle Dateinamen in eine Objektstruktur projiziert werden (die jedes Mal neu generiert wird, wenn Sie das Projekt erstellen, oder vielleicht sogar jedes Mal, wenn Sie Änderungen vornehmen), erhalten Sie Kompilierungsfehler, die auf die fehlenden Ressourcen hinweisen und möglicherweise viel Zukunft vermeiden Schmerz.

Danke für Ihre Zeit.

    
Mir 14.08.2011, 18:13
quelle

3 Antworten

2

Hier ist eine T4-Vorlage, die alle Dateien in einem "Textures" -Ordner aus Ihrem Projekt-Verzeichnis liest. Dann werden sie in eine Klasse als Strings geschrieben, Sie können Directory.GetFiles () einfach ändern, wenn Sie die Dateisuche einschränken möchten.

Nach dem Hinzufügen / Entfernen von Dateien können Sie im Projektmappen-Explorer auf "Alle Vorlagen transformieren" klicken, um eine neue Klasse zu generieren.

Hoffe, das hilft!

%Vor%     
Ronny Karlsson 15.08.2011, 08:08
quelle
2

Ich habe eine kompliziertere T4-Vorlage erstellt, die DTE verwendet, um das VS-Projekt zu durchsuchen.

Ich lasse Ronny Karlssons Antwort als die akzeptierte Antwort markiert, da er mir half, mit seiner einfacheren Lösung zu diesem Punkt zu kommen, aber ich wollte es jedem zugänglich machen, der es nützlich finden könnte.

Bevor Sie diesen Code selbst verwenden, denken Sie bitte daran, dass ich neu bei T4 und DTE bin, also verwenden Sie ihn mit Vorsicht, und obwohl es für mich gut zu funktionieren scheint, kann Ihre Laufleistung variieren.

Diese Vorlage erstellt verschachtelte Namespaces für das Projekt und alle darin enthaltenen Ordner. Innerhalb dieser Namespaces wird eine Klasse für jede Datei erstellt. Die Klassen enthalten eine Reihe von Zeichenfolgen für nützliche Dinge über die Datei.

Beachten Sie auch die beiden Variablen im oberen Bereich ... Sie definieren, für welches Projekt Objekte gescannt und erstellt werden sollen, und die zweite, List<string> AcceptableFileExtensions , wie erwartet, und gibt an, welche Dateierweiterungen beim Erstellen von Objekten berücksichtigt werden sollen. Zum Beispiel möchten Sie möglicherweise keine .cs oder .txt usw. Dateien enthalten. Oder du vielleicht. Passen Sie gegebenenfalls an. Ich habe im Moment nur Png aufgenommen, da das alles ist, was ich gerade brauche.

%Vor%     
Mir 19.08.2011 18:42
quelle
1

Ich habe noch nie so etwas gesehen. Die Art, wie ich es tun würde wäre, eine separate c # -Konsolen-App zu erstellen, die entweder den Inhaltsordner oder das Content-Projekt-XML durchsucht und den gewünschten c # -Code in eine Datei schreibt, die in Ihrem Projekt enthalten ist. Sie können das dann als Pre-Build-Schritt ausführen (oder manuell jedes Mal, wenn Sie Inhalt hinzufügen). Ich kenne T4 oder DTE nicht, daher kann ich diese Optionen nicht kommentieren.

Beachten Sie, dass das Scannen des Inhaltsprojekt-XML seine Nachteile hat. Sie können den Typ des Inhaltselements (oder zumindest des zugewiesenen Inhaltsimportierers / Prozessors) extrahieren, aber möglicherweise werden nicht alle Inhalte erfasst. Zum Beispiel enthalten 3D-Modelle automatisch die referenzierten Texturen, sodass diese im Content-Projekt nicht aufgelistet werden. Dies kann in Ordnung sein, da Sie wahrscheinlich nicht direkt darauf verweisen möchten.

    
Aranda 15.08.2011 01:01
quelle

Tags und Links