Cocos2d-x 3.x瓦片地图

时间:2023-02-09 13:53:08

瓦片地图,顾名思义,就是整张地图是使用小图片(瓦片)拼接而成,这样可以大大地减少内存消耗。如下图所示的瓦片地图,只需要三个瓦片就可以了。

瓦片地图

Cocos2d-x 3.x瓦片地图

地图使用的瓦片

Cocos2d-x 3.x瓦片地图


分类

瓦片地图可以分为3类:直角地图、斜角地图和六边形地图。

1 直角地图
直角地图,是使用方形瓦片构建,每块瓦片的x,y和屏幕对应平行,构成瓦片地图的瓦片不一定是正方形,也可以是长方形瓦片。

2 斜角地图
斜角地图,每块瓦片的x,y和屏幕对应边呈一定角度。

3 六边形地图
六边形地图,六边形瓦片。

核心概念

瓦片地图基本概念包括:层、瓦片、瓦片地图坐标和全局标识。

1 层

  • 瓦片地图由地图层组成,我们可以对层进行创建、删除、隐藏和显示等操作。
  • 层可以分为:普通层对象层。 普通层用来绘制一些地图基本要素。对象层中可以圈出一些区域,一个区域就是一个对象,用来设置一些属性,我们可以获得通过代码获得这些对象属性。地图中对象与场景中精灵关联。
  • 地图中层是有顺序的,因此前面的层会遮挡后面的层,而且层一旦设置为隐藏,那么就不能在程序中访问。

2 瓦片

  • 瓦片(tiles)是构成层最小要素,事实上地图中的层就是由这些“瓦片”铺设而成的。地图中所需要的瓦片被设计到一张大的图片中,这种文件叫“瓦片集”,如图所示是David Gervais提供开源免费瓦片集,我们可以到http://pousse.rapiere.free.fr/tome/index.htm网站下载更多的瓦片集。瓦片集中的每一个瓦片,大小是一样,瓦片之间可以有固定的缝隙,在使用的时候地图设计软件会将瓦片集分割成小的瓦片。
  • 普通层 和 对象层 都能够通过接口来获得里面的瓦片,瓦片表现为精灵。

    Cocos2d-x 3.x瓦片地图

3 瓦片地图坐标
在瓦片地图中有自己的一套坐标,地图的最小单位是瓦片,一个瓦片占有一个坐标点。不同类型的地图它的坐标是不同的,下图所示是直角瓦片地图坐标,坐标原点在左上角,对应坐标标注在图中。
Cocos2d-x 3.x瓦片地图

4 全局标识
瓦片地图中的每一个瓦片都拥有一个唯一的编号——全局标识(Global IDentifier,缩写GID),用于在地图中查找某个瓦片。全局标识是从1开始的,如果为0,则说明瓦片为空,我们可以利用全局标识来判断某个坐标下是否存在瓦片。

瓦片地图API

为了访问瓦片地图,主要提供了3个类,主要的类有:TMXTiledMap、TMXLayer和TMXObjectGroup等。

1 TMXTiledMap

TMXTiledMap是瓦片地图类,用于解析和渲染.tmx Map,支持解析由Tiled MapEditor(http://www.mapeditor.org)生成的.tmx文件。

基本特点:

  • 只支持xml格式的.tmx文件,json格式不支持。
  • 每一个瓦片都被视为一个Sprite。
  • 这些Sprite是按需创建的。只当进行类似调用layer->tileAt(pos)时,才创建Sprite,layer是地图中的层。
  • 因为每个瓦片都视为Sprite,所以每个瓦片都可以进行Sprite的操作(移动,翻转,缩放…)。
  • 每个瓦片能在程序运行时,被添加或者移除。
  • TMXTileMap 和 瓦片 的默认锚点(AnchorPoint)是(0,0)。
  • 瓦片集所用的图片 使用 TextureCache加载到缓存。
  • 每个瓦片都有唯一的标识(GID),GID从1开始。

它的类图如图所示,TMXTiledMap派生自Node类,具有Node特点。

Cocos2d-x 3.x瓦片地图

TMXTiledMap常用的函数如下:

  • TMXLayer* getLayer(const std::string &layerName)。通过层名获得普通层对象。
  • TMXObjectGroup* getObjectGroup(const std::string &groupName)。通过对象层名获得层中对象层。
  • Size& getMapSize()。获得地图的尺寸,它的单位是瓦片。
  • Size& getTileSize()。获得瓦片尺寸,它的单位是像素。

示例代码如下:

// 根据地图文件mao.tmx,创建地图(管理所有的层)
TMXTiledMap * map = TMXTiledMap::create("map.tmx");
// 获得对象层
TMXObjectGroup* group = map->getObjectGroup("Objects");
// 获得普通层
TMXLayer* background = map->getLayer("Background");


2 TMXLayer
TMXLayer是地图层类。

基本特点:

  • 如果层有一个属性名为“cc_vertexz”,且其属性值是一个整数,那么该整数将应用于层中所有瓦片的z-order。

它的类图如图所示,TMXLayer也派生自Node类,也具有Node特点。同时TMXLayer也派生自SpriteBatchNode类,所有TMXLayer对象具有批量渲染的能力,因为瓦片地图层就是由大量重复的图片构成,它们需要渲染提高性能。

Cocos2d-x 3.x瓦片地图

TMXLayer常用的函数如下:

  • std::string& getLayerName()。获得层名。
  • Size& getLayerSize()。获得层尺寸,它的单位是瓦片。
  • Size& getMapTileSize()。获得瓦片尺寸,它的单位是像素。
  • Point getPositionAt(const Point& tileCoordinate) 。通过瓦片坐标获得像素坐标,瓦片坐标y轴方向 与 像素坐标y轴方向相反。
  • int getTileGIDAt(const Point& tileCoordinate)。通过瓦片坐标获得GID值。
  • Sprite* getTileAt(const Vec2& tileCoordinate); 通过瓦片坐标系中的坐标获得对象瓦片。
  • void removeTileAt(const Vec2& tileCoordinate); 移除层中瓦片。

3 TMXObjectGroup
TMXObjectGroup是对象层中的对象组集合,注意TMXObjectGroup与TMXLayer不同,TMXObjectGroup不是派生自Node,不具有Node特性。

Cocos2d-x 3.x瓦片地图

TMXObjectGroup常用的函数如下:

  • Value getProperty(const std::string &propertyName)。通过属性名获得属性值。
  • ValueMap getObject(const std::string &objectName)。通过对象名获得对象信息(对象信息以hash的形式存放)。
  • ValueMap getProperties()。获得对象的属性。
  • ValueVector getObjects()。获得所有对象。


类型说明

  • ValueVector类型的别名是std::vector<Value>,vector是C++的容器类,它能够存放任意类型的动态数组,std是命名空间。
  • ValueMap类型的别名是std::unordered_map<std::string, Value>,unordered_map是C++的容器类,它是一种无序的map类型( hash表 ),map是“键-值”对类型。
  • Value是Cocos2d-x中泛型类,它可以表示unsigned char、int、float、double、bool、std::string、ValueVector、ValueMap和ValueMapIntKey等数据类型。