由于一张大的世界地图或背景图片往往可以由屈指可数的几种地形来表示,每种地形对应于一张小的图片,我们称这些小的地形图片为瓦片。把这些瓦片拼接在一起,组合成一个完整的地图,这就是瓦片地图集的基本原理。
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;
CCArray* pChildrenArray = map->getChildren();
CCSpriteBatchNode* child = NULL;
CCObject* pObject = NULL;
CCARRAY_FOREACH(pChildrenArray, pObject)
{
child = (CCSpriteBatchNode*)pObject;
if(!child)
break;
break;
child->getTexture()->setAntiAliasTexParameters();
}
map->setAnchorPoint(ccp(0, 0));
}
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);
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)。