日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

cocos2dx之tileMap

發(fā)布時間:2024/8/26 综合教程 48 生活家
生活随笔 收集整理的這篇文章主要介紹了 cocos2dx之tileMap 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

tileMap用來做地圖,把今天弄的bug很多的demo放上,僅作筆記~

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

新建工程,注意大小,在ios模擬器上的分辨率是480*320(橫屏),device上是960*480;點(diǎn)擊 菜單,地圖,新圖塊,選擇sample目錄下的圖(這個圖后面也要復(fù)制到ios的resource路徑里面),然后用圖章工具任意拖動,生成一張地圖,保存到ios的resource目錄。

注意:默認(rèn)的sample里面的圖的邊距是1,1。

用代碼方法加載:

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

我們需要往上面添加精靈~然后走路等等,這是最基礎(chǔ)的需求,好吧,我們開始~~~~

1,在上面添加對象圖層:菜單,涂層,添加對象涂層,命名為objects

2,選中objects涂層,在左邊的大圖上看到變灰的區(qū)域,右鍵,對象屬性,添加名稱為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     //精靈默認(rèn)的anchorPoint是在中間的,我們調(diào)整為左下角
10     _player->setAnchorPoint(ccp(0,0));
11     _player->setPosition(ccp(x,y));
12     setViewPosition(_player->getPosition());
13 
14     addChild(_player);

設(shè)置障礙物~

1,用tileMap添加一個新的圖層,自己找一個圖,添加個新圖塊,大小和區(qū)塊的大小一致~(默認(rèn)32*32)。

2,tileMap右下角選中新建的圖塊,右鍵,圖塊屬性,隨便添加一個屬性,比如block,值為true。

3,自己在地圖上選一些地方用新的這個圖塊蓋上~

4,添加代碼

我們現(xiàn)在判斷是否能走路是有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);//把具體坐標(biāo)轉(zhuǎn)換為第幾格的那種坐標(biāo)
 7     bool isPositionBlock(CCPoint position);//position的位置能否走通的函數(shù)
 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函數(shù)

 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     //精靈默認(rèn)的anchorPoint是在中間的,我們調(diào)整為左下角
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 }

總結(jié)

以上是生活随笔為你收集整理的cocos2dx之tileMap的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。