由于一张大的世界地图或背景图片往往可以由屈指可数的几种地形来表示,每种地形对应于一张小的图片,我们称这些小的地形图片为瓦片。把这些瓦片拼接在一起,组合成一个完整的地图,这就是瓦片地图集的基本原理。

Cocos2D-x中支持两种瓦片地图集格式:一种是*.tag文件格式,一种是*.tmx文件格式。

·*.tag文件格式一般采用photoshop生成,在Cocos2D-x中为了兼容性仍保留,目前已经不推荐使用这种方式拼图。虽然如此,我们还是简单了解一下。Cocos2D-x通过类CCTileMapAtlas支持这种方式,类继承关系图如下:

    这里就不去查看CCTileMapAtlas的内部结构和实现原理了,只简单看一下它的使用方法。
     CCTileMapAtlas* tilemap = CCTileMapAtlas::tileMapAtlasWithTileFile("TileMaps/tiles.png","TileMaps/levelmap.tga",16,16);
     tilemap->releaseMap();
   
    ·*.tmx文件格式采用tile地图编辑器生成。有了tile地图编辑器后,地图编辑变得更方便和强大。tile地图编辑器的设计原理是,地图由多个图层组成,每个图层又由多个图素(或瓦片)拼接而成。值得一提的是,在tile地图编辑器中,存在两种图层:一个为图素(或瓦片)拼接的图层,另一个是物体层。
    下面看一下,Cocos2D-x如何支持tile地图。
    类CCTMXTiledMap实现地图,它支持解析tile地图编辑器产生的tmx文件格式地图数据。
   
    CCTMXTiledMap的内部结构和功能如下:
    · CCTMXTiledMap属性:
       CCSize m_tMapSize:地图背景大小     
       CCSize m_tTileSize:图素(或瓦片)大小
       CCArray* m_pObjectGroups:物体层中对象容器
       CCDictionary* m_pProperties:地图属性
      
    · CCTMXTiledMap方法:
      //创建(初始化)地图
      static CCTMXTiledMap* tiledMapWithTMXFile(const char *tmxFile)
      static CCTMXTiledMap* tiledMapWithXML(const char* tmxString, const char* resourcePath)
      static CCTMXTiledMap* create(const char *tmxFile)
      static CCTMXTiledMap* createWithXML(const char* tmxString, const char* resourcePath)
      bool initWithTMXFile(const char *tmxFile)
      bool initWithXML(const char* tmxString, const char* resourcePath)
 
      CCTMXLayer* layerNamed(const char *layerName):根据图层名获得拼接图层
      CCTMXObjectGroup* objectGroupNamed(const char *groupName):根据物体层名获得物体层
      CCString *propertyNamed(const char *propertyName):根据属性名获得数值
      CCDictionary* propertiesForGID(int GID):根据GID获得属性字典
 
    以上就是CCTMXTiledMap的主要属性和方法,它作为地图对象,包含了tile编辑器的拼接信息,能够访问地图的图素、拼接图层、物体层和自身的属性。
 
    类CCTMXLayer实现拼接图层,拼接图层中包括了很多的图素(即精灵对象),但是它们使用同一张纹理图片,所以拼接地图能够有些快的绘制速度。CCTMXLayer之所以能做到这一点,是因为它是从CCSpriteBatchNode继承而来,这个类应该不陌生,之前有过介绍,就是用来提高精灵绘制效率的。CCTMXLayer的类继承关系图如下:
   
    CCTMXLayer的内部结构和功能,如下:
    · CCTMXLayer属性:
       CCSize m_tLayerSize:拼接图层大小
       CCSize m_tMapTileSize:图素(或瓦片)的大小
       CCTMXTilesetInfo* m_pTileSet:图素(或瓦片)属性信息
       CCDictionary* m_pProperties:拼接图层的属性字典
 
    · CCTMXLayer方法:
       //创建(或初始化)拼接图层对象
       static CCTMXLayer * layerWithTilesetInfo(CCTMXTilesetInfo *tilesetInfo, CCTMXLayerInfo *layerInfo, CCTMXMapInfo *mapInfo)
       static CCTMXLayer * create(CCTMXTilesetInfo *tilesetInfo, CCTMXLayerInfo *layerInfo, CCTMXMapInfo *mapInfo)
       bool initWithTilesetInfo(CCTMXTilesetInfo *tilesetInfo, CCTMXLayerInfo *layerInfo, CCTMXMapInfo *mapInfo)
      
       void releaseMap():释放图层中图素(或瓦片)的拼接信息
       CCSprite* tileAt(const CCPoint& tileCoordinate):返回指定位置的图素(或瓦片)对象
       unsigned int  tileGIDAt(const CCPoint& tileCoordinate):返回指定位置的图素(或瓦片)的对象ID
       unsigned int tileGIDAt(const CCPoint& tileCoordinate, ccTMXTileFlags* flags):返回指定位置的图素(或瓦片)的对象ID
       void removeTileAt(const CCPoint& tileCoordinate):移除指定位置的图素(或瓦片)对象
       CCPoint positionAt(const CCPoint& tileCoordinate):返回指定坐标的地图位置
       CCString *propertyNamed(const char *propertyName):返回指定属性数值
       void setupTiles():创建图层中的图素(或瓦片)
       const char* getLayerName():获得拼接图层名
       void setLayerName(const char *layerName):设置拼接图层名
  
    以上就是CCTMXLayer的主要属性和方法,它们都是与拼接图层数据有关的函数。
 
    类CCTMXObjectGroup实现物体层,它是从基类CCObject继承而来。此图层内的数据,并不是按照地图的网格来划分,而是由一个个对象组成。物体层更适合作为一个存放的容器类。每一个CCTMXObjectGroup对象中都包换多个CCTMXobject对象。通过遍历容器可以访问图层内的精灵对象。
    CCTMXObjectGroup的内部结构和功能如下:
    · CCTMXObjectGroup属性:
       CCPoint m_tPositionOffset:物体层的偏移量
       CCDictionary* m_pProperties:物体层的属性字典
       CCArray* m_pObjects:物体对象容器   
       std::string m_sGroupName:物体层名  
 
    · CCTMXObjectGroup方法:
       const char* getGroupName():获得物体层名
       void setGroupName(const char *groupName):设置物体层名
       CCString *propertyNamed(const char* propertyName):获得指定属性的数值
       CCDictionary* objectNamed(const char *objectName):根据属性名返回属性字典
 
    以上就是CCTMXObjectGroup的主要属性和方法。
 
    现在Cocos2D-x瓦片地图集基本实现原理,以及相关的类和方法都有所了解,下面我们就来使用它。
    从网上下载Tiled地图编辑器(Qt版本),然后进行安装。打开界面如下:
   
    
    通过Tiled地图编辑器,就可以开始制作可视化的地图了。制定方法可以到网上下载教程,这里就不过多介绍了。制作完地图保存为tmx格式地图文件,如下:
   
    下面就是将tmx文件加载到程序中使用,代码如下:
    CCLayer* pLayer = CCLayer::create(); //创建布景层
    CCTMXTiledMap* map = CCTMXTiledMap::create("test.tmx");//创建map对象
    pLayer->addChild(map, 0, 1);//将map对象添加到CCNode节点
 
    //对Map对象的操作
    CCSize s1 = map->getContentSize();
    CCArray* pChildrenArray = map->getChildren();
    CCSpriteBatchNode* child = NULL;
    CCObject* pObject = NULL;
    CCARRAY_FOREACH(pChildrenArray, pObject)
    {
        child = (CCSpriteBatchNode*)pObject;
        if(!child)
            break;
        child->getTexture()->setAntiAliasTexParameters();
    }
    map->setAnchorPoint(ccp(0, 0));
    CCTMXLayer* layer = map->layerNamed("Layer 0");
    CCSize s = layer->getLayerSize();
    CCSprite* sprite;
    sprite = layer->tileAt(ccp(0,0));
    sprite->setScale(2);
    sprite = layer->tileAt(ccp(s.width-1,0));
    sprite->setScale(2);
    sprite = layer->tileAt(ccp(0,s.height-1));
    sprite->setScale(2);
    sprite = layer->tileAt(ccp(s.width-1,s.height-1));
    sprite->setScale(2);
 
    有了CCTMXTiledMap对象,就可以获取地图属性信息,遍历地图的图层、图素(或瓦片),做各种逻辑处理。
    Cocos2D-x瓦片地图集就介绍到这里。在TestCpp工程的TileMapTest测试项有大量tile地图集的实例代码值得参考学习。
