如何保存/加载这些数据?

时间:2013-08-07 03:47:25

标签: delphi delphi-xe2 firemonkey

我需要保存一些项目,它对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;

由于 格伦

3 个答案:

答案 0 :(得分:2)

有很多方法可以将数据保存到文件中。通常我使用NativeXML来读写XML文档。这可能不是最好的方法,但它对我有用,并且到目前为止适合我的项目。

  • 这是人类可读的,所以你可以看到发生了什么。当某些东西不能正常工作时,非常适合调试。
  • 它的结构。当您需要为其他对象包含的对象保存数据时,这会有所帮助。例如,在你的游戏世界中,有一个村庄,村庄包含10栋建筑物,建筑物1包含7盏灯,建筑物2包含3把剑等。
  • 这是一种标准且常用的格式。您的游戏数据文件可以在其他程序中读取和操作。
  • 可以加密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);