Dateiformat für Mapfiles und andere Spielinhalte
Verfasst: Mi Jan 16, 2013 9:56 pm
Hallo, in einigen anderen Threads hatte ich bereits davon erzählt: ich bastle (hauptsächlich um Neues zu lernen) an einem Framework (mit C++ und SDL) für 2D-Spiele mit isometrischer Darstellung (Diablo 2, Command & Conquer Tiberian Sun usw.).
Dabei brauche ich eine Art Dateiformat für Mapfiles (welche Kachel wo liegt usw.), Tilesets (welche Teile welcher Kacheln sind begehbar usw.) und "Entities". Unter Entities subsummiere ich alles was auf der Karte kreucht und fleucht: Skelette, Panzer, Feuerbälle, und was man sich alles überlegen kann.
Weil es so schön einfach ist einen Parser dafür zu schreiben - und weil die Art Dateien extrem einfach von Hand zu bearbeiten sind - verwende ich bisher INI-Files (wer die nicht mehr kennt: http://de.wikipedia.org/wiki/Initialisi ... tei#Aufbau)
Zum Beispiel folgendes Tileset:
dungeon.ini
Dazu gehört eine Grafik mit mehreren Tiles, die ich anhand der Tilegröße und ihrer Indices (sowie etwas div und modulo ^^) rausschneiden und blitten kann.
Oder auch folgende Mapfile:
demo.ini
Dabei unterscheide ich Boden-Kacheln (floor) und Wand-Kacheln (wall). Und auf Position (4,5) steht ein Skelett, das durch folgende Datei beschrieben wird:
skeleton.ini
Ich will jetzt nicht jedes Detail der Dateien erklären - ist denke ich auch gar nicht notwendig.
Beim Laden einer Entity bekommt der Konstruktor den Dateinamen der Konfiguration, lädt diese erstmal und verpasst den Membervariablen dann den entsprechenden Wert.
Was haltet ihr von dieser Art der Datenhaltung? Sicherlich wird der ein oder andere mir zu XML raten. Wie wird es aber bei den "großen" Spielen (ich denke dabei an die MPQ-Dateien von Diablo2 oder die BIG-Dateien von C&C) gemacht? Soweit ich das überblicke, stecken da ja die Grafiken und Sounds mit drinnen, und sicher auch Konfigurationen
Allein die Struktur der Daten finde ich schon hässlich:
Ich weiß nicht so richtig, ob ich das so lassen sollte oder doch anders aufbaue (nicht nur die Ordnerstruktur ^^)
LG Glocke
Dabei brauche ich eine Art Dateiformat für Mapfiles (welche Kachel wo liegt usw.), Tilesets (welche Teile welcher Kacheln sind begehbar usw.) und "Entities". Unter Entities subsummiere ich alles was auf der Karte kreucht und fleucht: Skelette, Panzer, Feuerbälle, und was man sich alles überlegen kann.
Weil es so schön einfach ist einen Parser dafür zu schreiben - und weil die Art Dateien extrem einfach von Hand zu bearbeiten sind - verwende ich bisher INI-Files (wer die nicht mehr kennt: http://de.wikipedia.org/wiki/Initialisi ... tei#Aufbau)
Zum Beispiel folgendes Tileset:
dungeon.ini
Code: Alles auswählen
[init]
height=128
width=64
rows=5
cols=10
[block]
; row #1
0=0,0,0,0|0,0,0,0|0,0,0,0|0,0,0,0 ; plain
1=0,0,0,0|0,0,0,0|0,0,0,0|0,0,0,0 ; plain
2=1,1,1,1|1,1,1,1|1,1,1,1|1,1,1,0 ; nw wall
3=1,1,1,1|1,1,1,1|1,1,1,1|0,1,1,1 ; ne wall
4=1,0,0,0|1,1,0,0|1,1,0,0|1,0,0,0 ; outer w wall
5=0,0,0,1|0,0,1,1|0,0,1,1|0,0,0,1 ; outer e wall
6=1,1,1,1|0,1,1,0|0,0,0,0|0,0,0,0 ; outer n wall
7=1,1,1,1|1,1,1,1|1,0,0,1|0,0,0,0 ; inner n wall
;8=,,,|,,,|,,,|,,,
;9=,,,|,,,|,,,|,,,
; row #2
;10=,,,|,,,|,,,|,,,
;11=,,,|,,,|,,,|,,,
12=0,0,0,0|1,0,0,0|1,1,0,0|1,1,1,0 ; sw wall
13=0,0,0,0|0,0,0,1|0,0,1,1|0,1,1,1 ; se wall
14=1,1,1,0|1,1,0,0|1,1,0,0|1,1,1,0 ; inner w wall
15=0,1,1,1|0,0,1,1|0,0,1,1|0,1,1,1 ; inner e wall
16=0,0,0,0|1,0,0,1|1,1,1,1|1,1,1,1 ; inner s wall
17=0,0,0,0|0,0,0,0|0,1,1,0|1,1,1,1 ; outer s wall
;=17,,,|,,,|,,,|,,,
;=18,,,|,,,|,,,|,,,
;=19,,,|,,,|,,,|,,,
; row #3
;=20,,,|,,,|,,,|,,,
;=21,,,|,,,|,,,|,,,
;=22,,,|,,,|,,,|,,,
;=23,,,|,,,|,,,|,,,
;=24,,,|,,,|,,,|,,,
;=25,,,|,,,|,,,|,,,
;=26,,,|,,,|,,,|,,,
;=27,,,|,,,|,,,|,,,
;=28,,,|,,,|,,,|,,,
;=29,,,|,,,|,,,|,,,
; row #4
;=30,,,|,,,|,,,|,,,
;=31,,,|,,,|,,,|,,,
;=32,,,|,,,|,,,|,,,
;=33,,,|,,,|,,,|,,,
;=34,,,|,,,|,,,|,,,
;=35,,,|,,,|,,,|,,,
;=36,,,|,,,|,,,|,,,
;=37,,,|,,,|,,,|,,,
;=38,,,|,,,|,,,|,,,
;=39,,,|,,,|,,,|,,,
; row #5
;=40,,,|,,,|,,,|,,,
;=41,,,|,,,|,,,|,,,
;=42,,,|,,,|,,,|,,,
;=43,,,|,,,|,,,|,,,
;=44,,,|,,,|,,,|,,,
;=45,,,|,,,|,,,|,,,
;=46,,,|,,,|,,,|,,,
;=47,,,|,,,|,,,|,,,
;=48,,,|,,,|,,,|,,,
;=49,,,|,,,|,,,|,,,
Oder auch folgende Mapfile:
demo.ini
Code: Alles auswählen
[init]
tileset=dungeon
width=10
height=7
[tiles]
floor=0,0,0,0,0,0,0,0,0,0|0,0,0,0,0,0,0,0,0,0|0,0,0,0,0,0,0,0,0,0|0,0,0,0,0,0,0,0,0,0|0,0,0,0,0,0,0,0,0,0|0,0,0,0,0,0,0,0,0,0|0,0,0,0,0,0,0,0,0,0
wall=,,,,,,,,,|,,,,,,,,,|,,,,,,,,,|,,,,,,,,,|,,,,,,,,,|,,,,,,,,,|,,,,,,,,,
[entities]
4,5=skeleton
skeleton.ini
Code: Alles auswählen
[init]
width=128
height=128
default=stand
gfx=stand,move;,die
sfx=die
[collision]
width=1
height=1
mask=1
[stand]
duration=6
length=4
[move]
duration=3
length=8
speed=13
Beim Laden einer Entity bekommt der Konstruktor den Dateinamen der Konfiguration, lädt diese erstmal und verpasst den Membervariablen dann den entsprechenden Wert.
Was haltet ihr von dieser Art der Datenhaltung? Sicherlich wird der ein oder andere mir zu XML raten. Wie wird es aber bei den "großen" Spielen (ich denke dabei an die MPQ-Dateien von Diablo2 oder die BIG-Dateien von C&C) gemacht? Soweit ich das überblicke, stecken da ja die Grafiken und Sounds mit drinnen, und sicher auch Konfigurationen

Code: Alles auswählen
data\
entity\
skeleton\
config.ini
die.ogg
move.ogg
move.png
stand.png
fireball\
config.ini
die.ogg
move.png
stand.png
map\
demo.ini
foobar.ini
music\
theme.ogg
tiles\
dungeon.ini
dungeon.png
forest.ini
forest.png
widget\
button\
config.ini
frameset.png
checkbox\
config.ini
frameset.png
LG Glocke
