Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

NyNooNyrox

Frischling

  • »NyNooNyrox« ist der Autor dieses Themas

Beiträge: 38

Wohnort: Gänserndorf

Beruf: Mechatroniker

  • Private Nachricht senden

1

10.04.2015, 22:47

C# XNA ResourceManagement

Hallo Community,

Ich habe derzeit ein kleines Problem welches das Laden von Texturen und Einstellungen betrifft.
Texturen laden selbst ist absolut kein Problem jedoch durch die Skinning-Funktion welche das Spiel beinhalten soll erschwert sich die Lage doch etwas mehr.

Bevor ich nun genauer eingehe möchte ich etwas den Aufbau erklären:
In vielen Spielen ist es so, dass man meist ein "ganzes Paket" skinnt. Das heißt das ganze Layout wird durch einen Ordner mit vielen Texturen geändert. Mein Ansatz ist jedoch einen Skin Folder zu erstellen in dem sich mehrere ".dy"-Dateien befinden. Diese ".dy"-Dateien erhalten sämtliche Informationen über die Textur (Animated, Größe, ..) und die eigentliche Textur.

In den Optionen kann man nun simple zB in die Spalte "Cursor" klicken und sämtliche ".dy"-Dateien welche als Cursor aufgelistet sind auswählen. Sollte kein Skin vorhanden sein wird automatisch aus dem Content die Standard-Textur gewählt.

Derzeit ist es so, dass ich eine eingebettete XML-Datei mit einer foreach-Schleife auslese und anhand dieser weiß welche Texturen mein Spiel benötigt. Zuerst werden die Basis-Texturen geladen und anschließend die Skin-Texturen (was ich jedoch so vermeiden möchte).

Nun zu meinen Problem:
Ich möchte sozusagen wenn es einen Skin für eine Textur gibt nicht zuerst die Standard-Textur zuwei'ß'en und anschließend die Skin-Textur sondern direkt die Skin-Textur.
Das ganze klingt nun recht simple ist es jedoch nicht.

Von meinen derzeitige Aufbau muss ich zuerst die eingebettete XML-Datei durchlaufen um zu Wissen welche Texturen es gibt und ob sie Skinbar sind. Wenn sie Skinbar sind muss ich die Skin XML-Datei öffnen und den Dateipfad der ".dy"-Datei auslesen. Zum Schluss muss ich die ".dy"-Datei deserialisieren und speichern. Sollte jedoch ein Fehler auftreten (Datei existiert nicht, ist beschädigt, what ever) dann muss ich wieder zurück und die Standard-Textur laden was wiederum zusätzliche Ladezeit kostet.

Das selbe ist recht ähnlich zur Einstellungsdatei jedoch ist das Texturen-Problem bei weitem fortgeschrittener.

Ich möchte hiermit Fragen ob jemand einen Ansatz hätte dies zu bewerkstelligen.

Mit freundlichen Grüßen
Markus Ö.

Meine Aussagen mögen Sarkasmus und andere nicht wirklich ernst zunehmende Dinge beinhalten.
Aus diesem Grund übernehme ich keine Haftung wenn der Elefant aus der Kühltruhe fliegt.

NyNooNyrox

Frischling

  • »NyNooNyrox« ist der Autor dieses Themas

Beiträge: 38

Wohnort: Gänserndorf

Beruf: Mechatroniker

  • Private Nachricht senden

2

16.04.2015, 15:16

Hallo,

Anscheinend habe ich meine Frage doch etwas zu komplex gestellt und möchte Sie etwas abändern anhand eines generellen Beispieles.

Angenommen wir beginnen nun ein Spiel zu programmieren. Zu einem Spiel gehören natürlichen sämtliche Texturen. Angenommen unser Spiel benötigt 100 verschiedene Texturen.
Nun wäre es natürlich schwachsinnig jede Textur einzeln wie in einer langen Liste aufzurufen. zB:

Quellcode

1
this.Logo = LoadTexture(...); this.Background = LoadTexture(...); this.Cursor = LoadTexture(...);



Hier kommen nun meine Probleme ins Spiel. Wie oben geschrieben den Code zu schreiben ist nicht wirklich schön. Wie würdet Ihr mehrere Texturen in euer Spiel laden?
Derzeit benutze ich hierfür eine XML-Datei jedoch möchte ich weitere Vorschläge.

