Ich habe gerade ein einfaches RPG-Spiel fertiggestellt, das in C ++ SFML geschrieben wurde, ich habe viel Mühe in das Spiel gesteckt und ich möchte es weitergeben, aber ich bin auf eine kleine Ausgabe gestoßen.
Das Problem ist, dass ich weit über 200 Bilder und Kartendateien (das sind TXT-Dateien, die Kartencodes enthalten) im selben Ordner wie die ausführbare Datei habe. Wenn ich in den Ordner schaue, möchte ich ein wenig weinen So viele Ressourcen, ich habe noch nie ein Spiel gesehen, in dem alle Ressourcen direkt angezeigt werden, stattdessen glaube ich, dass sie die Ressourcen in eine bestimmte Datei packen.
Nun, das ist, was ich versuche zu erreichen: Ich hoffe, alle Bilder in eine Datei zu packen (möglicherweise auch die TXT-Dateien) und dann in der Lage zu sein, diese Datei zu lesen oder einfach zu ergänzen.
quelle
Antworten:
Spielprogrammierer haben sich auf eine von zwei Hauptmethoden der Datenspeicherung verlassen:
Der Nachteil der ersten Lösung ist das Problem der Verschwendung von Speicherplatz sowie das Problem langsamerer Installationen.
Die zweite Lösung bietet ihre eigenen Fallstricke. Erstens müssen Sie Ihr ganzes Bild / Ton / etc. Schreiben. Laden von Routinen, die eine benutzerdefinierte API für den Zugriff auf die archivierten Daten verwenden. Ein weiterer Nachteil ist, dass Sie Ihr eigenes Archivierungsdienstprogramm schreiben müssen, um die Archive überhaupt zu erstellen.
Wenn Sie nicht immer alle Dateien aus dem Archiv laden, ist TAR / GZ möglicherweise keine gute Idee, da Sie bestimmte Dateien nicht bei Bedarf extrahieren können. Aus diesem Grund verwenden viele Spiele ZIP-Archive, mit denen Sie einzelne Dateien nach Bedarf extrahieren können (ein gutes Beispiel ist Quake 3, dessen PK3-Dateien nur ZIP-Dateien mit einer anderen Erweiterung sind).
BEARBEITEN: "Verstecke" die Ordnerstruktur des Spiels und "Behalte" nur die ausführbaren Dateien
EDIT: Gamedev Tuts Plus haben eine schöne Ressource
EDIT: libarchive
Eine mögliche Lösung ist libarchive, eine Archivierungsbibliothek, die das Extrahieren von Dateien aus einem Archiv wie einer ZIP-Datei übernimmt. Sie können die extrahierte Datei sogar einem Standard-FILE-Zeiger zuweisen, wodurch die Anbindung an andere Bibliotheken möglicherweise einfacher wird.
BEARBEITEN: ZIP-Format Dateien mit alternativer Erweiterung
Hier gefällt mir @Joachim Sauers Kommentar
quelle
.tar
z. B.). Dies hängt damit zusammen, wie Daten physisch auf der Festplatte gespeichert werden.Eine andere Lösung, die häufig zum "Verstecken" der Spieledateien verwendet wird, ist die Ordnerstruktur. Behalten Sie nur Ihre ausführbaren Dateien und möglicherweise eine Infodatei im Hauptverzeichnis und verschieben Sie die Spieledateien in einen Unterordner "data". Ich denke nicht, dass es sehr ungewöhnlich ist, dies zu tun. Viele Spiele, die ich kenne, speichern ihren Inhalt so.
quelle
Ich mag PhysFS wirklich dafür. Sie können mit demselben Code auf Ordner oder ZIP-Archive zugreifen. Es funktioniert gut für alle Phasen eines Spiellebens.
aktualisieren:
Ich habe das mit der Quelle gelieferte Tutorial und die Doxygen-Dokumentation verwendet , um PhysFS zu lernen. Die API ist wirklich recht einfach. Sie werden mehr Zeit damit verbringen, das Laden von Bildern in SFML über Speicherpuffer anstatt über den Dateipfad zu erlernen.
quelle
Ich würde vorschlagen, eine ZIP-Datei zu verwenden. Es ist ein allgegenwärtiges Format und es gibt vorgefertigte Bibliotheken, mit denen Sie Dateien aus einer ZIP-Datei laden können. Eine schnelle Google-Suche ergab sogar einen Zip-Loader für sfml .
quelle
Nun, Sie könnten schummeln, wie sie es erwähnt haben :) Sie können aus den Bildern ein Sprite-Sheet erstellen. Es ist heutzutage nicht mehr nötig, es zu zippen, es sei denn, es spart eine Menge Platz. Nachdem Sie ein Sprite-Sheet oder mehrere Sprite-Sheets aus den Bildern erstellt haben, können Sie deren Erweiterungen einfach umbenennen. Die meisten Spieler werden sich nicht die Mühe machen, dies zu überprüfen. Überlassen Sie diese Option den Künstlern, die Ihr Spiel in Zukunft möglicherweise modifizieren möchten. Auf diese Weise können sie auch ein Sprite-Sheet erstellen, dessen Erweiterung umbenennen und loslegen.
Mit den Textdateien würde ich demütig vorschlagen, dass Sie diese Daten in binäre Form konvertieren. Ich bin mir ziemlich sicher, dass Sie einen einfachen Weg finden werden, dies zu tun. Wenn Sie beispielsweise nur AZ, az und 0-9 verwenden, können Sie 6 Bits verwenden, um jedes Zeichen darzustellen, das Ihr urheberrechtlich geschütztes Material in gewisser Weise schützt verhindert auch, dass andere Karten bearbeiten. Sie können jederzeit einen Karten-Konverter hinzufügen, wenn Sie möchten. Das Komprimieren von Texten ist jedoch völlig in Ordnung.
quelle
Es geht nicht nur um die Anzahl der Ressourcen oder den Speicherplatz.
Da Sie SFML verwenden, das mit OpenGL gerendert wird, muss OpenGL bei jedem Rendern einer Textur die nächste Textur an die Grafikkarte binden (überprüfen Sie glBindTexture ()) eine wirklich teure Aufgabe.
In diesem Sinne können Sie erkennen, warum Spiele in der Regel eine Reihe von Sprites in der gleichen Textur platzieren, die so genannten Spritesheets, entsprechend Ihren Menüs / Ebenen / Karten des Spiels.
Das Ergebnis ist ein enormer Leistungszuwachs, da Sie viele Sprites mit demselben Bind-Textur-Aufruf rendern.
quelle
Ich persönlich würde die Route für benutzerdefinierte Binärdateien nach unten gehen. Dies ist etwas, das ich die ganze Zeit selbst mache, es ist nicht so schwierig, wie es sich anhört, und es bietet auch ein Maß an Verschleierung für Ihre Spielressourcendateien. Ich habe vor nicht allzu langer Zeit einen kleinen Einführungsartikel über dieses Spiel geschrieben:
http://gamedev.tutsplus.com/tutorials/implementation/create-custom-binary-file-formats-for-your-games-data/
Sprite-Sheets sind ein völlig anderes Thema, aber sie sind die Norm für die meisten Spiele :)
quelle
Eine andere Methode, die Sie verwenden können:
Die kostenlose Version von XnView bietet eine Funktion namens "
Strip of Images
" (UMSCHALT + A), mit der Sie erstellen könnensprite-collections
.Dies minimiert den Dateizugriff und ist besonders wichtig für Webanwendungen / Spiele, um die Anzahl der zu minimieren
HTTP-roundtrips
.Der Zugriff auf einzelne Bilder erfolgt dann über Koordinatenkarten (z. B. CSS-Definitionen).
quelle
Zuerst müssen Sie Ihr ganzes eigenes Bild / Ton / etc. schreiben. Laden von Routinen, die eine benutzerdefinierte API für den Zugriff auf die archivierten Daten verwenden. Ein weiterer Nachteil ist, dass Sie Ihr eigenes Archivierungsdienstprogramm schreiben müssen, um die Archive überhaupt zu erstellen. Wenn Sie nicht immer alle Dateien aus dem Archiv laden, ist TAR / GZ möglicherweise keine gute Idee, da Sie bestimmte Dateien nicht bei Bedarf extrahieren können. Aus diesem Grund verwenden viele Spiele ZIP-Archive, mit denen Sie einzelne Dateien nach Bedarf extrahieren können (ein gutes Beispiel ist Quake 3, dessen PK3-Dateien nur ZIP-Dateien mit einer anderen Erweiterung sind). http://zpp-library.sourceforge.net/
quelle