TileMap Speichern 2,5 mb?

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Benutzeravatar
Artus
Beiträge: 280
Registriert: 15.01.2005 20:53

TileMap Speichern 2,5 mb?

Beitrag 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^^

Bild
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Re: TileMap Speichern 2,5 mb?

Beitrag 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?
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
Artus
Beiträge: 280
Registriert: 15.01.2005 20:53

Beitrag von Artus »

mhh ich wollt erst mal so kleiner haben kommt später eh alles in pack files
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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....
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Artus
Beiträge: 280
Registriert: 15.01.2005 20:53

Beitrag 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
Benutzeravatar
dllfreak2001
Beiträge: 2925
Registriert: 07.09.2004 23:44
Wohnort: Bayern

Beitrag 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?
I´a dllfreak2001
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag 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.
Bild
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
dllfreak2001
Beiträge: 2925
Registriert: 07.09.2004 23:44
Wohnort: Bayern

Beitrag 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.
I´a dllfreak2001
Benutzeravatar
Artus
Beiträge: 280
Registriert: 15.01.2005 20:53

Beitrag von Artus »

@dllfreak2001: Nee, ^^ ich find den Namen halt komisch, außerdem find ich Drawn Together, einfach nur genial :lol:

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
Antworten