-1

我有一些需要保存的项目,它们都是地图的价值。因此,每次用户都可以加载旧地图或创建并保存新地图。但我不确定如何或使用什么过程来保存所有数据。

我有

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;

谢谢格伦

4

3 回答 3

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 IS HERE:XYZZY: 运行它并得到:00042055215e2c6c0d751cb5b086e653

所以要检查程序,你从 .ini 文件中读取 SecretCoordinates,添加 :ZYZZY: 到它(在程序中,所以用户看不到(但如果他们有调试器,他们仍然可以))。看看你是否得到相同的MD5。如果是比赛,那你很好。如果不匹配,则 SecretCoordinates 字符串已被篡改,您拒绝它。很简单。

于 2013-08-19T13:47:54.480 回答
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;
于 2013-08-19T10:24:50.157 回答
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);
于 2013-08-11T14:06:44.130 回答