我需要保存一些项目,它对Map的所有价值。因此,每次用户可以加载旧地图或创建并保存新地图。但我不确定如何或用什么程序来保存所有数据。
我有
TCube array (1..10000)
Row, Column : integers
NumberOfBlocks : integers
因此,当用户单击“保存”时,它应该保存数组数据(我不确定它是否重要,但不是所有10,000个多维数据集都已创建),以及3个整数。
创建TCUBE数组和整数的完整代码。
procedure TForm2.createMap(r:integer;c:integer);
var
i : integer;
rows,columns,columnssave : integer;
x,y,z : single;
player : tmodel3d;
begin
columns := r;
rows := c;
i:=1;
x := 0;
y := 0;
z := 0;
NumberOfRows := rows;
NumberOfColumns := columns;
camera1.Position.X := rows/2;
camera1.Position.Y := columns/2;
dummy1.Position.X := rows/2;
dummy1.Position.Y := columns/2;
while rows>0 do
begin
columnssave := columns ;
while columns >0 do
begin
CreateCube[i]:=tcube.Create(self);
CreateCube[i].Visible := true;
CreateCube[i].Position.x := x;
CreateCube[i].Position.Y := y;
CreateCube[i].Position.Z := z;
CreateCube[i].Material.Texture.CreateFromFile(gamedir+'\pics\Grass.bmp');
CreateCube[i].Material.Modulation := TTextureMode.tmReplace;
CreateCube[i].Parent := viewport3d1;
CreateCube[i].OnClick := cubeClick;
CreateCube[i].OnMouseDown := mousedown;
y:= y+1;
i:=i+1;
//z:=z-1;
columns := columns -1;
end;
y:=0;
x:= x+1;
z:=0;
columns := columnssave;
rows:= rows-1;
end;
totalblocks := i;
setblocks := false;
label2.Text := inttostr(totalblocks);
end;
由于 格伦
答案 0 :(得分:2)
有很多方法可以将数据保存到文件中。通常我使用NativeXML来读写XML文档。这可能不是最好的方法,但它对我有用,并且到目前为止适合我的项目。
保存代码的示例:
procedure TMyGame.SaveToFile(const FileName: string);
var
XML : TNativeXML;
RootNode : TXmlNode;
CubeNode : TXmlNode;
begin
XML := TNativeXML.CreateName('root');
try
RootNode := XML.Root;
for c1 := 0 to NumberOfCubes-1 do
begin
CubeNode := RootNode.NodeNew('Cube');
CubeNode.NodeNew('XPos').ValueAsInteger := 10;
CubeNode.NodeNew('YPos').ValueAsInteger := 2;
end;
XML.SaveToFile(FileName);
finally
XML.Free;
end;
end;
答案 1 :(得分:2)
我强烈主张拥有人类可读的数据,例如XML或.ini文件。如果您需要阻止用户编辑/修改数据,可以通过“签名”数据并添加验证密钥来实现。密钥可以由您的程序通过获取敏感数据,附加只有您知道的内容,然后生成MD5哈希或加密来生成。 MD5结果或加密字符串的前100个字节成为您存储在.ini或其他内容中的密钥。
例如:
[MAPSTUFF]
SecretCoordinates=1,2,3,PIRATE TREASURE IS HERE
SignedKey=00042055215e2c6c0d751cb5b086e653
SignedKey实际上是SecretCoordinates字符串的MD5 +:XYZZY: 即我通过MD5运行: 1,2,3,PIRATE TREASURE在这里:XYZZY: 得到了: 00042055215e2c6c0d751cb5b086e653
所以要检查程序,你从.ini文件中读取SecretCoordinates,添加:ZYZZY:到它(在程序中,所以用户看不到(但如果他们有调试器,他们仍然可以))。看看你是否得到了相同的MD5。如果这是一场比赛,那你很好。如果它不匹配,则SecretCoordinates字符串已被篡改,您拒绝它。非常简单。
答案 2 :(得分:0)
保存此类数据的最佳方法之一是创建记录并保存记录。然后它也不是人类可读的东西。 Sof首先创建一个新类型
TCubeSave = record
number : integer;
x : single;
y : single;
z : single;
texture : string[20];
end;
在这种情况下,我们想要保存数组中的数字,以及数据x,y,z和纹理? 如果做任何字符串确保它是一个数组,否则你会收到错误。
接下来分配变量和文件并使其准备就绪。
var
myfile : File of TCubeSave;
cube : TcubeSave;
i : integer;
begin
assignfile(myfile, gamedir+'\maps\test.map');
ReWrite(myfile);
i:=0;
现在编写数组的每个组件, 虽然(i< totalblocks)做了 开始
检查组件是否存在,是否已将其删除或未创建。
if FindComponent('cubename'+inttostr(i)) <> nil then
begin
将数据写入文件立方体
cube.number := i;
cube.x := createcube[i].Position.X;
cube.y := createcube[i].Position.Y;
cube.z := createcube[i].Position.Z;
cube.texture := createcube[i].Material.Texture.ToString;
Write(myfile, cube);
end;
i := i+1;
end;
完成后关闭文件。
CloseFile(myfile);
showmessage('Map Saved');
end;
准备阅读文件时..
// Reopen the file in read only mode
FileMode := fmOpenRead;
Reset(myFile);
// Display the file contents
while not Eof(myFile) do
begin
Read(myFile, cube);
i:= cube.number;
CreateCube[i]:=tcube.Create(self);
createCube[i].Position.x := cube.x;
createcube[i].position.y := cube.y;
ect.....
end;
// Close the file
CloseFile(myFile);