-------------------------------------------------------------------------------------------------------------------

注:本人在本博客的原创文章采用创作共用版权协议http://creativecommons.org/licenses/by-nc-sa/2.5/cn/), 要求署名、非商业用途和保持一致。要求署名包含注明我的网名及文章来源(我的博客地址:http://www.cnblogs.com/binbingg)。

[原创]cocos2d-x研习录-第三阶 特性之瓦片地图集的更多相关文章

  1. [原创]cocos2d-x研习录-第三阶 特性之物理引擎

    游戏物理引擎是指在游戏中涉及物理现象的逻辑处理,它用于模拟现实世界的各种物理规律(如赛车碰撞.子弹飞行.物体掉落等),让玩家能够在游戏中有真实的体验. Cocos2D-x中支持Box2D和Chipmu ...

  2. [原创]cocos2d-x研习录-第三阶 特性之粒子系统

    我想接触过游戏引擎的同学,对粒子系统应该不会陌生.它用于解决由大量按一定规则运动(变化)的微小物质在计算机上的生成和显示问题.粒子系统在游戏中有着非常广泛的应用,可以模拟很多现象,如火花.爆炸.烟雾. ...

  3. [原创]cocos2d-x研习录-第三阶 特性之调度器

    在游戏中,经常会周期执行一些检测.操作或更新一些数据等,我们称之为调度.Cocos2D-x中将调度封装为类CCScheduler,方便在游戏开发中使用.我们一起来学习一下,CCScheduler具有哪 ...

  4. [原创]cocos2d-x研习录-第三阶 特性之动作

    在前面的Cocos2D-x的概念类中,我们了解到节点类CCNode.导演类CCDirector.场景类CCScene.布景层类CCLayer和精灵类CCSprite等,这些类都是构成游戏画面的基本元素 ...

  5. [原创]cocos2d-x研习录-第三阶 特性之按键与虚拟键盘

    Cocos2D-x引擎支持按键事件,它能检测设备的键盘输入并处理相应的事件.而基于不同操作系统的移动设备,可供用户操作的按键数量和功能都存在差异.   Cocos2D-x使用CCKeypadDeleg ...

  6. [原创]cocos2d-x研习录-第三阶 特性之加速度传感器

    智能手机的游戏与应用中,也经常会用到加速传感器事件来丰富用户的体验,比如飞翔的企鹅(英文AirPenguin)游戏就是通过加速度传感器来控制角色的移动和跳跃方向.下面学习Cocos2D-x中如何使用加 ...

  7. [原创]cocos2d-x研习录-第三阶 特性之触屏

    游戏跟视频最大的区别就是互动,而手游(基于智能手机)主要靠触摸屏幕.重力传感和虚拟键盘等方式实现互动.这里主要记录Cocos2D-x对玩家触屏操作的处理. 在Cocos2D-x中触屏分为单点触屏和多点 ...

  8. [原创]cocos2d-x研习录-第三阶 多分辨率适配器

    在移动终端(智能手机)平台下开发游戏一般都会涉及到屏幕多分辨率适配问题,原因是手机款式多种多样,不同的款式存在有不同的尺寸,即使尺寸相同又可能存在不同的分辨率. 手机屏幕尺寸:指手机屏幕对角线长度. ...

  9. [原创]cocos2d-x研习录-第三阶 背景音乐和音效

    在游戏中,音效是一个不可或缺的部分,它可以为我们的游戏增加效果.音效在游戏中一般分为长时间的背景音乐和短促的特效音乐.Cocos2D-x支持多种常见音乐格式(mp3.wav等). Cocos2D-x提 ...

