由於一張大的世界地圖或背景圖片往往可以由屈指可數的幾種地形來表示,每種地形對應於一張小的圖片,我們稱這些小的地形圖片為瓦片。把這些瓦片拼接在一起,組合成一個完整的地圖,這就是瓦片地圖集的基本原理。
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地圖編輯器,就可以開始制作可視化的地圖了。制定方法可以到網上下載教程,這里就不過多介紹了。制作完地圖保存為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;
if(!child)
break;
child->getTexture()->setAntiAliasTexParameters();
}
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);
有了CCTMXTiledMap對象,就可以獲取地圖屬性信息,遍歷地圖的圖層、圖素(或瓦片),做各種邏輯處理。
Cocos2D-x瓦片地圖集就介紹到這里。在TestCpp工程的TileMapTest測試項有大量tile地圖集的實例代碼值得參考學習。