cocos2d-x 地圖隨英雄移動
阿新 • • 發佈:2019-02-04
void TiledMapTestScene::setCneterPointOfView( CCPoint p )
{
//因為這裡是要通過傳入的點p來顯示設定CCLayer的位置,p為英雄座標,當做顯示中心點。
//TileMap的size肯定大於WinSize(解析度),不然有黑邊,而且也不用移動地圖了。
//因此p的x、y的值肯定要大於等於螢幕中心的值
int x = MAX(p.x , winSize.width / 2);
int y = MAX(p.y , winSize.height / 2);
//同理,p的x、y要小於等於TileMap的size的寬高減去WinSize的中心值,不然也會出現黑邊
x = MIN(x,mapSize.width * tileSize.width - winSize.width / 2);
y = MIN(y,mapSize.height * tileSize.height - winSize.height / 2);
/*這裡是用地圖中心的真實座標減去螢幕中心座標來得到兩個中心之差(
真實中心肯定為螢幕中心右上部),得到的差值就是TileMap的偏移值(其x、y都為非正數)。
重點:由於CClayer為了初始化位置是始終顯示到螢幕左下角方便,因此其錨點為(0,0),
剛好可以把以上求得的偏移值作為其座標。*/
CCPoint actualPosition = ccp(x,y);
CCPoint winCenter = ccp(winSize.width / 2 , winSize.height /2);
CCPoint viewPosition = ccpSub(winCenter,actualPosition);
this->setPosition(viewPosition);
}
{
//因為這裡是要通過傳入的點p來顯示設定CCLayer的位置,p為英雄座標,當做顯示中心點。
//TileMap的size肯定大於WinSize(解析度),不然有黑邊,而且也不用移動地圖了。
//因此p的x、y的值肯定要大於等於螢幕中心的值
int x = MAX(p.x , winSize.width / 2);
int y = MAX(p.y , winSize.height / 2);
//同理,p的x、y要小於等於TileMap的size的寬高減去WinSize的中心值,不然也會出現黑邊
x = MIN(x,mapSize.width * tileSize.width - winSize.width / 2);
y = MIN(y,mapSize.height * tileSize.height - winSize.height / 2);
/*這裡是用地圖中心的真實座標減去螢幕中心座標來得到兩個中心之差(
真實中心肯定為螢幕中心右上部),得到的差值就是TileMap的偏移值(其x、y都為非正數)。
重點:由於CClayer為了初始化位置是始終顯示到螢幕左下角方便,因此其錨點為(0,0),
剛好可以把以上求得的偏移值作為其座標。*/
CCPoint actualPosition = ccp(x,y);
CCPoint winCenter = ccp(winSize.width / 2 , winSize.height /2);
CCPoint viewPosition = ccpSub(winCenter,actualPosition);
this->setPosition(viewPosition);
}