Autor Beitrag
Jann1k
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 866
Erhaltene Danke: 43

Win 7
TurboDelphi, Visual Studio 2010
BeitragVerfasst: Do 12.04.07 20:54 
Also, erstmal entschuldigung an die mods hier, aber mir fällt kein besserer titel für das topic ein, hier mein Problem:

Es geht um einen Leveleditor für ein rundenbasierendes strategiespiel, ich bin dabei die maps zu saven.

eine map ist so aufgebaut, dass es ein zweidimensionales dynamisches array gibt (felder: array of array of tfield). ein tfield ist erstmal nichts, bis auf einen string, der angibt welche art das feld ist (typ:string);

soweit alles ganz einfach, nur wennich eine map lade, stimmt die nicht mit der abgespeicherten überein, sie ist um ein feld kleiner (in beide richtungen) und einige felder sind versetzt.

im folgenden meine beiden prozeduren zum speichern und laden, ich bitte euch dort den fehler zu finden, ich habs 100 mal durchgeguckt und in meinen augen ist da alles richtig

Speichern:

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
procedure tmain.save(filename:string);
 var filestream:Tfilestream;
    I,j:integer;
    names:shortstring;
begin

     I:=length(filename);
     names:=copy(filename,I-3,I);
     if names='.bwm' then
     filestream:=tfilestream.create(filename,fmcreate)
     else
     filestream:=tfilestream.create(filename+'.bwm',fmcreate);


     //größe
     I:=high(felder);
     filestream.write(I,sizeof(I));

     I:=high(felder[0]);
     filestream.write(I,sizeof(I));

     //felder
     for I:=0 to high(felder) do
      for J:= 0 to high(felder[0]) do
        begin
         names:=felder[I][J].typ;
         filestream.write(names,sizeof(names));
        end;

     filestream.free;
     showmessage('Map gespeichert');
end;


Laden:

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
procedure tmain.load(filename:string);
var
   I,J:integer;
   filestream:tfilestream;
   names:shortstring;
begin
 //Löschen des alten feldes
 for I:=0 to high(felder) do
  for J:= 0 to high(felder[0]) do
    felder[I][J].destroy;

 filestream:=tfilestream.create(filename,fmOpenRead);

     //Feldgröße
     filestream.read(I,sizeof(I));
     setlength(felder,I);
     filestream.read(J,sizeof(J));
     for I:=0 to high(felder) do
      setlength(felder[I],J);


     //Felder
     for I:=0 to high(felder) do
        for J:=0 to high(felder[0]) do
     begin
     felder[I][J]:=tfield.create;
     filestream.read(names,sizeof(names));
     felder[I][J].typ:=names;
     end;

    filestream.free;
    zeichnen;
    anzeigen;
    showmessage('Map geladen');
    bauen:=true;

end;
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Do 12.04.07 21:08 
Moin!

Du schreibst das hier:
ausblenden Delphi-Quelltext
1:
2:
3:
//größe  
I:=high(felder);  
filestream.write(I,sizeof(I));

aber du setzt es auch beim Lesen als Länge:
ausblenden Delphi-Quelltext
1:
2:
3:
//Feldgröße  
filestream.read(I,sizeof(I));  
setlength(felder,I);

aber dann hast du eine Differenz von genau 1. ;)

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
Jann1k Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 866
Erhaltene Danke: 43

Win 7
TurboDelphi, Visual Studio 2010
BeitragVerfasst: Do 12.04.07 21:14 
ahhhh ja klar, danke daran hats gelegen - ich bin aber auch ein selten doofes pferd xD