cocos2dx之tileMap

tileMap用来做地图,把今天弄的bug很多的demo放上,仅作笔记~

******************************************************************************************************

新建工程,注意大小,在ios模拟器上的分辨率是480*320(横屏),device上是960*480;点击 菜单,地图,新图块,选择sample目录下的图(这个图后面也要复制到ios的resource路径里面),然后用图章工具任意拖动,生成一张地图,保存到ios的resource目录。

注意:默认的sample里面的图的边距是1,1。

用代码方法加载:

1 CCTMXTiledMap*  _tileMap = CCTMXTiledMap::create("test.tmx");
2 
3 addChild(_tileMap);

我们需要往上面添加精灵~然后走路等等,这是最基础的需求,好吧,我们开始~~~~

1,在上面添加对象图层:菜单,涂层,添加对象涂层,命名为objects

2,选中objects涂层,在左边的大图上看到变灰的区域,右键,对象属性,添加名称为SpawnPoint

3,用代码把精灵贴到这个对象所在的位置

 1     CCTMXObjectGroup* objects = _tileMap->objectGroupNamed("objects");
 2     CCDictionary*     spawnPoint = objects->objectNamed("SpawnPoint");
 3     
 4     int x = spawnPoint->valueForKey("x")->intValue();
 5     int y = spawnPoint->valueForKey("y")->intValue();
 6 
 7     _player = CCSprite::create("player.png");
 8     
 9     //精灵默认的anchorPoint是在中间的,我们调整为左下角
10     _player->setAnchorPoint(ccp(0,0));
11     _player->setPosition(ccp(x,y));
12     setViewPosition(_player->getPosition());
13 
14     addChild(_player);

 设置障碍物~

1,用tileMap添加一个新的图层,自己找一个图,添加个新图块,大小和区块的大小一致~(默认32*32)。

2,tileMap右下角选中新建的图块,右键,图块属性,随便添加一个属性,比如block,值为true。

3,自己在地图上选一些地方用新的这个图块盖上~

4,添加代码

我们现在判断是否能走路是有bug的,各种bug。。。。

1 CCPoint HelloWorld::tileCoordForPosition(CCPoint position)
2 {    
3     int x = position.x / _tileMap->getTileSize().width;
4     
5     int y = ((_tileMap->getMapSize().height * _tileMap->getTileSize().height) - position.y) / _tileMap->getTileSize().height;
6     
7     return ccp(x, y);
8 }
 1 bool HelloWorld::isPositionBlock(CCPoint position)
 2 {
 3     CCPoint tileCoord = this->tileCoordForPosition(position);
 4     int tileGid = _metaLayer->tileGIDAt(tileCoord);
 5     
 6     CCDictionary *properties = _tileMap->propertiesForGID(tileGid);
 7     
 8     if (properties)
 9     {
10         CCString* collision = const_cast<CCString*>(properties->valueForKey("block"));
11         
12         if ( 0 == strcmp(collision->getCString(), "true") )
13         {
14             return true;
15         }
16     }
17     
18     return false;
19 }

 ******************************************************************************************************

以下是全部代码

h文件

 1 private:
 2     CCSprite*       _player;//主角,精灵
 3     CCTMXTiledMap*  _tileMap;//地图
 4     CCTMXLayer*     _metaLayer;//地图层上的block层
 5     
 6     CCPoint tileCoordForPosition(CCPoint position);//把具体坐标转换为第几格的那种坐标
 7     bool isPositionBlock(CCPoint position);//position的位置能否走通的函数
 8     
 9     void setViewPosition(CCPoint pos);
10     
11     void registerWithTouchDispatcher(void);//添加Target级别的touch
12     
13     bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent);
14     void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent);
15     void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent);
16     void ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent);

cpp里面的init函数

 1    this->setTouchEnabled(true);
 2     
 3     _tileMap = CCTMXTiledMap::create("test.tmx");
 4     
 5     _metaLayer = _tileMap->layerNamed("Meta");
 6     _metaLayer->setVisible(false);
 7     
 8     CCTMXObjectGroup* objects = _tileMap->objectGroupNamed("objects");
 9     CCDictionary*     spawnPoint = objects->objectNamed("SpawnPoint");
