8、cocos2dx之TileMap

本文由qinning199原创,转载请注明:http://www.cocos2dx.net/?p=79java

1、Tiled Maplinux

砖块地图为了可以易用而建立,不管你的游戏是一个RPG,仍是platformer(平台游戏)或者是Breakout clone均可以灵活的应用在cocos2dx中,cocos2dx支持由开源项目TiledMap Editor创做的地图而且被存储为TMX格式。缓存

2、TMX 砖块地图格式编辑器

Cocos2d支持由Tiled创造的地图。工具

Tiled有两个版本:spa

         一个是java项目,能够运行在mac,window和linux中,是一个稳定的版本。.net

         一个QT项目,几乎支持全部java版本的功能。最新的QT版本号是0.4.0而且支持除了六边形地图以外的全部地图。code

用哪一个版本你能够本身决定,咱们建议使用QT版本,由于从如今开始这个版本是开发主线了,可是一些人也喜欢用java版本,由于不是全部旧的特性已经被移植过来了。orm

3、Cocos2d支持以下的TMX地图:对象

方向:

  正交地图

  等距地图

  六角地图(边在左右方向。边在上下的不被支持。貌似Tiled不支持他们)

砖块:

      被嵌入的砖块不被支持(是指:嵌入图片的砖块集)

         仅仅被嵌入的砖块集被支持(是指:砖块集被嵌入,可是不是它的图片)

         每层支持至多一个砖块集

图层:

你能够设置尽量多的图层。

经过一个CCTMXLayer(是一个CCSpriteSheet的子类)每一层Layer都将会在内部被呈现出来。

每个砖块能够经过CCSprite(它的父类是CCTMXLayer)呈现出来。

对象组:

       对象组也能够被支持。

4、坐标系和GIDS

坐标系:

被用在64*32地图中的坐标系是:

         (0,0):左上角

         (63,31):右下角

GIDA

砖块的GID是指砖块的全局标识。这是一个无符号int,从1到砖块的质量不等。

 

若是你有五种不一样的砖块,那么:

Tile 0将会有GID 1

         Tile 1将会有GID 2

         Tile 2将会有GID 3

         等等。

GID 0被用来展现一个空砖块

5、如何创造一个TMX节点

// 建立TMX地图
CCTMXTiledMap *map = CCTMXTiledMap::create("TileMaps/iso-test-vertexz.tmx");

addChild(map, 0, kTagTileMap);

// 全部的地图默认是失真的,若是你想建立非失真砖块,你须要添加入下代码:

//遍历全部的层(失真精灵管理者),而且设置他们为非失真

CCArray * pChildrenArray = map->getChildren();

CCSpriteBatchNode* child = NULL;

CCObject* pObject = NULL;

CCARRAY_FOREACH(pChildrenArray, pObject)
{
        child = (CCSpriteBatchNode*)pObject;

        if(!child)
            break;

        child->getTexture()->setAntiAliasTexParameters();
}

  

6、如何 get/add/delete/modify 一个砖块

获取一个砖块在特定的坐标:

CCTMXLayer* layer = map->layerNamed("Layer 0");

CCSprite *tile0 = layer->tileAt(ccp(1,63));

  

在特定坐标获取一个砖块的GID:

 

layer->setTileGID(m_gid, ccp((float)3, (float)3));

// 在特定坐标移除砖块

layer->removeTileAt( ccp(5.0, 5.0) );

 

  

 

在特定的坐标设置一个砖块的GID
layer->setTileGID(m_gid, ccp((float)3, (float)3));

// 在特定坐标移除砖块

layer->removeTileAt( ccp(5.0, 5.0) );

  

遍历一个Layer
CGSize s = layer->getLayerSize();

for( int x=0; x<s.width;x++) {

        for( int y=0; y< s.height; y++ ) {                 

                unsigned int tmpgid = layer->tileGIDAt(ccp(x,y));

                layer->setTileGID(tmpgid+1,ccp(x,y));

        }

}

  

等距地图和正交地图都是适用的。可是对六角地图不适用。
 
7、z-order和深度缓冲

 

若是你的游戏须要经过设置精灵的z值将精灵们放到特定砖块的以前或者以后,那么你又两个选择使用OpenGL ES深度缓冲

  • 使用多个TMX Layer和z-order

使用深度缓存

使用两个TMX层来建立一个地图是很是重要的:

  • 一个背景图层:例如:草地
  • 一个前景图层。例如:树木

 

草地图层将会放到精灵以后。那么它的vertexZ值应该是最低的值。好比:-1000.树的砖块图层将会有不一样的vertexZ值。在顶层的砖块将会比在底层的砖块有更高的vertexZ值。

  

那么,为了完成这些,你仅仅作以下这些就行:

         打开Tiled

         选择背景图层,好比草地

         Tiled—-Layer—–Layer属性

         添加cc_vertexz=-1000

         选择前景北京,好比树

         Tiled—–Layer—–Layer属性

         添加cc_vertexz=automatic

8、Cocos2d例子:

等距vertexZ例子。有两个层:树和草。为树层设置cc_vertex=automatic ,为草层设置cc_vertexz=-1000
正交顶点粒子。有两个层,树和草。为树层设置Cc_vertexz=automatic和cc_alpha_func=0.4,为草层设置cc_vertexz=-1000

使用多层TMX层和z-顺序

在地图中的每一层都将自动的设置zOrder值,那么在你的TMX编辑器中没有必要添加任何图层属性。添加一个TMXMap的子精灵须要你去动态的放置层中的地图对象。

 

CCSprite m_tamara = CCSprite::create(tamara.png);

CCPoint p = m_tamara->getPosition();

p = CC_POINT_POINTS_TO_PIXELS;

float newZ = -(p.y+32) /16;

m_tamara->setVertexZ( newZ );

 


截屏
正交地图,能够3D投射和消除锯齿砖块。使用精灵片修复工具砖块被“修正”了。
正交地图。地图的砖块大小比实际砖块小
等比地图。使用2d投影和失真砖块
六边形地图,2D投影和失真砖块。边在左右,上下的边不被支持。
相关文章
相关标签/搜索