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

Faule Socke

Community-Fossil

  • »Faule Socke« ist der Autor dieses Themas

Beiträge: 1 915

Wohnort: Schreibtischstuhl

  • Private Nachricht senden

1

23.09.2007, 17:19

Suche ein Dateiformat für mein Spiel

Ich arbeite zur Zeit an einem Spiel in dem es sehr viele klassen gibt(Für schiffe, antriebe waffen etc).
Die inhalte der meisten Klassen werden aus Dateien geladen, oder dort hinein geschrieben.

Nun gibt es ja 2 möglichkeiten wie ich das machen kann:
1) Binärformate:
Einfach die Adresse der Klasse(korrekt david? :D) zu nem char* casten und in die Datei schreiben.

Vorteile:
:arrow: Geringe Dateigröße.
:arrow: Einfach zu lesen und zu schreiben.

Nachteile:
:arrow: Es gibt Kompatibitätsprobleme bei den CPUs.
:arrow: Nicht mit Klassen wie zb. std::string kompatibel.
:arrow: Bei Zeigern wird einfach die Zieladresse in die Datei geschreiben.


2) Textformate:
Entweder man entwikelt ein eigenes, oder nimmt zum Beispiel XML.
Ich habe mich vorläufig für XML entschieden, das ist aber keine gute lösung.

Vorteile:
:arrow: Jede CPU kommt damit klar.
:arrow: Das Format lässt sich einfach erweitern.(Vorgängerversionen werden meistens trotzdem noch gelesen).

Nachteile:
:arrow: Man braucht extra einen Parser zum lesen und schreiben und diese sind manchmal sehr kompliziert zu bedinen.
:arrow: Die Datei wird gleich wesentlich größer, auch wenn die Klasse nur wenige Member hat.
:arrow: Der Benutzer kann die Daten mit einem Texteditor einfach verändern.
:arrow: (Gilt nur für TinyXML) Der Parser ist unnötig kompliziert zu bedinen(beim schreiben jedenfalls).


Nun dann gibt es noch eine dritte möglichkeit, nämlich Datenbanken.
Darüber kenne ich aber weder nach- noch vorteile, noch weiss ich, wie man sowas benutzt(ausser im php).

Ich will mal kurz zusammenfassen, welche vor- und nachteile mir wichtig sind, und welche eher nebensächlich:
Wichtig
:arrow: Einfach zu lesen und zu schreiben
:arrow: Keine kompatiblitätsprobleme bei den CPUs
:arrow: Sollte kompatibel mit klassen wie std:.string sein, und auch mit zeigern
:arrow: Erweiterungsfähig(dazu sag ich gleich noch was)
:arrow: Der Benutzer soll die daten nicht ohne weiteres verändern können
:arrow: Der parser(falls denn einer erforderlich ist) sollte einfach zu bedienen sein.

Nebensächlich
:arrow: Dateigröße

Fragen
1) Wie kann ich nun ein solches Dateiformat entwikeln, oder ein vorhandenes benutzen, welches meine zwecke erfüllt?
2) Kennt jemand gute tutorials, anleitungen, bücher etc, die dieses thema zu genüge behandlen?
3) Sind Datenbanken sinnvoll und welche nutze ich am besten und wie?

Zur erweiterungsfähigkeit des formats:
Das spiel wird niemals fertig sein, da ich es ständig erweitern werde.
Jeder kann vorschläge machen, was rein soll, aber bitte erst nach der ersten version ;-)


PS: Wenn sich der thread interessant entwikelt, könnte man ihn doch in die FAQ aufnehmen oder was meinen die Mods?


Socke

DasBlub

Alter Hase

Beiträge: 802

Wohnort: Schweiz

Beruf: Programmierer

  • Private Nachricht senden

2

23.09.2007, 17:24

