cocos2d-x 之 tiled map
http://1zien1.blog.163.com/blog/static/1378575682012711113312613/
1.限制tiled地图的移动区域
如果使用的tiled地图是矩形的话,限制地图的移动范围保持在视区内还是很好做的,但假如是45度角的非矩形区域,那么计算方法则有所不同【例如我现在的tiled地图是40*20】
以前,要获得tiled地图的长和宽可以用一下方法:
float mapWidth = pTmxMap->getMapSize().width * pTmxMap->getTileSize().width;
float mapHeight = pTmxMap->getMapSize().height * pTmxMap->getTileSize().height;
可在45度的非矩形地图中,地图大小则不能用以上方法获取,
横坐标和纵坐标的方块数不再是pTmxMap->getMapSize(),
而是float mapLength = (pTmxMap->getMapSize().width + pTmxMap->getMapSize().height)/2;
所以,45度非矩形地图的长宽可用一下方法获取:
float mapLength = (pTmxMap->getMapSize().width + pTmxMap->getMapSize().height)/2;
float mapWidth = mapLength * pTmxMap->getTileSize().width;
float mapHeight = mapLength * pTmxMap->getTileSize().height;
而且,45度非矩形区域的地图左下角坐标不再是(0, 0),可用一下方法获得
CCPoint tileZero;
tileZero.x = mapWidth - pTmxMap->getMapSize().width * pTmxMap->getTileSize().width;
tileZero.y = mapHeight - pTmxMap->getMapSize().height * pTmxMap->getTileSize().height;
以下是45度非矩形地图限制移动区域在视窗范围内的主要代码:
void TMXTest::ccTouchMoved( CCTouch *pTouch, CCEvent *pEvent )
{
CCPoint touchLocation = pTouch->locationInView();
CCPoint prevLoaction = pTouch->previousLocationInView();
touchLocation = CCDirector::sharedDirector()->convertToGL( touchLocation );
prevLoaction = CCDirector::sharedDirector()->convertToGL( prevLoaction );
CCPoint diff = ccpSub(touchLocation, prevLoaction);
CCTMXTiledMap *pTmxMap = (CCTMXTiledMap*)getChildByTag(TAG_TMXMAP);
diff = ccpAdd(diff, pTmxMap->getPosition());
float mapLength = (pTmxMap->getMapSize().width + pTmxMap->getMapSize().height)/2;
float mapWidth = mapLength * pTmxMap->getTileSize().width;
float mapHeight = mapLength * pTmxMap->getTileSize().height;
CCPoint tileZero;
tileZero.x = mapWidth - pTmxMap->getMapSize().width * pTmxMap->getTileSize().width;
tileZero.y = mapHeight - pTmxMap->getMapSize().height * pTmxMap->getTileSize().height;
diff.x = MAX(tileZero.x - mapWidth + 800, diff.x);
diff.x = MIN(tileZero.x, diff.x);
diff.y = MAX(tileZero.y - mapHeight + 480, diff.y);
diff.y = MIN(tileZero.y, diff.y);
pTmxMap->setPosition(diff);
}
注:45度矩形地图只是45度非矩形地图的一种特例,所以此方法同样适用在45度的矩形地图。

浙公网安备 33010602011771号