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

瓦片地图

地图中的瓦片

瓦片地图的分类
瓦片地图可以有三种分类:直角地图、斜角地图和六边形地图。
1、直角地图
直角地图,如图所示是使用方形瓦片构建,看上去是垂直向下观察的鸟瞰图,构成瓦片地图的瓦片不一定是正方形,也可以是长方形瓦片。

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

3、六边形地图
六边形地图,如图所示是使用六边形瓦片构建。


                                                                                        直角地图

斜角地图

六边形地图

瓦片地图中核心概念
在瓦片地图中有一些基本的概念需要我们了解一下,这些概念包括:层、瓦片、瓦片地图坐标和全局标识。
1、层
瓦片地图由地图层组成,我们可以对层进行创建、删除、隐藏和显示等操作。
层可以分为:普通层和对象层。普通层用来绘制一些地图基本要素,这些地图要素基本上是固定的,如图所示,云、鸟、树木、仙人掌和草地等。对象层中可以圈出一些区域,一个区域就是一个对象,用来设置一些属性,我们可以获得通过代码获得这些对象属性。地图中对象与场景中精灵关联,如图所示。
如图所示,地图中层是有顺序的,因此前面的层会遮挡后面的层,而且层一旦设置为隐藏,那么就不能在程序中访问。
注意  由于绘图引擎会对每一层的每一个瓦片都进行绘制,在设计层的时候在能满足需求情况下层数越少越好,层数一般不宜超过4层。

瓦片地图中的层(TODO然后能表现出分层呢?)

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

David Gervais瓦片集

3、瓦片地图坐标
在瓦片地图中有自己的一套坐标,地图的最小单位是瓦片,一个瓦片占有一个坐标点。不同类型的地图它的坐标是不同的,图11-13所示是直角瓦片地图坐标,坐标原点在左上角。图11-14所示是斜角瓦片地图坐标,坐标原点在菱形地图的顶点。

直角瓦片地图坐标

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

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

Cocos2d-x中瓦片地图API
为了访问瓦片地图,Cocos2d-x中访问瓦片地图API,主要的类有:TMXTiledMap、TMXLayer和TMXObjectGroup等。
1、TMXTiledMap
TMXTiledMap是瓦片地图类,它的类图如图所示,TMXTiledMap派生自Node类,具有Node特点。

