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度的矩形地图。

posted @ 2013-06-18 17:02  六界剑仙  阅读(232)  评论(0)    收藏  举报