Seite 2 von 3

Verfasst: 04.04.2009 19:18
von jojo1541
Preiset Kaeru Gaman.BildBildBild

Danke auch an alle anderen, die mir geholfen haben.^^

Nur eine Frage hätte ich noch, Kaeru: Was bedeutet eigentlich das Procedure.i ?

Verfasst: 04.04.2009 19:24
von Kaeru Gaman
dass der Rückgabewert ein Integer sein soll, also ein standard-registerwert,
d.h. 32bit auf nem 32bit system und 64bit auf nem 64bit system.

Verfasst: 05.04.2009 18:17
von jojo1541
Ok, eine kleine Frage hätte ich doch noch, da ich mich mit diesem Thema leider überhaupt nicht auskenne... :(

Kann man davor auch noch irgendwie die arraygröße speichern, damit man beim laden automatisch die arraygröße ausliest und dann damit den (zweidimensionalen) array mit "ReDim" neu setzen kann?

Verfasst: 05.04.2009 18:48
von Kaeru Gaman
ja klar, dann musst du halt statt der beiden konstanten zwei globale variablen nehmen.
und eben vorne weg speichern mit 2x WriteLong, und beim Laden zuerst laden mit 2x ReadLong...

Verfasst: 05.04.2009 19:04
von jojo1541
Ok der Debugger sagt mir jetzt jedes mal : Only the last Dimension of an array can be changed with ReDim.

Beim Neu-Fenster klappt das "ReDim" aber immer...

Meine Speicher-Routine sieht jetzt so aus:

Code: Alles auswählen

If CreateFile(#file, datei$ )
    WriteLong(#file,levelwidth)
    WriteLong(#file,levelheight)
    WriteData(#file, Map(), kgx * kgy * SizeOf( Long ) )
    CloseFile(#file)   
   EndIf 
Und meine Lade-Routine:

Code: Alles auswählen

If OpenFile(#file,datei$)
    levelwidth = ReadLong(#file)
    levelheight = ReadLong(#file)
    ReadFile(#file, datei$)
    ReadData(#file, Map(), kgx * kgy * SizeOf( Long ) )
    StatusBarText(#statusbar,1,datei$) 
        
    kgx = levelwidth/32
    kgy = levelheight/32
        
    ReDim map(kgx,kgy)

        
    ;StatusBarText(#statusbar,2,Str(kgx)+"x"+Str(kgy)) Ist gerade nicht relevant
         
EndIf 
Und beim öffnen verursacht das ReDim immer einen Error.

Verfasst: 05.04.2009 19:17
von Kaeru Gaman
achso, ja.

ReDim brauchst du nur, wenn du die Daten drinbehalten willst.
also schreib ganz einfach Dim mit beiden neuen Dimensionen und es funzt.


> Meine Speicher-Routine sieht jetzt so aus:

warum benutzt du einmal beim dimensionen speichern levelwidth und levelheight,
und für die platzberechnung kgx und kgy?
sollte beides identisch sein, also besser auch die selben variablen verwenden.

> Und meine Lade-Routine

achso, jetzt seh ich das....

ich würde aber in den Map-relevanten routinen mit den Map-dimensionen arbeiten.
deine Levelwidth/height brauchst du nur in bezug auf spritekoordinaten, also besser auch nur dort verwenden.
natürlich ist es vorteilhaft sie nur einmal auszurechnen, aber das kann man eben nach dem laden machen.
also, kgx und kgy in die datei schreiben, levelwidth und levelheight nur genau einmal, direkt nach dem laden berechnen.

Verfasst: 12.04.2009 21:15
von jojo1541
OK, gibt doch nochmal ein Problem...

Speichern und Laden klappt bis auf die Tatsache, dass jedesmal, wenn ihc speicher und dann neu lade die letzte y-Dimension meines zweidimensionalen Arrays weg ist.
In meinem Leveleditor, den ich gerade schreibe, macht sich das nicht so gut...

Da fehlt dann immer jeweils die unterste Tile-reihe.

Speichern-Routine

Code: Alles auswählen

datei$ = SaveFileRequester("Speichern","Unbenannt.wrl","Warter's Revenge Level(*.wrl) | *.wrl;",0)
   If CreateFile(#file, datei$ )
    WriteLong(#file,kgx)
    WriteLong(#file,kgy)
    WriteData(#file, Map(), kgx * kgy * SizeOf( Long ) )
    CloseFile(#file)   
   EndIf 

Öffnen-routine

Code: Alles auswählen

datei$ = OpenFileRequester("Öffnen","C:\","Wrater's Revenge Level(*.wrl) | *.wrl;",0)
     If OpenFile(#file,datei$)
        kgx = ReadLong(#file)
        kgy = ReadLong(#file)
        
        Dim map(kgx,kgy)
        
        ReadFile(#file, datei$)
        ReadData(#file, Map(), kgx * kgy + 1 * SizeOf( Long ) )
        StatusBarText(#statusbar,1,datei$) 
        
     EndIf 

Verfasst: 12.04.2009 21:20
von Kaeru Gaman
WriteData(#file, Map(), kgx * kgy * SizeOf( Long ) )
ReadData(#file, Map(), kgx * kgy + 1 * SizeOf( Long ) )
:?:

sei kgx = 10 und kgy = 10:
a) 10 * 10 * 4 = 400
b) 10 * 10 + 1*4 = 104

Verfasst: 12.04.2009 21:27
von jojo1541
Hab ich schon probiert, dann bekomm ich aber keine Map mehr raus, sondern irgendwelche sinnlos positionierten tiles, die andere sind, als sie im Array gespeichert waren.

Verfasst: 12.04.2009 22:24
von Kaeru Gaman
oh, jetzt seh ichs...

warum öffnest du die datei ein zweites mal?

probier mal

Code: Alles auswählen

datei$ = OpenFileRequester("Öffnen","C:\","Wrater's Revenge Level(*.wrl) | *.wrl;",0)
     If ReadFile(#file, datei$)
        kgx = ReadLong(#file)
        kgy = ReadLong(#file)
       
        Dim map(kgx,kgy)
       
        ReadData(#file, Map(), kgx * kgy * SizeOf( Long ) )
        CloseFile(#file)  
        StatusBarText(#statusbar,1,datei$)
       
     EndIf