Seite 1 von 2
TileMap Speichern 2,5 mb?
Verfasst: 01.01.2007 19:54
von Artus
So leute ich Progge gerade ein ActionRPG naja ich versuche es, da ich bis jetzt noch nie ein game fertig gemacht habe steht das wohl auch noch in den sternen^^
Aber nun zu meinem Problem also, ich ahbe eine structur für ein Tile meiner Gekachelten Karte:
Structure MAP_TILE
Spirited.b ;// Animiert: Ja = #True / Nein = #False
Sprite.l[4] ;// Bild des Feldes
Type.b ;// Art des Fldes
Blocked.b ;// Blockiert: Ja = #True / Nein = #False
EndStructure
mein problem is nun eine Karte mit 200x200 is 2,5 MB groß
hättet ihr vorschläge wie man das optimieren kann?
oder we ihr das machen würden, ich mein ich lass es zur not aber mich interessiert mal wie ihr das macht.
PS: kann jemand gut zeichnen ^^ brauche Sprites, die sind von Zelda und nur zu Testzwecken

und die sprites sind nur auf 64x64 gezoomt^^

Re: TileMap Speichern 2,5 mb?
Verfasst: 01.01.2007 20:00
von DarkDragon
Artus hat geschrieben:mein problem is nun eine Karte mit 200x200 is 2,5 MB groß
hättet ihr vorschläge wie man das optimieren kann?
Wie wärs mit den Packerroutinen von PB?
Verfasst: 01.01.2007 20:06
von Artus
mhh ich wollt erst mal so kleiner haben kommt später eh alles in pack files
Verfasst: 01.01.2007 20:23
von Kaeru Gaman
hast du 4 layer?
weil du in deiner struct vier longs für die spritenummern drin hast...
je nachdem, wie viele sprites du insgesamt hast,
brauchst du auch keine longs für die spritenummer...
wieviel verschiedene zustände hat "art des feldes"? genügen 64?
und für einfache true/false-flags benötigst du nur ein bit...
damit könntest du schon mal folgendermaßen begrenzen:
Code: Alles auswählen
Structure MAP_TILE
Status.b
Sprite.b[4] ;// Bild des Feldes
EndStructure
Spirited = Tile\Status & 128 ; 0 or 128
Blocked = Tile\Status & 64 ; 0 or 64
Type = Tile\Status & 63 ; 0 - 63 = 64 Types
damit hat eine tilestruct nur noch 5 bytes,
d.h. 200x200 ist nur noch knapp 196KB groß,
in 2,5MB passt eine 1024x512 Map....
Verfasst: 01.01.2007 20:33
von Artus
Also ich habe 3 Layer, das Sprite[4] ist bei einem animierten Sprite die vier Sprites für die animation du hast mich aber auf eine idee gebracht ich speicher die andern longs Sprite[1][2] und [3] nur wenn Sprited true is^^
mal sehen wie ich das begrenzen kann, und das mit dem Status muss ich auch mal ausprobieren^^
zum verständniss das sah bis jetzt so aus:
Code: Alles auswählen
Procedure SaveMap(file.s)
If CreateFile(0,file)
WriteStringN(0,MapInfo\Name)
WriteLong(0,MapInfo\Width)
WriteLong(0,MapInfo\Height)
For I = 0 To 2
For Y = 0 To MapInfo\Height
For X = 0 To MapInfo\Width
WriteLong(0,Map(X,Y,I)\Sprite[0])
WriteLong(0,Map(X,Y,I)\Sprite[1])
WriteLong(0,Map(X,Y,I)\Sprite[2])
WriteLong(0,Map(X,Y,I)\Sprite[3])
WriteByte(0,Map(X,Y,I)\Type)
WriteByte(0,Map(X,Y,I)\Spirited)
WriteByte(0,Map(X,Y,I)\Blocked)
Next
Next
Next
CloseFile(0)
ProcedureReturn #True
Else
ProcedureReturn #False
EndIf
EndProcedure
Edit:
Mein Problem ist ja das das die Karten datei um einiges größer wird da noch infos für kartenübergänge, Gegner Items und so weiter reinkommen
Verfasst: 02.01.2007 02:06
von dllfreak2001
Mmh das hatten wir aber schonmal.
Detaillayer, Entitylayer die selten genutzt werden (Spawn, NPCS und Schalter)
sollten nicht als Liste abgespeichert werden sondern explizit mit position und typ.
Blockaden sollten auch nicht extra abgespeichert werden es sollten eher den Sprites diese Blockaden zugeordnet werden.
Zum Beispiel werden Mauern nur selten begebar sein und deshalb sollten
sie permanent als blocked gelten. Wenn man dann sowas doch braucht dann macht man das als Entity.
Damit sparst du schonmal mindestens 4 von deinen Arrays da.
Warum Speicherst du den Kramm mit dem Map(X,Y,I) doppelt?
Du willst doch nicht nen game zu dem typen aus drawn together progen?
Verfasst: 02.01.2007 03:42
von MVXA
Wie wäre es wenn du als Optimierung nicht alle Tiles speicherst
sondern nur diese, die kein Rechteck oder Viereck ergeben? Die
anderen alle speicherst du nur mit Koordinaten. Somit musst du
nicht die Komplette Map speichern sondern nur ein paar
Koordinaten.
Verfasst: 02.01.2007 09:10
von Kaeru Gaman
mir ist grad auch nicht klar, wozu du das dreifach speicherst,
also woz die dimension I gut sein soll..
noch was zur animation:
du kannst einfach bei den sprites, die animiert sind, die frames hintereinander abspeichern.
also in hintereinanderliegenden tile-nummern.
mal als beispiel:
0-31 begehbare tiles
32-63 nicht begehbare tiles
64-255 animierte tiles, z.b. 48 verschiedene à 4 frames
damit benötigst du nur noch 1 byte pro tile, inklusive block und anim.
wenn da jetzt z.b. ne 160 drin ist, dann weißt du, dass es ein animiertes tile ist,
und dass du im nächsten frame an der stelle ein 161, dann 162, dann 163 und dann wieder 160 darstellen musst.
natürlich kannst du das ganz nach bedarf anders einteilen,
aber wenn man jede tilenummer ausnutzt, kann man mit 256 tiles einiges anfangen, auch inklusive animationen.
Verfasst: 02.01.2007 12:42
von dllfreak2001
so habe ich das mal gemacht.
Wen ich ne Animation gemacht habe.
Dann habe ich die nur die Grafik einzeln abegespeichert und die Info über die Animation gibt die größe des Sprites. Also mit Spritewidth und height die größe ermitteln. (Bei mir lagen die Animationsstufen im Sprite nebeneinander) dan teilst du die Breite mit der höhe und schon hast du die anzahl der animationsstufen. Dann clipped man das ganze im Spiel entsprechend so oft durch und fertig.
Verfasst: 02.01.2007 13:38
von Artus
@dllfreak2001: Nee, ^^ ich find den Namen halt komisch, außerdem find ich Drawn Together, einfach nur genial
Dann zu "Map(X,Y,I)", die ersten 2 sind die Position und das letzte die Layer 0 bis 2. Ich speicher es halt ab weil alle layer die selbe Structur haben. Habe Aber bis jetzt schon die kartengröße bei 200x200 von 2,5 mb auf 0,5 mb verkleinert.
@Kaeru Gaman & MVXA: Also das mit dem meherere Bool-Werte in einem Byte zu speichern hab ich noch nie gemacht und weis auch net so richtig wie daas geht. Und ich brauche alle sprites da ich wenn etwas nur blinkt es so darstellen kann: Sprite 1000, kein Spreit, Sprite 1000 oder so ähnlich.
mfg Artuhr