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 }
總結
以上是生活随笔為你收集整理的cocos2dx之tileMap的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 求一副全村大门上的对则
- 下一篇: 消息称 Epic 将改变虚幻引擎收费方式