關於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是否包含了金幣的座標,包含了就一處金幣,達到了一個吃金幣的效果
本文章大到此結束,大家輕噴,,,,,,,小毅