My level map files in The Probe are just simple 2d arrays of a TEngineObject record, one array for each layer in the map...
Code:
TEngineObject = record
Enabled: Boolean;
Health: Single;
Moving: Byte;
OfsX: Single;
OfsY: Single;
case Integer of
0: (Id,Attrib,Scanned,Stationary: Byte);
1: (Value: LongWord);
end;
Here is my load/save code I am now using in The Probe prototype (levels are binary files):
Code:
procedure TTheProbeEngine.SaveToStream(const aStream: TStream);
var
w,h,L: Word;
Layer,x,y: Word;
begin
w := FWidth;
h := FHeight;
L := FLayerCount;
aStream.Write(w,SizeOf(w));
aStream.Write(h,SizeOf(h));
aStream.Write(L,SizeOf(L));
aStream.Write(FUpdateCount,SizeOf(FUpdateCount));
for Layer := 0 to FLayerCount - 1 do
for y := 0 to FHeight - 1 do
begin
for x := 0 to FWidth - 1 do
begin
aStream.Write(FLayers[Layer][y,x],SizeOf(TEngineObject));
end;
end;
end;
procedure TTheProbeEngine.LoadFromStream(const aStream: TStream);
var
w,h,L: Word;
Layer,x,y: Word;
begin
aStream.Read(w,SizeOf(w));
aStream.Read(h,SizeOf(h));
aStream.Read(L,SizeOf(L));
aStream.Read(FUpdateCount,SizeOf(FUpdateCount));
SetBounds(L,w,h);
for Layer := 0 to FLayerCount - 1 do
for y := 0 to FHeight - 1 do
begin
for x := 0 to FWidth - 1 do
begin
aStream.Read(FLayers[Layer][y,x],SizeOf(TEngineObject));
end;
end;
end;
procedure TTheProbeEngine.LoadFromFile(const aFileName: AnsiString);
var
fs: TFileStream;
begin
fs := TFileStream.Create(aFileName,fmOpenRead or fmShareDenyWrite);
try
LoadFromStream(fs);
finally
fs.Free;
end;
end;
procedure TTheProbeEngine.SaveToFile(const aFileName: AnsiString);
var
fs: TFileStream;
begin
fs := TFileStream.Create(aFileName,fmCreate or fmShareDenyWrite);
try
SaveToStream(fs);
finally
fs.Free;
end;
end;
Maybe this will help you?
cheers,
Paul
Bookmarks