cocos2dx反向缩放图层

时间:2013-12-09 14:50:58

标签: c++ cocos2d-x

我有一个CCLayer,它包含我所有的游戏对象,并且我已经实现了缩放和滚动。为了确保你不能滚出界限,我正在计算一个代表屏幕的矩形并用它来检查矩形是否在界限范围内。问题是我的计算错了。该图层由scaleFactor缩放,如下所示:

 world->setScale(scaleFactor);

然后我计算滚动矩形:

float scrollWidth =  winSize.width * ( 1 / scaleFactor); // winSize is the size of the screen (1280x
float scrollHeight =  winSize.height * ( 1 / scaleFactor);
if(scrollRect.l < 0) scrollRect.l = 0;
if(scrollRect.l + scrollWidth > levelWidth) scrollRect.l -= (scrollRect.l + scrollWidth - levelWidth);
scrollRect.r = scrollRect.l + scrollWidth;

world->setPosition(-scrollRect.l, -scrollRect.b);

(比例因子值介于1.0和0.5之间)

这种方法有效,但只有当图层缩小到最大值或放大到最小值但是当scaleFactor不是MAX / MIN时它才是错误的(有一些左边空格)。 我究竟做错了什么?我也尝试过更改锚点(它们目前设置为0,0)但没有任何成功。

1 个答案:

答案 0 :(得分:2)

无论你的比例因素如何,你都可以做到这一点...... 这里_tileMap是你的世界

//获取差异的代码b / w两个位置

CCTouch *fingerOne = (CCTouch*)touchArray->objectAtIndex(0);

CCPoint newTouchLocation = fingerOne->getLocationInView();
newTouchLocation = CCDirector::sharedDirector()->convertToGL(newTouchLocation);
newTouchLocation=_tileMap->convertToNodeSpace(newTouchLocation);

CCPoint oldTouchLocation = fingerOne->getPreviousLocationInView();
oldTouchLocation = CCDirector::sharedDirector()->convertToGL(oldTouchLocation);
oldTouchLocation = _tileMap->convertToNodeSpace(oldTouchLocation);

//get the difference in the finger touches when the player was dragging
CCPoint difference = ccpSub(newTouchLocation, oldTouchLocation);
CCPoint ASD=ccpAdd(_tileMap->getPosition(), ccpMult(difference, _tileMap->getScale()));
CCPoint bottomLeft =ASD;

// Bounding Box....
if (bottomLeft.x >0) {
    bottomLeft.x = 0;
}
if (bottomLeft.y>0) {
    bottomLeft.y = 0;
}
if (bottomLeft.x < -(mapWidth*_tileMap->getScale() - _screenSize.width)) {
    bottomLeft.x = -(mapWidth*_tileMap->getScale()- _screenSize.width);
}
if (bottomLeft.y <-(mapHieght*_tileMap->getScale() - _screenSize.height)) {
    bottomLeft.y = - (mapHieght*_tileMap->getScale() - _screenSize.height);
}
_tileMap->setPosition(bottomLeft);

我希望这对你有帮助..