Cocos2d-x 瓦片地图TiledMap

时间:2021-12-27 11:16:29

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编辑的地图信息存放在一个后缀为.tmxXML文件中。

Tiled地图

CocosTiled地图有TMXTiledMap类实现。整个Tiled地图的类图大致如下:

Cocos2d-x 瓦片地图TiledMap

瓦片地图中maplayertileobjectobjectgroup都可以有属性,属性由Key-Value组成,在Cocos中的通过ValueMap存储。TMXTiledMap类的_properties成员变量存放了Map的属性,_objectGroups成员变量存放了每个小图块tile的属性,通过小图的ID(这个ID实际为TiledSetfirstgid加上tiledID)作为Key存放。

 

TMXObjectGroup类为对象层类,每个TMXObjectGroup对象代表一个对象层。

 

TMXLayer类为图像层类,该类的uint32_t_tiles成员变量存放了该层的所有小图块ID,如果ID不为空则会创建一个对应的SpriteTMXTilesetInfo*_tileSet成员变量存放了该图像层对应的tileSet,每一个图像层使用的图块必须来至同一个tileSet,即同一个大图。

 

Tiled地图的创建

可以通过以下函数创建

TMXTiledMap *TMXTiledMap::create(conststd::string&tmxFile)

参数tmxFileTiled Map Editor编辑器生成的文件路径。

 

创建过程大致如下:

 Cocos2d-x 瓦片地图TiledMap

在将地图数据的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

FastTMXTiledMapcocos2d-x3.x中新增加的功能,和TMXTiledMap一样都是实现了瓦片地图。FastTMXTiledMap的接口和TMXTiledMap完全一样,只是FastTMXTiledMap在绘制地图时可以对超出显示范围的地图进行裁剪,从而减少绘制的节点,节省资源。

FastTMXTiledMap实现在CCFastTMXTiledMap.h/CCFastTMXTiledMap.cpp文件中,实现在experimental命名空间中。

 

FastTMXTiledMapTMXTiledMap主要的不同在于TMXLayer层的实现两者类图如下:

Cocos2d-x 瓦片地图TiledMap

TMXLayer类继承至SpriteBatchNode

experimental:: TMXLayer类继承至Node