Cocos2d-x 瓦片地图TiledMap
声明:本文分析的是cocos2d-x-3.13的代码
Tiled地图概述
Cocos支持由Tiled Map Editor编辑的场景地图。Tiled地图(瓦片地图)可以将地图分成很多个小图块,每个图块都可以设置一个地图元素。Tiled地图可以分为多个层,层可以分为图像层和对象层。图像层主要是拼接场景图片的,如果一个tiled地图为3*3,则每个图像层的大小也都为3*3。我们可以把背景作为一个图像层,建筑做一个图像层。对象层,是用来存放一些额外数据的,我们可以在对象层中增加一些矩形,三角形对象等等,读取地图时我们可以获取这些矩形,三角形,然后根据矩形,三角形对象创建NPC或敌人等角色。Tiled地图中所有小图的集合为TileSet,每个小图都有一个唯一的ID,每张图片对应一个TiledSet。每个小图在组成图像层时可以进行x轴翻转,Y轴翻转,旋转。
Tiled Map Editor编辑的地图信息存放在一个后缀为.tmx的XML文件中。
Tiled地图
Cocos中Tiled地图有TMXTiledMap类实现。整个Tiled地图的类图大致如下:
瓦片地图中map、layer、tile、object、objectgroup都可以有属性,属性由Key-Value组成,在Cocos中的通过ValueMap存储。TMXTiledMap类的_properties成员变量存放了Map的属性,_objectGroups成员变量存放了每个小图块tile的属性,通过小图的ID(这个ID实际为TiledSet的firstgid加上tiled的ID)作为Key存放。
TMXObjectGroup类为对象层类,每个TMXObjectGroup对象代表一个对象层。
TMXLayer类为图像层类,该类的uint32_t* _tiles成员变量存放了该层的所有小图块ID,如果ID不为空则会创建一个对应的Sprite。TMXTilesetInfo*_tileSet成员变量存放了该图像层对应的tileSet,每一个图像层使用的图块必须来至同一个tileSet,即同一个大图。
Tiled地图的创建
可以通过以下函数创建
TMXTiledMap *TMXTiledMap::create(conststd::string&tmxFile)
参数tmxFile为Tiled Map Editor编辑器生成的文件路径。
创建过程大致如下:
在将地图数据的XML信息转换成TMXMapInfo调用以下函数:
void TMXMapInfo::startElement(void *ctx,const char *name,const char **atts)
void TMXMapInfo::endElement(void *ctx,const char *name)
void TMXMapInfo::textHandler(void *ctx,const char *ch,int len)
FastTMXTiledMap
FastTMXTiledMap是cocos2d-x3.x中新增加的功能,和TMXTiledMap一样都是实现了瓦片地图。FastTMXTiledMap的接口和TMXTiledMap完全一样,只是FastTMXTiledMap在绘制地图时可以对超出显示范围的地图进行裁剪,从而减少绘制的节点,节省资源。
FastTMXTiledMap实现在CCFastTMXTiledMap.h/CCFastTMXTiledMap.cpp文件中,实现在experimental命名空间中。
FastTMXTiledMap和TMXTiledMap主要的不同在于TMXLayer层的实现两者类图如下:
TMXLayer类继承至SpriteBatchNode类
experimental:: TMXLayer类继承至Node类