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投影和失真磚塊。邊在左右,上下的邊不被支持。
相關文章
相關標籤/搜索