2013-08-07 36 views
-1

我有一些项目需要保存,它的所有值都是一个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

你能展示真实的代码吗? – MBo

+0

@MBo目前我没有代码来保存或加载,只创建新的...因为我不知道如何保存/加载,但添加了代码来显示我如何创建数组 –

+0

你想如何存储信息?什么类型的文件?有什么要求? –

回答

0

一个保存这类数据的最佳方式是通过createing记录,并保存记录。那么它不是人类可读的东西。 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; 

现在写的阵列的每个部件, 而(我< totalblocks)做 开始

检查组件exsist,柜面你已经删除它或将它未创建。

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); 
+1

-1:恕我直言,保存文件要好得多,如果它们是人类可读的。它使调试保存/加载问题变得更加容易,维护不同应用程序版本之间的兼容性变得更加容易,等等...... – Shannon

+0

我不希望用户编辑数据.. –

+0

@Glen如果您不想让读者编辑数据然后这个解决方案是不够的。文件中的重复TCubeSave结构易于识别,任何有点精通计算机的人都可以使用十六进制编辑器进行实验。 –

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; 
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,海盗宝藏是在这里:XYZZY: 并得到: 00042055215e2c6c0d751cb5b086e653

所以要检查的程序,你读.ini文件SecretCoordinates,添加:ZYZZY:它(在节目中,因此用户无法看到(但如果他们有一个调试器,他们仍然能够))。看看你是否得到相同的MD5。如果这是一场比赛,那你很好。如果它不匹配,那么SecretCoordinates字符串已被篡改,并且您拒绝它。很简单。

+0

+1对于必要的腌制,否则这将相对容易失败;-) OP可以选择在开发过程中忽略MD5以便于测试。 –