1. 程式人生 > >關於cocosdx載入tmx地圖和一些碰撞檢測的問題

關於cocosdx載入tmx地圖和一些碰撞檢測的問題

這篇文章將的是關於一些載入tmx地圖和實現精靈與金幣的碰撞檢測的問題。

寫這篇文章之前看了很多文章,是、但是個人感覺都說的不明瞭,所以我做出來之後就在微博上來與大家分享一個明瞭的方法,希望能對新手有所幫助。

首先我們需要一張地圖,這張地圖有一些屬性:

大家都看見這張地圖了,上面有地面和一些金幣,我們主要關注的是金幣,裡面有金幣和金圈還有五角星。

下面我們分別看看他們的屬性:

五角星:


圓圈:


金幣:


我們看見他們有一個共同的屬性:jewelType

下面我們直接上程式碼:

       //載入地圖
map=CCTMXTiledMap::create("3.tmx");
//獲取金幣層
layer=map->layerNamed("jewel");

       //將點選的點轉化為tilemap地圖上的網格座標
       CCPoint HelloWorld::covertPointToTiledCoord(CCPoint p)  
{  
int x = p.x / map->getTileSize().width;  
int y = ((map->getMapSize().height * map->getTileSize().height) - p.y) / map->getTileSize().height;  
CCLOG("%d   %d",x,y);
return ccp(x, y);  
}

    //touch函式,註釋很詳細就不解釋了

bool HelloWorld::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent)
{


//獲取點選座標
touchPoint=pTouch->getLocationInView();
//將點選座標轉化為GL座標
touchPoint=CCDirector::sharedDirector()->convertToGL(touchPoint);
sprite->runAction(CCMoveTo::create(1,ccp(touchPoint.x,touchPoint.y)));


//呼叫covertPointToTiledCoord函式將點選點轉化為tmxmap的座標格座標
tmxPoint=covertPointToTiledCoord(touchPoint);
//指定座標獲取GID
unsigned int m_gid = layer->tileGIDAt( tmxPoint); 
//根據GID,獲得屬性字典
CCDictionary *pKey=map->propertiesForGID(m_gid);
/* 取得格子的jewelType屬性值 */  
//int型
 int jewelType = pKey->valueForKey("jewelType")->intValue();
 //字元型
// const CCString* prop = pKey->valueForKey("jewelType"); 
return true;
}

  //我們在update函式裡面檢測sprite精靈是否包含金幣所在的點,是的話就removeTileAt掉

void HelloWorld::update(float delta)
{
CCRect spRect=sprite->boundingBox();
if (spRect.containsPoint(touchPoint))
{
//移除指定位置磚塊物件
layer->removeTileAt(tmxPoint);
}
}

這裡我們的程式碼就完了,由於只貼了cpp裡面的程式碼,沒有的大家可以在.h檔案裡面自己定義。

這裡我們做的功能是:

1.載入一張tmx地圖

2.獲取地圖裡面相應的金幣,圓圈和五角星的金幣裡面的位置

3.我們將touch裡面的函式轉換為map地圖裡面的格子座標

4.我們點選螢幕時讓精靈移動到螢幕點選的點

5.判斷精靈的Rect是否包含了金幣的座標,包含了就一處金幣,達到了一個吃金幣的效果

本文章大到此結束,大家輕噴,,,,,,,小毅