TMXTiledMap类图
TMXTiledMap常用的函数如下: 
TMXLayer* getLayer(const std::string &layerName)。通过层名获得层对象。
TMXObjectGroup* getObjectGroup(const std::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对象具有批量渲染的能力,瓦片地图层就是由大量重复的图片构成,它们需要渲染提高性能。

TMXLayer类图
TMXLayer常用的函数如下: 
std::string& getLayerName()。获得层名。
Size& getLayerSize()。获得层尺寸,它的单位是瓦片。
Size& getMapTileSize()。获得瓦片尺寸,它的单位是像素。
Point getPositionAt(const Point& tileCoordinate) 。通过瓦片坐标获得像素坐标,瓦片坐标y轴方向与像素坐标y轴方向相反。
int getTileGIDAt(const Point& tileCoordinate)。通过瓦片坐标获得GID值。

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

TMXObjectGroup类图
TMXObjectGroup常用的函数如下:
Value getProperty(const std::string &propertyName)。通过属性名获得属性值。
ValueMap getObject(const std::string &objectName)。通过对象名获得对象信息。
ValueMap getProperties()。获得对象的属性。 
ValueVector getObjects()。获得所有对象。
ValueVector类型的别名是std::vector<Value>,vector是C++的容器类,它能够存放任意类型的动态数组,std是命名空间。
ValueMap类型的别名是std::unordered_map<std::string, Value>,unordered_map也是C++的容器类,它是一种无序的map类型,map是“键-值”对类型。

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

更多内容请关注国内第一本Swift图书《Swift开发指南》
本书交流讨论网站:http://www.51work6.com/swift.php
欢迎加入Swift技术讨论群:362298485

欢迎关注智捷iOS课堂微信公共平台

Cocos2d-x使用瓦片地图的更多相关文章

  1. scrollview 图片放大 捏合 瓦片地图 相关注意事项

    就职文博公司要为博物馆做APP 涉及到瓦片地图的编写 在这里总结一些开发中遇到的问题 (将会不断更新 也是学习阶段) 着急写项目的同学 可以直接看code4上现成的瓦片地图代码:http://www. ...

  2. OpenStreetMap/Google/百度/Bing瓦片地图服务(TMS)

    开源与成熟商业的瓦片地图服务(TMS  2  WMTS),都有如下共同的特性,基本成为了标准: (1) 坐标系:WGS84 (2) 投影:墨卡托投影(Marcator,正轴等角圆柱投影) ------ ...

  3. 瓦片地图与geoserver发布

    本文主要包括以下内容 TileMill生成Tile影像金字塔(.mbtiles压缩文件) Mbutil(https://github.com/mapbox/mbutil)解压缩 Apache HTTP ...

  4. Cocos2d-JS中瓦片地图API

    为了访问瓦片地图,Cocos2d-JS中访问瓦片地图API,主要的类有:TMXTiledMap.TMXLayer和TMXObjectGroup等.1.TMXTiledMapTMXTiledMap是瓦片 ...

  5. cocos2dx进阶学习之瓦片地图编辑器

    之前学习了瓦片地图类,现在我们来学习下瓦片地图制作工具 这个是开源的工具,可以从网上下载,下面我们演示下怎么做地图 步骤1 将需要用到的图片放到一个目录下,比如我机器上就是d:\tiled,这些图片是 ...

  6. Cocos2d-X研究之v3.x瓦片地图具体解释

    在游戏开发过程中,我们会遇到超过屏幕大小的地图,比如即时战略游戏,使得玩家能够在地图中滚动游戏画面.这类游戏一般会有丰富的背景元素,假设直接使用背景图切换的方式,须要为每一个不同的场景准备一张背景图, ...

  7. cocos creator主程入门教程(九)—— 瓦片地图

    五邑隐侠,本名关健昌,10年游戏生涯,现隐居五邑.本系列文章以TypeScript为介绍语言. 这一篇介绍瓦片地图,在开发模拟经营类游戏.SLG类游戏.RPG游戏,都会使用到瓦片地图.瓦片地图地面是通 ...

  8. [转]OpenStreetMap/Google/百度/Bing瓦片地图服务(TMS)

    转自:https://blog.csdn.net/youngkingyj/article/details/23365849 开源与成熟商业的瓦片地图服务(TMS  2  WMTS),都有如下共同的特性 ...

  9. OpenLayers学习笔记(一)—在线加载谷歌影像地图&离线加载本地瓦片地图

    实现根据在线离线判断加载地图, 在线加载谷歌影响地图, 离线加载本地瓦片地图 作者: 狐狸家的鱼 Github: 八至 html代码 <div id="map" tabind ...

随机推荐

  1. 五种开源协议的比较(BSD,Apache,GPL,LGPL,MIT) – 整理

    当Adobe.Microsoft.Sun等一系列巨头开始表现出对”开源”的青睐时,”开源”的时代即将到来! 最初来自:sinoprise.com/read.php?tid-662-page-e-fpa ...

  2. 数据返回[数据库基础]——图解JOIN

    废话就不多说了,开始... 一.提要 JOIN对于接触过数据库的人,这个词都不生疏,而且很多人很清楚各种JOIN,还有很多人对这个懂得也不是很透辟,此次就说说JOIN操纵. 图片是很容易被接受和懂得, ...

  3. java 搭建webservice服务+testclient測试

    整理别人的日志: 一.什么是webservice 一种构建应用程序的普遍模型,能够在不论什么支持网络通信的操作系统中执行.一种新的web应用程序分支,能够公布.定位通过web调用.它是一个应用组件,为 ...

  4. XSS攻击:SOHU视频XSS漏洞导致其用户成为DDOS肉鸡

    XSS又叫CSS (Cross Site Script) ,跨站脚本攻击.恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入当中Web里面的html代码会被运行,从而达到恶意攻击用 ...

  5. Android学习笔记(1)

    几天开始看Mars老师的Java4Android视频教程. 开始几集都是介绍性的内容,我浏览了一下.主要是看了下Java变量部分. java变量主要由以下几种类型: 1.数值型 2.字符型 3.布尔型 ...

  6. BZOJ 2456: mode 水题

    2456: mode Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/problem.php? ...

  7. Lambda表达式实现有限状态机

    实现状态机有多种模式,其中最灵活而强大的方式是通过迁移表来实现,该方式的缺点之一是需要编写大量小块代码去支持迁移表.而在C#3.0中,可以以一种非常优雅的方式实现. 除了有限状态机外,还有有限自动机, ...

  8. 关于android开发添加菜单XML文件之后无法在R.java中生成ID的问题

    因为和同学分开做的android软件,现在想整合他做的界面部分,于是拷贝了res和src文件夹的文件,其中包括一个res.menu文件夹中的XML.但是每次将该文件导入到工程总无法自动在R.java中 ...

  9. 跳表SkipList

    原文:http://www.cnblogs.com/xuqiang/archive/2011/05/22/2053516.html 跳表SkipList   1.聊一聊跳表作者的其人其事 2. 言归正 ...

  10. java_DAO类基本设计

    package cn.itcast.oa.base; import java.util.List; public interface BaseDao<T> { void save(T en ...