随机推荐

  1. 【python】实用函数啥的

    1.测试运行时间/效率 t = time() print time() -t 2.C:\python344\Scripts   easy_install.exe ,提供包的名字,可以自动下载+装包 3 ...

  2. MySQL中DATETIME、DATE和TIMESTAMP类型的区别

    一.TIMESTAMP 显示格式:YYYY-MM-DD HH:MM:SS 时间范围:[ '1970-01-01 00:00:00'到'2037-12-31 23:59:59'] TIMESTAMP D ...

  3. ionic2 图片上传

    参考URL:https://github.com/dsgriffin/Ionic-2-File-Transfer-Example

  4. Java 自定义注解

    在spring的应用中,经常使用注解进行开发,这样有利于加快开发的速度. 介绍一下自定义注解: 首先,自定义注解要新建一个@interface,这个是一个注解的接口,在此接口上有这样几个注解: @Do ...

  5. E-Form++图形可视化源码库新增同BCGSoft的Ribbon结合示例

    2015年11月20日,来自UCanCode E-Form++源码库的开发团队消息,E-Form++正式提供了同BCGSoft的Ribbon界面风格相结合的示例,如下图: 下载此示例请访问: http ...

  6. PYTHON实现DES加密及base64源码

    要求是实现DES加密,解密,我是用python实现的,还是有挺多坑的,改bug就改了挺久,加密实现后,解密过程就比较轻松. 另外,附加base64编码源码 要求:输入秘钥为64位二进制数(有效位为56 ...

  7. 判断是否存在哈密顿路--HDU 5424

    题意:给一张无向图,判断是否是哈密顿图. 哈密顿路:经过每个点有且仅有一次的一条通路. 方法:每次找度数最小的点作为起点,然后dfs整个图,看能遍历到的点的数目能否达到n. #include<i ...

  8. 如何评价苹果中国官网 iOS 8 介绍页面的文案「开发者的大事、大快所有人心的大好事」?[转自知乎]

    在什么是「苹果式中文」答案中,小七得出了这个结论: 「苹果式中文」是指句子结构破碎,经常缺乏主语,滥用排比,顶真,偏正短语,和不恰当四字词的广告文体. (有关什么是苹果式中文,小七原来贴错地方了TAT ...

  9. Ansible-Tower快速入门-3.快速开始【翻译】

    快速开始 当你完成安装tower后,我们应该完成接下来的一些任务,并通过使用tower,快速设置和启动我们的第一个ansible playbooks.这第一个playbooks的启动会执行简单的ans ...

  10. IOS 更改百度地图的定位图片

    使用了百度地图的SDK,定位图片一直是蓝色的小圆点,很不喜欢,想换成自定义的图片,在网上搜罗了一大通,找到了解决的方案. 写下如下代码: //定位图层自定义样式参数 BMKLocationViewDi ...