虚拟文件系统部分保证了读取和更改地图时的方便,避免在主程序中大量出现底层函数调用,增加了可读性。
下面开始介绍文件格式部分,也就是我本来在试图弄懂的部分。

【MapObject.cs】
MapObject.cs声明了所有地图信息的类定义,目的是结构化地处理地图各部分信息。

其中我只关注IsoTile和OverLay,它们分别是单个Tile(如一块1×1的草地)和覆盖物(如矿石)的类定义。
Tile:

Tile有七个参数,分别是地图坐标、地图转换坐标、高度、tile序号(也就是哪种Tile)、SubTile(比如悬崖就有的占两块Tile)。我标注并数了一下,这七个参数共11个字节(这也与我之前查到的资料吻合)。
ToMapPack5Entry是一个把这些参数转为bytes类并连成一个整体的操作。这是为了在编码时能把整张图的Tile合成一整个整体。

OverLay就很简单了,不过是记录一下覆盖物的ID和值,来与游戏中的覆盖物一一对应

【TileLayer.cs】
这个文件定义了整张地图的类。它描述了整张地图的所有地块,可以说是很重要的。它被定义为一个可以储存<IsoTile>类的列表,并拥有地图大小、长宽等基本信息。
另外它还定义了如何把这些IsoTile进行处理并存在地图文件里。这对我是最重要的,因为我可以学习逻辑这个用别的语言写。

简要叙述一下流程:
1.读取地图的长、宽,生成Tile的总数=cells。并且因为刚才说过,Tile的七个参数一共11个字节,因此定义[lzoPackSize]为11*cell+4。生成一个IzoPackSize长度的byte类。
2.依次读取TileLayer列表中的Tile,使用上面说过的ToMapPack5Entry函数依次转化为字节数组,并合在一起。
3.编码。
4.压缩。
(后面会详细说方法)
5.把压缩得到的结果赋值给isoMapPack5。
地图文件里的isoMapPack5的那堆字符就是这么来的。