一、地圖座標
Tiled地圖一般常見的有3種不同的地圖類型,即:普通、45度、45度交錯,但是在所有類型的地圖中的座標都是按格子數算的,比如座標(0,0)代表左上角的第一個格子,需要注意的是,由於3種類型地圖的視角不同,所以座標的起始與分佈也有點差別,具體看下面幾張圖就明白了:
1、普通直角地圖座標
2、45度地圖座標
3、45度交錯地圖座標
二、地圖錨點
tiled地圖的錨點默認的是在左下角,也就是opengl座標系的(0,0)點,每一個瓦塊的錨點也是如此,同樣需要注意的是3種不同類型地圖的錨點位置會因爲視角的不同而有所差別,詳見下面幾張圖:
1、普通直角地圖錨點
2、45度地圖錨點
3、45度交錯地圖錨點
三、座標轉換
很明顯,tiled地圖上的座標不能直接用於在cocos的場景裏,因爲它們使用的座標系是不一樣的,所以如果要想正確的設置tiled地圖座標,必須對其座標進行轉換,關鍵代碼如下(以下轉換代碼是基於座標系對齊的情況下,即地圖處在默認位置未移動,否則需要考慮加減地圖座標):
1、普通直角地圖座標轉換
// OpenGL座標轉成格子座標
Vec2 tileCoordForPosition(const Vec2& position)
{
Size mapSize = tiledMap->getMapSize();
Size tileSize = tiledMap->getTileSize();
int x = position.x / tileSize.width;
int y = (mapSize.height*tileSize.height - position.y) / tileSize.height;
return Vec2(x, y);
}
// tile座標轉成瓦片格子中心的OpenGL座標
Vec2 positionForTileCoord(const Vec2& tileCoord)
{
Size mapSize = tiledMap->getMapSize();
Size tileSize = tiledMap->getTileSize();
int x = tileCoord.x * tileSize.width + tileSize.width/2;
int y = (mapSize.height-tileCoord.y)*tileSize.height - tileSize.height/2;
return Vec2(x, y);
}
2、45度地圖座標轉換
3、45度交錯地圖座標轉換
// OpenGL座標轉成格子座標
Vec2 staggeredCoordForPosition(CCPoint position)
{
Size mapSize = tiledMap->getMapSize();
Size tileSize = tiledMap->getTileSize();
int y = mapSize.height - 2 - ((2 * (int)position.y)/(int)tileSize.height);
float x = position.x/tileSize.width - (y % 2)/2.0f;
return Vec2(x, y);
}
// tile座標轉成瓦片格子中心的OpenGL座標
Vec2 positionForStaggeredCoord(const Vec2& StaggeredCoord)
{
Size mapSize = tiledMap->getMapSize();
Size tileSize = tiledMap->getTileSize();
int x = StaggeredCoord.x*tileSize.width + ((int)StaggeredCoord.y%2)*tileSize.width/2;
int y = (mapSize.height-(StaggeredCoord.y+1))*tileSize.height/2 - tileSize.height/2;
return Vec2(x, y);
}