【实用总结】Cocos2d-x使用瓦片地图详解

如图所示的复杂地图可以使用瓦片地图技术,瓦片地图是用一些小图片(瓦片)拼接而成,这样可以大大地减少内存消耗。如图所示的瓦片地图,只需要如图所示的三个瓦片就可以了。

12cea131a209eeeb77cca1a3fb9404b8.jpeg

瓦片地图

3b10cb9266738c8a83c1127438288167.jpeg

地图中的瓦片

瓦片地图的分类

瓦片地图可以有三种分类:直角地图、斜角地图和六边形地图。

1、直角地图

f5d38dddeec5b147f1ac8b953db8b590.jpeg

直角地图,如图所示是使用方形瓦片构建,看上去是垂直向下观察的鸟瞰图,构成瓦片地图的瓦片不一定是正方形,也可以是长方形瓦片。

2、斜角地图

96e7e420c8c7daa504e592772f6df3e8.jpeg

斜角地图,如图所示是使用菱形瓦片构建。斜角地图是将视角旋转到45度,斜角地图能够使我们的大脑错误地认为,我们是在三维游戏世界中。在早期的电子游戏中由于硬件性能所限制,很多游戏采用斜角地图模拟三维游戏。但是现在运行三维游戏已经不是问题,所有现在我们一般不推荐使用斜角地图。

3、六边形地图

六边形地图,即为使用六边形瓦片构建。

瓦片地图中核心概念

在瓦片地图中有一些基本的概念需要我们了解一下,这些概念包括:层、瓦片、瓦片地图坐标和全局标识。

1、层

瓦片地图由地图层组成,我们可以对层进行创建、删除、隐藏和显示等操作。

层可以分为:普通层和对象层。普通层用来绘制一些地图基本要素,这些地图要素基本上是固定的,如图所示,云、鸟、树木、仙人掌和草地等。对象层中可以圈出一些区域,一个区域就是一个对象,用来设置一些属性,我们可以获得通过代码获得这些对象属性。地图中对象与场景中精灵关联,如图所示。

注意:由于绘图引擎会对每一层的每一个瓦片都进行绘制,在设计层的时候在能满足需求情况下层数越少越好,层数一般不宜超过4层。

fa2c96e1cbf9455b5991030b9effd1b7.jpeg

bff444fc1f68d2f978ec32812e6e0a9d.jpeg

(瓦片地图中的层)

如图所示,地图中层是有顺序的,因此前面的层会遮挡后面的层,而且层一旦设置为隐藏,那么就不能在程序中访问。

2、瓦片

瓦片(tiles)是构成层最小要素,有些人将tiles翻译为“瓷砖”,我觉得“瓦片”更加贴切,事实上地图中的层就是由这些“瓦片”铺设而成的。地图中所需要的瓦片被设计到一张大的图片中,这种文件叫“瓦片集”,如图所示是DavidGervais提供开源免费瓦片集,我们可以到http://pousse.rapiere.free.fr/tome/index.htm网站下载更多的瓦片集。瓦片集中的每一个瓦片,大小是一样,瓦片之间可以有固定的缝隙,在使用的时候地图设计软件会将瓦片集分割成小的瓦片。

001b96680b1e375be677f0db0e1b0853.png

DavidGervais瓦片集

3、瓦片地图坐标

在瓦片地图中有自己的一套坐标,地图的最小单位是瓦片,一个瓦片占有一个坐标点。不同类型的地图它的坐标是不同的,如下第一张图所示是直角瓦片地图坐标,坐标原点在左上角。第二张图所示是斜角瓦片地图坐标,坐标原点在菱形地图的顶点。

17c14a8888421a717c23c19e17c902ea.jpeg

直角瓦片地图坐标

13a554806eec85ed2cb441ee030e7f07.jpeg

斜角瓦片地图坐标(TODO去掉灰色底色)

4、全局标识

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

为了访问瓦片地图,Cocos2d-x中访问瓦片地图API,主要的类有:TMXTiledMap、TMXLayer和TMXObjectGroup等。

1、TMXTiledMap

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

364e982e3212a36db776e1c69a4fa5ee.jpeg

TMXTiledMap类图

TMXTiledMap常用的函数如下:

TMXLayer*getLayer(conststd::string&layerName)。通过层名获得层对象。

TMXObjectGroup*getObjectGroup(conststd::string&groupName)。通过对象层名获得层中对象组集合。

Size&getMapSize()。获得地图的尺寸,它的单位是瓦片。

Size&getTileSize()。获得瓦片尺寸,它的单位是像素。

示例代码如下:

TMXObjectGroup*group=_tileMap->getObjectGroup("Objects");

TMXLayer*background=_tileMap->getLayer("Background");

其中_tileMap是瓦片地图类。

2、TMXLayer

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

353218d7ae9c741c65133fec5f7e715e.jpeg

TMXLayer类图

TMXLayer常用的函数如下:

std::string&getLayerName()。获得层名。

Size&getLayerSize()。获得层尺寸,它的单位是瓦片。

Size&getMapTileSize()。获得瓦片尺寸,它的单位是像素。

PointgetPositionAt(constPoint&tileCoordinate)。通过瓦片坐标获得像素坐标,瓦片坐标y轴方向与像素坐标y轴方向相反。

intgetTileGIDAt(constPoint&tileCoordinate)。通过瓦片坐标获得GID值。

3、TMXObjectGroup

TMXObjectGroup是对象层中的对象组集合,它的类图下所示,注意TMXObjectGroup与TMXLayer不同,TMXObjectGroup不是派生自Node,不具有Node特性。

4c088e13a9557c6d88b739b02e70d39c.jpeg

TMXObjectGroup类图

TMXObjectGroup常用的函数如下:

ValuegetProperty(conststd::string&propertyName)。通过属性名获得属性值。

ValueMapgetObject(conststd::string&objectName)。通过对象名获得对象信息。

ValueMapgetProperties()。获得对象的属性。

ValueVectorgetObjects()。获得所有对象。

ValueVector类型的别名是std::vector<Value>,vector是C++的容器类,它能够存放任意类型的动态数组,std是命名空间。

ValueMap类型的别名是std::unordered_map<std::string,Value>,unordered_map也是C++的容器类,它是一种无序的map类型,map是“键-值”对类型。

提示Value是Cocos2d-x中泛型类,它可以表示unsignedchar、int、float、double、bool、std::string、ValueVector、ValueMap和ValueMapIntKey等数据类型。

这次的实用分享到此结束了,大家觉得有收获吗?如果喜欢的话,不妨点击右上角“分享到朋友圈”,让更多的朋友们一起学习吧!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值