Als 2. Punkt spreche ich das Skinning-System an, wodurch der User selbst entscheiden kann welche Textur welchen Element haben soll.
Auch hier würden mich eure Ansätze für eine akzeptable Lösung sehr interessieren.

Zu meinen derzeitigen Aufbau: Ich lese anhand einer XML-Datei sämtliche Texturen aus welche das Spiel benötigt. Somit weiß ich nun ok ich brauche einen Cursor und weiß unter welchen Namen ich die Textur finden und anschließend laden kann. Nun sind alle Basis-Texturen geladen nun geht es zu den Skin-Texturen. Hierzu öffne ich eine XML-Datei welche sämtliche Daten zum laden der Skin-Texturen beinhaltet. Man mag sich das laden der Skin-Elemente etwa so vorstellen: Ließt Texture1-Daten aus, Öffnet die ".dy"-Datei und ließt daraus die Textur inkl zusätzliche Daten und speichert diese Anstelle der Basis-Textur welche am Anfang eingelesen wurde.

Und nochmals zum Abschluss: Es ist mir eure Meinung sehr wichtig wie Ihr es machen würdet. Ob es jetzt rein nur um Basis-Texturen oder Skin-Texturen geht ist egal, jeder Hilfe ist gerne gesehen. :)

Mit freundlichen Grüßen
Markus Ö.

Meine Aussagen mögen Sarkasmus und andere nicht wirklich ernst zunehmende Dinge beinhalten.
Aus diesem Grund übernehme ich keine Haftung wenn der Elefant aus der Kühltruhe fliegt.

3

16.04.2015, 20:38

Du kannst deine Textures textur_1.png, texture_2.png... nennen und dann automatisch laden. Für skinst machst du das gleiche: skin_1_arm.png, skin_1_legs.png, skin_1_body.png....
Ich speichere zurzeit alle Texturen in einem einzigen Bild, und in einer separaten Datei stehen die Koordinaten der entsprechenden Textur. In Zeile 1 die Koordinaten für Texture 1 usw.

H5::

Treue Seele

Beiträge: 368

Wohnort: Kiel

  • Private Nachricht senden

4

17.04.2015, 01:00

Du hast doch ganz offensichtlich eine Priorität, Skin vor Basis-Textur.

Du lädst deine z.B. base.xml und deine skin.xml ein, erzeugst eine Tabelle mit den zu ladenden Texturen. Zuerst versuchst du die mit der Höchsten Priorität zu laden (Skin) schlägt dies fehl, ist nicht erlaubt oder ist erst gar keine Textur definiert fällst du auf die Basistextur zurück und lädst diese.

Nun könntest du noch weiter zurück fallen und eine Fehlertextur laden (z.B. Magenta Farben) oder was auch immer.
:love: := Go;

NyNooNyrox

Frischling

  • »NyNooNyrox« ist der Autor dieses Themas

Beiträge: 38

Wohnort: Gänserndorf

Beruf: Mechatroniker

  • Private Nachricht senden

5

17.04.2015, 01:15

Danke

Hallo,

Zu Roflo: Erst einmal danke für deine Antwort. Ich denke jedoch du hast die Funktionsweiße nicht so ganz verstanden. Die Basis-Texturen befinden sich im Programm als eingebettete Resource (Content) und die Skin-Texturen extern in Skin-Folder. Jedoch danke für deine Rückmeldung!

Zu H5:: Deinen Ansatz habe ich noch gar nicht so durchdacht und hört sich doch sehr gut an. :) Bezüglich Fehler-Textur: Die Bbasis-Textur (wie oben erwähnt) ist eine eingebettete Resource, daher wäre nur durch manipulation der Datei es möglich diese zu löschen/verändern. Wenn dadurch ein Fehler auftritt ist dies ja jedoch nicht mein Problem? :D Jedenfalls danke für dein Feedback und werde deinen Vorschlag einmal etwas genauer ansehen. :)

Für weitere Hilfestellungen bzw wie Ihr eure Basis-Texturen / Skin-Texturen ladet stehe ich jederzeit offen. :)

Mit freundlichen Grüßen
Markus Ö.

Meine Aussagen mögen Sarkasmus und andere nicht wirklich ernst zunehmende Dinge beinhalten.
Aus diesem Grund übernehme ich keine Haftung wenn der Elefant aus der Kühltruhe fliegt.

Werbeanzeige

Ähnliche Themen