10     
11     int x = spawnPoint->valueForKey("x")->intValue();
12     int y = spawnPoint->valueForKey("y")->intValue();
13 
14     _player = CCSprite::create("player.png");
15     
16     //精灵默认的anchorPoint是在中间的,我们调整为左下角
17     _player->setAnchorPoint(ccp(0,0));
18     _player->setPosition(ccp(x,y));
19     setViewPosition(_player->getPosition());
20 
21     addChild(_tileMap);
22     addChild(_player);
 1 CCPoint HelloWorld::tileCoordForPosition(CCPoint position)
 2 {    
 3     int x = position.x / _tileMap->getTileSize().width;
 4     
 5     int y = ((_tileMap->getMapSize().height * _tileMap->getTileSize().height) - position.y) / _tileMap->getTileSize().height;
 6     
 7     return ccp(x, y);
 8 }
 9 
10 bool HelloWorld::isPositionBlock(CCPoint position)
11 {
12     CCPoint tileCoord = this->tileCoordForPosition(position);
13     int tileGid = _metaLayer->tileGIDAt(tileCoord);
14     
15     CCDictionary *properties = _tileMap->propertiesForGID(tileGid);
16     
17     if (properties)
18     {
19         CCString* collision = const_cast<CCString*>(properties->valueForKey("block"));
20         
21         if ( 0 == strcmp(collision->getCString(), "true") )
22         {
23             return true;
24         }
25     }
26     
27     return false;
28 }
29 
30 void HelloWorld::setViewPosition(CCPoint pos)
31 {
32     CCSize winSize = CCDirector::sharedDirector()->getWinSize();
33     int x = fmax(pos.x,winSize.width/2);
34     int y = fmax(pos.y,winSize.height/2);
35     
36     x = fmin(x,(_tileMap->getContentSize().width-winSize.width/2));
37     y = fmin(y,(_tileMap->getContentSize().height-winSize.height/2));
38     
39     
40     this->setPosition(ccp(winSize.width/2-x,winSize.height/2-y));
41 }

添加touch事件

 1 void HelloWorld::registerWithTouchDispatcher(void)
 2 {
 3     CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, 0, true);
 4     
 5     return;
 6 }
 7 
 8 bool HelloWorld::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent)
 9 {
10     return true;
11 }
12 
13 void HelloWorld::ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent)
14 {
15     return;
16 }
17 
18 void HelloWorld::ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent)
19 {
20     //这里有算法bug,以后再说了
21     CCPoint viewPos = CCDirector::sharedDirector()->convertToGL(pTouch->getLocationInView());
22     CCPoint gamePos = convertToNodeSpace(viewPos);
23 
24     if ( !isPositionBlock(gamePos) )
25     {
26         if(fabs(gamePos.x-_player->getPosition().x)>=fabs(gamePos.y-_player->getPosition().y))
27         {
28             if(gamePos.x>=_player->getPosition().x)
29             {
30                 _player->setPosition(ccp(_player->getPosition().x+32,_player->getPosition().y));
31             }
32             else
33             {
34                 _player->setPosition(ccp(_player->getPosition().x-32,_player->getPosition().y));
35             }
36         }
37         else
38         {
39             if(gamePos.y>=_player->getPosition().y)
40             {
41                 _player->setPosition(ccp(_player->getPosition().x,_player->getPosition().y+32));
42             }
43             else
44             {
45                 _player->setPosition(ccp(_player->getPosition().x,_player->getPosition().y-32));
46             }
47         }
48         
49         setViewPosition(ccp(_player->getPosition().x,_player->getPosition().y));
50     }
51     
52     return;
53 }
54 
55 void HelloWorld::ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent)
56 {
57     return;
58 }
原文地址:https://www.cnblogs.com/ziyouchutuwenwu/p/3104203.html