`
fireDragonpzy
  • 浏览: 463236 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

CCRect::CCRectContainsPoint详解

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


   之前在博文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);
}这下子,你明白了吧……
呵呵,好了,今天就到这里啦……
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics