CCRect::CCRectContainsPoint详解

[b][i]本文为firedragonpzy原创,转载务必在明显处注明:
转载自【Softeware MyZone】原文链接: http://www.firedragonpzy.com.cn/index.php/archives/589[/i][/b]

   之前在博文http://firedragonpzy.iteye.com/blog/1585168写到了判断点击的是哪个精灵,代码和下面差不多,可参考下面代码:
CCRect MonsterSprite::atlasRect()
{
CCSize temp_size = this->getContentSize();
return CCRectMake( -temp_size.width/2, -temp_size.height/2, temp_size.width, temp_size.height );
}


bool MonsterSprite::containsTouchLocation( CCTouch *pTouch )
{
CCPoint p = this->convertTouchToNodeSpaceAR( pTouch );
CCLOG("%f", p.x);
CCLOG("%f", p.y);
return CCRect::CCRectContainsPoint( atlasRect(), this->convertTouchToNodeSpaceAR( pTouch ) );
}

最近,使用这代码时做缩放遇到了些许问题,缩放后,点击出现区域偏差,其中,temp_size感觉应该这么定义CCSize temp_size = this->boundingBox().size;,以为得缩放啊,还有另外一种定义法就是CCSize temp_size = this->getTexture()->getContentSize();一共这三种方法,但是建议使用第一种。
关于第二种,我把这个精灵点击事件的判断放在了精灵的内部,执行方法的时候肯定已经缩放了,要是再缩放,导致区域变小。
关于第三种,要是使用的纹理,plist,它获得的是存放精灵的纹理(plist)的大小,而不是精灵本身的大小,这样导致区域变大。
这样后就又带来疑惑了,我使用第一种,atlasRect()缩放了精灵,但是后面将点击点转换为相对于节点的坐标没有缩放啊,其实,方法内部已经实现了点像素的转换,接下来看看convertTouchToNodeSpaceAR的源码:
CCPoint CCNode::convertTouchToNodeSpaceAR(CCTouch *touch)
{
CCPoint point = touch->locationInView(touch->view());
point = CCDirector::sharedDirector()->convertToGL(point);
return this->convertToNodeSpaceAR(point);
}
再看看convertToNodeSpaceAR的源码:
CCPoint CCNode::convertToNodeSpaceAR(const CCPoint& worldPoint)
{
CCPoint nodePoint = convertToNodeSpace(worldPoint);
CCPoint anchorInPoints;
if( CC_CONTENT_SCALE_FACTOR() == 1 )
{
anchorInPoints = m_tAnchorPointInPixels;
}
else
{
anchorInPoints = ccpMult( m_tAnchorPointInPixels, 1/CC_CONTENT_SCALE_FACTOR() );
}

return ccpSub(nodePoint, anchorInPoints);
}这下子,你明白了吧……
呵呵,好了,今天就到这里啦……

你可能感兴趣的:(【tec】ios)