tile是什么意思:Tile文件的组织



  斜视角Tile游戏中Tile是组成地图最基本东西整个地表(不包括上面建筑)都是由Tile拼出来每个Tile就是个小图片描述了这个地表(象地板、街道、草地、溪流等等)样子依照(我)习惯同类文件就组织在起打成个包下面就给出个Tile文件结构

   我们先来讨论下Tile图片颜色数在以前我曾经说过对256色模式我有种怪异癖好而且我也讲过些256色好处很多Tile肯定都可以用相同调色板(象区别形状草地等等)而且这些调色板也可以给那些物体用(节省空间是我们)另外说实话每个Tile根本不见得有256个有意义像素因此在这里每个Tile仍然用256色就足够了但是256色就有个调色板问题这个在后面具体讨论数据结构时候再解决

   每个Tile图片都有很大压缩余地毕竟同种地表肯定有很多相邻颜色是相同而且菱形 4周都是透明色肯定是要压缩压缩思路方法就采用DIABLO中图像压缩思路方法中提及Diablo所采用RLE压缩思路方法(简单、效果也不差)由于采用了压缩思路方法的后这些Tile大小就变得大小不等了为了快速在文件中定位每个Tile我们需要建立个索引文件(可以叫xxx.inx)整个文件就是个记录着每个Tile在Tile文件中位置及些必要信息具体数据结构稍候讨论这样就可以根据TileID号(实际就是Tile在整个它所处Tile文件中索引号)快速在Tile文件中查找到所需要Tile当然也可以把这个索引放到Tile文件里面(头上或尾部)这样看起来显得更紧凑

好了现在该说到具体数据结构了

typedef struct {
     Version;
     nTileWidth, nTileHeight;
     nTileNumber;
     Compress;
   char TileFileDesc[44];
} TILEFILEHEADER;

这是个64字节Tile文件头结构Version是描述下这个Tile文件版本以备后来Tile引擎以及地图编辑器识别如果日后再定义了些新Tile格式只要把这个版本号改通知Tile引擎或地图编辑器就行了;nWidthnHeight两个成员是介绍说明每个Tile长和宽每个Tile都是等大(不然如何拼起来?)所以在前面定义次就够了;nTileNumber是记录在这个文件中总共有多少个Tile如果索引在这个Tile文件中那么这个成员就很有用了;Compress是介绍说明Tile数据是用什么思路方法压缩(模仿BITMAPINFO里结构搞了这么个东西)以备扩展;TileFileDesc是这个Tile文件描述给地图编辑器用提供给编辑者个对这个Tile文件初步印象

文件头后面就是个Tile索引表(还是按我习惯把东西都放到看起来整洁点)索引表实际就是个如下结构:

typedef struct {
     nTilePos;
     nFrameNumber;
   char TileDesc[24];
} TILEINDEX;

nTilePos是最重要成员它记录着这个Tile在文件中位置(相对于文件头偏移用SetFilePoer可以很容易定位Tile);nFrameNumber是用来记录这个Tile帧数当这个值为1时代表这个Tile只有幅图片也就是个静止Tile当值大于1时这个成员就指定了这个Tile帧数也就是说这是个动态Tile(比如说随风摆动草地、起伏水面等等);TileDesc这个东西又是给编辑器看描述了这个Tile名字介绍说明这是个什么样地表形状有了这么个成员我们就可以在编辑Tile时候直接读取每个Tile相关信息以选择所需要Tile而不用扫描整个文件了

索引表后面就是具体Tile数据了每个静态Tile数据都有个自己8个字节数据头

typedef struct {
     nPaletteNumber;
     nTileSize;
} STATICTILEHEADER;

nPaletteNumber是用来记录当前这个Tile图片是使用哪个调色板Tile图片数据每个像素值实际就是在这个调色板里索引实际颜色值是记录在这个调色板里;nTileSize是给出这个Tile被压缩后图片数据大小也就是在文件中真正占据空间大小这个是为了读Tile到内存时和解压缩时方便每个Tile Header后面就是具体压缩过图片数据了

对于动态Tile来说这个数据头稍稍有点变化

typedef struct {
     nPaletteNumber;
     nTileSize;
     nFramePos[1];
} DYNAMICTILEHEADER;

这里nTileSize是指所有帧压缩图片大小总和;nFramePos是个记录着每数据相对于第帧开头数据偏移对于每图片都是分别压缩举个例子:个动态Tile总共有5帧图像每帧图像压缩后大小分别是10、20、25、16、15那么nFramePos[0] = 0nFramePos[1] = 10nFramePos[2] = 30nFramePos[3] = 55nFramePos[0] = 71就是这样这样把Tile读入内存时可以完全不用做任何改动很方便就可以迅速定位到任何帧数据开头上

   当把这些Tile载入内存时候(可能不是全部载入)就需要在内存中再建个类似索引nTilePos这个成员就成了指向Tile数据指针了在内存里可是寸土寸金TILEINDEXTileDesc成员就没必要要了对于建立这个索引还有点要介绍说明幅地图中所用到Tile数是有限没必要也不应该把所有Tile古脑全都读到内存里去所以有很多Tile都是用不到那么在这个索引中这些没用到Tile指针就置成NULL以免误操作只把需要Tile读入内存把相应索引里指针置成正确

Tags:  tilelayerpro strutstile ceramictile tile是什么意思

延伸阅读

最新评论

发表评论