cocos2d-x-Tiled 地圖座標 轉換

一、地圖座標

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);
}





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章