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 }
  • 相关阅读:
    第七次上机练习
    第六次作业
    第六次上机练习
    第五次作业
    第五次上机练习
    第四次作业
    第四次上机练习
    第三次上机练习
    第三次作业
    第十一周上机练习
  • 原文地址:https://www.cnblogs.com/ziyouchutuwenwu/p/3104203.html
Copyright © 2011-2022 走看看