Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi [Andorra] Mapeditor speichern und laden... (https://www.delphipraxis.net/150134-%5Bandorra%5D-mapeditor-speichern-und-laden.html)

sabbert 8. Apr 2010 12:10


[Andorra] Mapeditor speichern und laden...
 
Liste der Anhänge anzeigen (Anzahl: 1)
Tag zusammen,

für mein Spiel programmiere ich einen Mapeditor.

Ich erzeuge ein Grid und der Benutzer kann aus verschiedenen Texturen auswählen, welches er benutzen möchte z.B.

Weg,Start,Ziel,Feld,Checkpoint. Dann klickt er auf das Grid und es werden die Koordinaten Gespeichert auf die der Benutzer geklickt hat.

Z.B. Feld[6,1] sind die Koordinaten 600,100. Diese werden als TPoint in ein Array Gespeichert.

Für Weg,Feld,... etc. gibt es einzelne Arrays die ich in einem Record zusammengefasst habe(siehe code):
Delphi-Quellcode:
type MapDatenTyp = Record
                  aFeld : Array of TPoint;
                  aWeg : Array of TPoint;
                  aCheckpoints : Array of TPoint;
                  Start,Ziel  : TPoint;
                  end;
Mein Problem ist es das Record,also jedes Array darin ,alle zusammen in eine Datei zu speichern und zu laden.

Beim laden sollen dann einfach die Daten wieder in das Array gelesen werden.

Bitte um Vorschläge und Ideen :)

mfg

Blup 8. Apr 2010 13:01

Re: [Andorra] Mapeditor speichern und laden...
 
Für Arrays oder Listen von Objekten speichert man zuerst die Anzahl oder Gesamtgröße aller Elemente und dann die Daten der Elemente selbst.
Beispiel

SimonRap 8. Apr 2010 13:13

Re: [Andorra] Mapeditor speichern und laden...
 
Ich würd jetzt einfach die Daten also start ziel usw. in ne VARiable (z.b VAR MapDaten:MapDatenTyp;) schreiben, dann mit assignfile, rewrite, write und closefile einfach speichern...
Ich versteh dein Problem nicht ganz...
[edit]
Zitat:

Zitat von Blup
Für Arrays oder Listen von Objekten speichert man zuerst die Anzahl oder Gesamtgröße aller Elemente und dann die Daten der Elemente selbst.
Beispiel

Das natürlich auch noch.
[/EDIT]

sabbert 8. Apr 2010 13:33

Re: [Andorra] Mapeditor speichern und laden...
 
schonmal danke für die antworten ;-)

Also ein array zu speichern ist nicht unbedingt das Problem.

Aber soweit ich weiß kann man ein Record nicht direkt speichern sondern muss jedes Teil , also hier die Array abspeichern.
Wenn ich das alles hintereinander abspeicher, also erst Array1 dann Array 2 klappt das bloß beim Laden weiß ich nicht wie ich das Machen soll.

Z.B. bei einem Array öfnne ich die Datei und lese die Datei solange bis ich beim Ende bin und schreibe sozusagen jede Zeile in mein Array.

Doch wenn ich mehrere Arrays hab wie mach ich das der bis zu einem bestimmten Punkt die Datei liest und in das Array schreibt und danach mit einem anderen Array weitermacht?

z.B. so:
Delphi-Quellcode:
AssignFile(F,OpenDialog1.FileName);
ReSet(F);
i := 0;
while not Eof(f) do
 begin
  Read(f,pMapDaten.aFeld[i]);
  inc(i);
 end;
CloseFile(F);
aber das ist ja nur ein Array und wie kann ich mehrere Arrays hintereinander lesen?

SimonRap 8. Apr 2010 13:53

Re: [Andorra] Mapeditor speichern und laden...
 
Meines wissens nach geht das...
Ein Altes Projekt, da hab ich das so gemacht und es ging:
Delphi-Quellcode:
//der typ
             TYPE TBla=  RECORD
             name: STRING[50]                ;
             x:    ARRAY [1..10]of integer   ;
             y:    ARRAY [1..10]of integer   ;
             END;

...
//zum speichern
assignfile(f,form1.SaveDialog1.Filename);
IF fileexists (form1.SaveDialog1.FileName)
THEN
 BEGIN
 RESET (f);
 SEEK (f,filesize(f));
 END
ELSE
Rewrite(f);
Write(f,bla);
Closefile(f);
...
//laden
if opendialog1.execute then
 begin
 assignfile (f,opendialog1.FileName);
 Reset (f);
 while not eof(f)do
  begin
  read(f,bla);
  combobox1.Items.Add(bla.name);
  end;
  combobox1.ItemIndex:=-1;
 showmessage('Datei geladen');
is extrem alt, aber hat funktioniert^^
müsste eig klappen
mfg simon

Blup 8. Apr 2010 14:04

Re: [Andorra] Mapeditor speichern und laden...
 
Das funktioniert so nur mit Arrays fester Größe.

Ansistrings sind im Prinzip auch nur Arrays mit dynamischer Größe und wie man die speichert und wieder liest, findest du in meinem Beispiel. Ich würde mit TStream (bzw. TFileStream) statt mit File arbeiten, ist einfach universeller.

Edit, z.B. so:
Delphi-Quellcode:
type
  TPointArray = array of TPoint;

procedure PointArray_Write(AStream: TStream; const AValue: TPointArray);
var
  n: Longword;
begin
  n := Length(AValue);
  AStream.WriteBuffer(n, SizeOf(n));
  if n > 0 then
    AStream.WriteBuffer(AValue[0], SizeOf(AValue[0]) * n);
end;

procedure PointArray_Read(AStream: TStream; var AValue: TPointArray);
var
  n: Longword;
begin
  AStream.ReadBuffer(n, SizeOf(n));
  SetLength(AValue, n);
  if n > 0 then
    AStream.ReadBuffer(AValue[0], SizeOf(AValue[0]) * n);
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:00 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz