`
810364804
  • 浏览: 782981 次
文章分类
社区版块
存档分类
最新评论

【Cocos2d-X开发学习笔记】第25期:游戏背景之瓦片地图集类(CCTMXTiledMap)的使用

 
阅读更多

本系列学习教程使用的是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

坐标除以图素高,结果才是所在图素的行数。

源码下载地址

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics