cocos2d-x tiledMap CCTMXTiledMap的使用

资源文件:http://pan.baidu.com/s/1qWAqI5m

test.tmx文件内容:

<?xml version="1.0" encoding="UTF-8"?>
<map version="1.0" orientation="orthogonal" width="15" height="12" tilewidth="32" tileheight="32">
 <tileset firstgid="1" name="res" tilewidth="32" tileheight="32" spacing="1" margin="1">
  <image source="tmw_desert_spacing.png" width="265" height="199"/>
 </tileset>
 <layer name="background" width="15" height="12">
  <data encoding="base64" compression="zlib">
   eJyTY2BgkKMQa0AxMh9dDpe8JBBLEYml0exVBGIVINYigFWBWBmLXnQxbBibOmrpVQBiPSiNjGllrw6OsESOA10sejXRwlObSLmBwADOnRaD
  </data>
 </layer>
 <objectgroup name="Objects" width="15" height="12">
  <object name="hero" x="32" y="320" width="32" height="32"/>
 </objectgroup>
</map>


HelloWorldScene.h

#ifndef __HELLOWORLD_SCENE_H__
#define __HELLOWORLD_SCENE_H__

#include "cocos2d.h"

class HelloWorld : public cocos2d::CCLayer
{
public:
    // Here's a difference. Method 'init' in cocos2d-x returns bool, instead of returning 'id' in cocos2d-iphone
    virtual bool init();  

    // there's no 'id' in cpp, so we recommend returning the class instance pointer
    static cocos2d::CCScene* scene();
    
    // a selector callback
    void menuCloseCallback(CCObject* pSender);
    
    // implement the "static node()" method manually
    CREATE_FUNC(HelloWorld);

private:

	cocos2d::CCSprite *m_player;
	cocos2d::CCTMXTiledMap *m_tileMap;
	cocos2d::CCTMXLayer *m_background;
};

#endif // __HELLOWORLD_SCENE_H__


HelloWorldScene.cpp

#include "HelloWorldScene.h"

USING_NS_CC;

#define CFG_TEST

void YWPrint(const char *format, ...)
{
#ifdef CFG_TEST
	char buffer[1024] = {0};
	va_list args;
	va_start(args, format);
	vsnprintf(buffer,1024, format, args);
	va_end(args);
	printf("%s", buffer);
#endif
}
void YWAssert(bool cond,const char *msg =NULL)
{
#ifdef CFG_TEST
	if(cond){return;}
	printf("WCAssert failed:%s\n", msg);
	assert(cond);
#endif
}

CCScene* HelloWorld::scene()
{
    // 'scene' is an autorelease object
    CCScene *scene = CCScene::create();
    
    // 'layer' is an autorelease object
    HelloWorld *layer = HelloWorld::create();

    // add layer as a child to scene
    scene->addChild(layer);

    // return the scene
    return scene;
}

// on "init" you need to initialize your instance
bool HelloWorld::init()
{
    //
    // 1. super init first
    if ( !CCLayer::init() )
    {
        return false;
    }
    
    CCSize winSize = CCDirector::sharedDirector()->getVisibleSize();
    
	//init tiled map
	m_tileMap = CCTMXTiledMap::create("test.tmx");
	YWAssert(NULL != m_tileMap);
    m_background = m_tileMap->layerNamed("background");
	YWAssert(NULL != m_background);

	m_tileMap->setAnchorPoint(ccp(0.5, 0.5));
	m_tileMap->setPosition(winSize.width / 2.0, winSize.height / 2.0);
	this->addChild(m_tileMap);

	//get hero objects
	CCTMXObjectGroup *objGroup = m_tileMap->objectGroupNamed("Objects");
	YWAssert(NULL != objGroup);
	CCDictionary *dicHero = objGroup->objectNamed("hero");
	YWAssert(NULL != dicHero);

	
	//get hero position
	m_player = CCSprite::create("player.png");
	YWAssert(NULL != m_player);
	CCPoint pt = ccp(dicHero->valueForKey("x")->floatValue(), dicHero->valueForKey("y")->floatValue());
	m_player->setPosition(pt);
	this->addChild(m_player);

    return true;
}


void HelloWorld::menuCloseCallback(CCObject* pSender)
{
#if (CC_TARGET_PLATFORM == CC_PLATFORM_WINRT) || (CC_TARGET_PLATFORM == CC_PLATFORM_WP8)
	CCMessageBox("You pressed the close button. Windows Store Apps do not implement a close button.","Alert");
#else
    CCDirector::sharedDirector()->end();
#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
    exit(0);
#endif
#endif
}

由于一张大的世界地图或背景图片往往可以由屈指可数的几种地形来表示,每种地形对应于一张小的图片,我们称这些小的地形图片为瓦片。把这些瓦片拼接在一起,组合成一个完整的地图,这就是瓦片地图集的基本原理。   


      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的主要属性和方法。




下面就是将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对象,就可以获取地图属性信息,遍历地图的图层、图素(或瓦片),做各种逻辑处理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值