本系列学习教程使用的是cocos2d-x-2.1.4(最新版为3.0alpha0-pre) ,PC开发环境Windows7,C++开发环境VS2010
地图编辑器的详细使用请参考文章:《【Cocos2d-X开发学习笔记】游戏开发工具之Tiled地图编辑器的使用》
一、瓦片地图集类CCTMXTiledMap
瓦片地图集类CCTMXTiledMap是Cocos2D-X中支持Tiled地图编码数据文件形式的类,用于解析地图集的数据文
件。CCTMXTiledMap类的继承关系如下图所示。
瓦片地图集类具有如下几个特性。
<1> 每个图素都是一个精灵类。
<2> 每个图素的精灵类在需要时调用tileAt函数被创建。
<3> 每个图素都可以进行旋转缩放等设置。
<4> 在运行时可以添加和删除。
<5> 可以修改z轴顺序来改变遮挡关系。
<6> 每个图素可以设置锚点。
<7> 每个层都可以添加子节点。
<8> 每个图素可以有唯一的标签。
<9> 每个图素可以有唯一的z轴值。
<10> 每个对象组被放在CCArray数组中。
<11> 对象可以拥有自己的属性。
<12> 可以为地图、地图层、对象和对象组加入属性。
当然,使用CCTMXTiledMap类也有一些限制,比如每层只有一个地图集,不过这并不影响我们的使用。
CCTMXTiledMap类的常用函数如下图所示。
二、地图层类CCTMXLayer
地图由地图层组成,地图层是精灵帧批处理类的子类,继承关系如下图所示。除非层次被设置不可见,否则在创
建时层次都会被创建,设置为不可见的层次会在设置为可见时被创建。
地图层类可以设置cc_vertexz属性为整型数字。一旦这个属性被设置,所有图素的z轴深度值都被设置为这个值。
另外,cc_alpha_func属性默认被设置为0,如果希望某一层半透,那么可以设置cc_alpha_func的值,比如可以设置
为0.5。CCTMXLayer类的常用函数见下图所示。
三、地图精灵组类CCTMXObjectGroup
地图精灵组类CCTMXObjectGroup用于代表地图中的精灵组,其继承关系如下图所示。
CCTMXObjectGroup类的常用函数如下图所示。
四、地图项目实例
在Tiled地图编辑器中将地图编辑好后,便可以在程序中使用了。
1、首先新建Cocos2D-X项目,取名为“MyTMXMap”,然后在HelloWorldScene.cpp文件中的init函数中添加如下所示
代码。
bool HelloWorld::init() { bool bRet = false; do { CC_BREAK_IF(! CCLayer::init()); //通过编辑文件创建生成地图 CCTMXTiledMap *map = CCTMXTiledMap::create("Maps/orthogonal-test4.tmx"); addChild(map, 0, 1); //遍历每个图块并设置抗锯齿 CCArray* pChildrenArray = map->getChildren(); CCSpriteBatchNode* child = NULL; CCObject* pObject = NULL; CCARRAY_FOREACH(pChildrenArray, pObject) { child = (CCSpriteBatchNode*)pObject; if(!child) break; child->getTexture()->setAntiAliasTexParameters(); } bRet = true; } while (0); return bRet; }
2、实例运行效果图
五、普通视角地图获得对应位置图素项目实例
普通视角地图通过tileAt函数就可以获得相应位置的图素。只要注意传入的参数坐标并非点坐标,而是地图的行列坐
标即可。下面的项目实例就展示了如何获得地图四个角的图素,并将它们进行缩放处理。
1、直接在上面的实例项目中进行简单的代码修改即可,修改代码如下所示。
bool HelloWorld::init() { bool bRet = false; do { CC_BREAK_IF(! CCLayer::init()); //通过编辑文件创建生成地图 CCTMXTiledMap *map = CCTMXTiledMap::create("Maps/orthogonal-test4.tmx"); addChild(map, 0, 1); //遍历每个图块并设置抗锯齿 CCArray* pChildrenArray = map->getChildren(); CCSpriteBatchNode* child = NULL; CCObject* pObject = NULL; CCARRAY_FOREACH(pChildrenArray, pObject) { child = (CCSpriteBatchNode*)pObject; if(!child) break; child->getTexture()->setAntiAliasTexParameters(); } 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); bRet = true; } while (0); return bRet; }
2、实例运行效果图
一般情况下,通过具体位置获得地图的行列数需要一个转换。普通视角地图的转换很简单,如下代码所示。
总体的思路就是具体位置除以图素的宽高,但这里需要注意的,在y轴的处理上略有不同。因为Cocos2D-X中的坐
标系中,y轴是从下到上依次增加的,而地图中的行数则是从上到下增加的,这就需要做一个转换,用总的行数减去y
轴坐标除以图素高,结果才是所在图素的行数。
源码下载地址