千年地图文件信息提取(delphi).txt
上传用户:ieqrypeu12
上传日期:2013-02-21
资源大小:12137k
文件大小:3k
源码类别:

外挂编程

开发平台:

Visual C++

  1. 千年地图文件信息提取(delphi)
  2. 希望对大家有所帮助。
  3. ///////////////////////////////////////////////////////////
  4. //函数:LoadMap
  5. //功能:提取千年地图信息
  6. //参数:地图文件名  string
  7. //返回:true 成功  false 失败
  8. //说明:千年地图数据格式为 40 * 40
  9. //      从左到右 从上到下 如一个 200 * 200 的地图存储如下
  10. //      1   2   3   4   5
  11. //
  12. //      6   7   8   9   10
  13. //
  14. //      11  12  13  14  15
  15. //
  16. //      16  17  18  19  20
  17. //
  18. //      21  22  23  24  25
  19. //
  20. //      每格之间用20个字节的0 组成
  21. ///////////////////////////////////////////////////////////
  22. 每个坐标点用12字节表示.第十二个字节是表示节点能否站立的信息。
  23. 0 : 可行走
  24. 1 :不能行走。障碍点
  25. 2,3,4,5,6 不能行走。但和1 有所区别 
  26. type
  27.   TMapHeader = record                                    //千年地图文件头 28字节
  28.     name   : array [0..15] of char;
  29.     a1     : dword;
  30.     Width  : dword;
  31.     Height : dword;
  32.     end;
  33. Function LoadMap ( FileName:string ):bool;
  34. var
  35.   MapHeader : TMapHeader;
  36.   MapFile   : File;
  37.   x,y,i,j,k,Size: integer;
  38.   count     : integer;
  39.   temp      : array [0..$4b14]of byte;
  40. begin
  41.    if FileName <> '' then
  42.       begin
  43.       try
  44.       AssignFile (MapFile,FileName);                      //建立文件关联
  45.       Reset      (MapFile,1);                             //打开文件
  46.       Seek       (MapFile,0);                             //移动指针
  47.       Blockread  (MapFile,MapHeader,28,size);             //读取文件头
  48.       if Size <> 28 then
  49.               begin
  50.               ShowMessage ('读取文件头出错,请检查文件的有效性!');
  51.               LoadMap := False;
  52.               exit;
  53.               end
  54.       else        
  55.       MapWidth := MapHeader.Width;
  56.       MapHeight:= MapHeader.Height;
  57.       j := 0;
  58.       k := 0;
  59.       MapData := nil;
  60.       // 40*40个坐标点 每点 12个字节 开头20个0  40*40*12+20= 4B14
  61.       count := MapHeight * MapWidth div 1600;             //循环次数 地图数据数量
  62.       SetLength (MapData,MapWidth+1,MapHeight+1);
  63.       for i := 1 to count do
  64.           begin
  65.           BlockRead (MapFile,temp,$4B14,size);            //读取地图信息
  66.           if Size <> $4B14 then
  67.               begin
  68.               ShowMessage ('读取的内容长度出错');
  69.               LoadMap := False;
  70.               exit;
  71.               end
  72.           else
  73.           for x := 0 to 39 do
  74.               begin
  75.               for y := 0 to 39 do
  76.                   begin
  77.                   MapData[x+j,y+k] := temp [31 + x * 480 + y * 12 ];
  78.                   end;
  79.               end;
  80.           k := k + 40;                                    //坐标轴操作
  81.           if k = MapWidth then
  82.               begin
  83.               k := 0;
  84.               j := j + 40;
  85.               end;
  86.           end;
  87.       Finally
  88.       CloseFile (MapFile);
  89.       LoadMap := True;
  90.       end;
  91.       
  92.    end else
  93.    LoadMap := False;
  94. end;