hast du es schon mal mit .ini dateien probiert? die sind praktisch und einfach erweiterbar. (in david's buch 3D-Spieleprogrammierung, im Kapitel 8.3.3 "Laden aus der INI-Datei" ist das sehr gut beschrieben).

Faule Socke

Community-Fossil

  • »Faule Socke« ist der Autor dieses Themas

Beiträge: 1 915

Wohnort: Schreibtischstuhl

  • Private Nachricht senden

3

23.09.2007, 17:33

Das ist nicht dein ernst oder?
Wenn XML schon nicht ausreicht, werden es INI-Dateien erst recht net tun.
Hätte ich aber vllt sagen sollen, naja also INI-Dateien gehen nicht!
Ja ich hab das in davids buch dazu gelesen ich hab sogar schonmal nen eigenen parser geschrieben der sogar ini-datien schreiben kann.

Also INI-Dateien gehen net.

Socke

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

4

23.09.2007, 17:35

Die erste Idee kannst du schonmal stecken. Die Nachteile hast du ja bereits selbst erkannt.
Für was genau soll denn das Format sein? Leveldaten, Resourcen, Archive, Savegame, etcpp? Gib mal genauere Infos.
Grundlegend könntest du ja für jedes Objekt die Operatoren << und >> überschreiben für eine einfache Serialisierung.
@D13_Dreinig

DasBlub

Alter Hase

Beiträge: 802

Wohnort: Schweiz

Beruf: Programmierer

  • Private Nachricht senden

5

23.09.2007, 17:37

ich versteh nicht ganz, warum es für dich nicht ausreichen sollte. was musst du denn für daten speichern? für strings, vektoren, zahlen (int, float, double), farben, etc. reicht eine ini datei längst...

Faule Socke

Community-Fossil

  • »Faule Socke« ist der Autor dieses Themas

Beiträge: 1 915

Wohnort: Schreibtischstuhl

  • Private Nachricht senden

6

23.09.2007, 17:59

Nun angenommen ich muss einen schiffstyp laden:
Dieser Schiffstyp kann nun viele ähnliche daten haben(zb wo man waffen anbringen kann etc). Dass muss alles gespeichert werden udn später wieder korrekt geladen. XML wäre theoretisch möglich(einfach immer neue elemente rein machen die dann einen solchen "waffensockel" beschreiben) aber das kann ja jeder noob und so mancher dau einfach verändern(ich mag cheaten net).

Bei INI-Dateien ist es das gleiche man kann sie zu leicht verändern. ausserdem wird es schwer wenn das schiff mehr als eine waffe haben kann(die positionen werden gespeichert), denn ich kann ja nicht zwei schlüsseln den gleichen name geben.
Ihc hoffe es ist jetzt etwas klarer, was ich will.

Natürlich muss ich dann auch Savegames speichern und hier wirds erst so richtig lustig. da muss ich nämlich dann tausende schiffe, stationen, waffen etc speichern(Spätestens hier scheidet XML aus, obwohl es mit viel aufwand noch möglich ist).

Socke

7

23.09.2007, 18:48

Wieso scheidet da XML aus? Ließ dich dazu bitte einmal ein: Game Programming Gems 4 :: Using XML without lose of performance oder so ähnlich.
Eine Datenbank kann im einfachsten Sinne eine XML-Datei sein. Ein Programm dazwischen sacht dann wie es die Daten zu behandeln hat bzw. antwortet auf deine Querrys ...
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

SirForce

Alter Hase

Beiträge: 802

Wohnort: Süddeutschland

  • Private Nachricht senden

8

23.09.2007, 18:51

Also, deine Erklärung, warum du XML nicht für deine SchiffKlassen nimmst, finde ich doch etwas albern. Warum nicht einfach den Weg des geringsten Wiederstands gehen. Mal davon abgesehen dass das nicht jeder "Noob" kann, wäre es doch nur relevant, einen häcksicheres Spiel zu entwickeln, wenn es nicht nur ein Hobbyprojekt ist. Mit den INI-Dateien leuchtet mir ja noch ein.
Nichts behindert so sehr die Entwicklung der Intelligenz wie ihre vollständige Abwesenheit.

Michail Genin

Faule Socke

Community-Fossil

  • »Faule Socke« ist der Autor dieses Themas

Beiträge: 1 915

Wohnort: Schreibtischstuhl

  • Private Nachricht senden

9

23.09.2007, 19:19

wie machen die "großen" das denn?

Socke

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

10

23.09.2007, 21:02

Noch ne Anmerkung zum Binärformat: Das begrenzt sich nicht darauf, ganze Klassen mit sizeof(class) einfach platt in ne Datei zu kopieren, man darf durchaus auch binär die Member einer Klasse Stück für Stück einlesen und auslesen (David_pb hatte da auch schon die << >> operatoren erwähnt)

Also der einzige Grund, von Binärformaten abzusehen wäre für mich die Lesbarkeit und Möglichkeit zum manuellen editieren - das willst du ja anscheinend sowieso nicht, damit sollte binäre Speicherung eigentlich recht gut passen (ist auch das kleinste, solange man nicht grad mit Komprimierung schummelt^^)

Werbeanzeige