zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    hadoop再次集群搭建(3)-如何选择相应的hadoop版本
    48. Rotate Image
    352. Data Stream as Disjoint Interval
    163. Missing Ranges
    228. Summary Ranges
    147. Insertion Sort List
    324. Wiggle Sort II
    215. Kth Largest Element in an Array
    快速排序
    280. Wiggle Sort
  • 原文地址:https://www.cnblogs.com/ziyouchutuwenwu/p/3104203.html
Copyright © 2011-2022 走看看