Programmgesteuertes Laden von Schriftarten, Texturen und Medien in XNA

7

Bisher habe ich in meinem Rhythmus-Spiel die Content-Pipeline von XNA zum Laden statischer Ressourcen in meine App (Videos, Soundeffekte usw.) verwendet. Später möchte ich den Benutzern jedoch erlauben, ihre eigenen Themen zu erstellen und benutzerdefinierte Notizdiagramme für die Songs zu erstellen, die sie spielen möchten. Gibt es eine Möglichkeit, beispielsweise ein Texture2D- oder Video-Objekt von der Festplatte zu laden, ohne die Inhaltspipeline zu verwenden, wenn ein Dateipfad zur Ressource angegeben wird?

BEARBEITEN : Obwohl dies XNA ist, ziele ich nur auf Windows ab (keine Zune, WP7 oder Xbox 360).

ThatsGobbles
quelle

Antworten:

4

Verwenden Sie die Texture2D.FromFileMethode; Geben Sie für den ersten Parameter Ihre GraphicsDeviceEigenschaft an, die eine Eigenschaft der GameKlasse ist (verwenden Sie also innerhalb einer Methode der Game-Klasse einfach this.GraphicsDevice).

Leider Texture2Dkönnen auf diese Weise nur Objekte geladen werden. Ein VideoObjekt ist nicht so einfach zu laden .

Ricket
quelle
Verdammt, das Laden von Audio und Video zur Laufzeit wird in meiner App später von entscheidender Bedeutung sein. Das sind also schlechte Nachrichten.
ThatsGobbles
1
Nicht alle Hoffnung ist verloren! Schauen Sie sich die zweite Antwort auf die verknüpfte Frage an. Sieht so aus, als könnten Sie mit XNA 3.1 zur Laufzeit ein Video oder Audio kompilieren und ausführen. stackoverflow.com/questions/1949264/…
Ricket
@Ricket Ja, ich kann Benutzer nicht dazu zwingen, GS herunterzuladen, nur um diese kompilieren zu können, also stecke ich immer noch fest. Ich versuche, in den DirectShow VideoPlayer zu schauen, aber er ist alt und pingelig.
ThatsGobbles
Aber ... sie müssen XNA installiert haben, egal ob 3.1 oder 2.0, oder? Was ist der Unterschied?
Ricket
Die XNA-Laufzeit wird immer benötigt, ja (wenn ich mich richtig erinnere). Für diese MSBuild-Methode muss jedoch das gesamte Game Studio auf den Computer des Benutzers heruntergeladen werden (und GS 4.0 hat eine ISO von etwa 400 MB).
ThatsGobbles
3

Es ist durchaus möglich, den Inhaltserstellungsprozess zur Laufzeit mit MSBuild auszuführen. Das folgende Beispiel zeigt Ihnen im Grunde, wie es geht: http://creators.xna.com/en-GB/sample/winforms_series2 . In diesem Beispiel werden Windows-Formulare verwendet, aber nichts hindert Sie daran, dasselbe in einem tatsächlichen Spiel zu tun.

Das große Problem besteht darin, dass die Content-Pipeline-Assembly (in der sich alle zum Erstellen erforderlichen Prozessoren / Importeure / Build-Aufgaben befinden) nicht in der weiterverteilbaren XNA Framework-Version enthalten ist. Dies bedeutet, dass Ihre Benutzer zum Erstellen und / oder Laden von benutzerdefinierten Inhalten die Version von XNA Game Studio installieren müssen, mit der Ihr Spiel erstellt wurde. Sie müssten niemals die darin enthaltene Software verwenden, aber sie müssten sie installieren. Abhängig von Ihrem Spiel und davon, von wem Sie erwarten, dass er benutzerdefinierte Inhalte erstellt und verwendet, kann dies akzeptabel sein oder auch nicht.

mikthom
quelle
Wenn XNA GS nur nicht auf dem Computer des Benutzers installiert werden müsste, wäre dies perfekt gewesen.
ThatsGobbles
Es ist sicherlich unglücklich. Ich erinnere mich, dass ich vor einiger Zeit (Jahren) Rumpelgeräusche über das XNA-Team gesehen habe, das das Content-Pipeline-Zeug in die Redist aufnehmen wollte, aber es ist in den letzten Versionen nicht passiert und es scheint unwahrscheinlich, dass es bald passieren wird, da sie sich derzeit auf Nicht-Inhalte konzentrieren. PC-Plattformen, auf denen die Pipeline sowieso nicht läuft.
Mikthom
Sinnvoll, obwohl ja, es ist ein bisschen scheiße für XNA-Spiele nur für PCs.
ThatsGobbles
1

Einige der Inhaltsprozessoren stellen Klassen bereit, die einen Großteil des schweren Hebens ausführen, z. B. einen Stream aufnehmen und ein Zwischenobjekt erzeugen (wie die Daten, die zum Erstellen eines Netzes erforderlich sind, jedoch kein tatsächliches Netzobjekt). Möglicherweise können Sie eine zusätzliche Verarbeitung durchführen, um das Zwischenobjekt in das endgültige Objekt umzuwandeln, das Sie verwenden möchten. Einige dieser Klassen spucken möglicherweise sogar das endgültige Objekt für Sie aus. Es variiert je nach Art des Inhalts. Ich schlage vor, die Inhaltsprozessoren nach den relevanten Inhaltstypen zu durchsuchen und festzustellen, ob nützliche Informationen verfügbar sind. Möglicherweise müssen Sie einige Teile selbst neu schreiben (Reflector ist Ihr Freund), aber es könnte sich lohnen, wenn Sie wirklich keine "vorkompilierten" Assets verwenden möchten.

Mike Strobel
quelle
Haben Sie Empfehlungen und / oder Links zu Beispielen? Es scheint, als ob der einzige Medientyp, den ich jetzt nicht importieren kann, Video ist, und IIRC ist einer der beiden, der manuell nicht geladen werden kann.
ThatsGobbles