Tilemap的碰撞檢測
到目前需要檢測兩個部分,一是地圖的邊界,二是地圖中的牆壁。
我的Tilemap分爲兩個圖層,第一層爲地板,第二層爲牆,cocos2d-x提供了函數檢測目標位置是否爲牆。
首先將英雄座標轉化爲Tilemap座標
CCPoint HelloWorld::positionToTileCoord(cocos2d::CCPoint cocosCoord )
{
int x=cocosCoord.x / map->getTileSize().width;
int y=(((map->getMapSize().height-1)*map->getTileSize().height )-cocosCoord.y) / map->getTileSize().height;
return ccp(x,y);
}
添加地圖狀態
typedef enum{
Moveble=0,
Wall=1,
Enemy=2
}CollisionType;
添加碰撞檢測函數
HelloWorld::CollisionType HelloWorld::checkCollision(CCPoint heroPotion)
{
CCPoint tileCoord=positionToTileCoord(heroPotion);
//檢測是否超出地圖邊界
if (tileCoord.x<0 || tileCoord.x>map->getMapSize().width-1 ||
tileCoord.y<0 || tileCoord.y>map->getMapSize().height-1)
return Wall;
//判定目標座標是否爲牆壁
int tileGid=map->layerNamed(”wall")->tileGIDAt(tileCoord);
if(tileGid)
return Wall;
return Moveble;
}
在menuMoveCallback中進行碰撞檢測
CCPoint targetPosition=ccpAdd(heroSprite->getPosition(),moveByPosition);
if(checkCollision(targetPosition)==Wall)
{
return;
}