cocos2d-x 和cocos2d 中CCRectContainsPoint的不同
1个回答
展开全部
在游戏制作中往往会用到TouchMoveEvent,在cocos2dx中有如下三个方法:
virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent);
virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent);
virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent);
早这几个方法中我们会获得点击的点:
touchMove = pTouch->getLocation();
moveLayerPos = moveLayer->getPosition();
然后判断点的位置是否存在我们需要的精灵:
if (CCRectContainsPoint(nodePos,spCover->boundingBox()))
{ XXXXX //如果存在。。我们需要做的事情}
最近在做cocos项目的时候发现cocos2d-x 和cocos2d 中CCRectContainsPoint实现是不同的,主要体现在边界的问题上,这都是一些小细节,如果不是很认真的话,这种错误越到最后往往越难以发现。首先我们看看cocos2d-x是如何实现CCRectContainsPoint
bool CCRect::CCRectContainsPoint(const CCRect& rect, const CCPoint& point)
{
return rect.containsPoint(point);
}
继续往下看:
bool CCRect::containsPoint(const CCPoint& point) const
{
bool bRet = false;
if (point.x >= getMinX() && point.x <= getMaxX()//注意这里的等号
&& point.y >= getMinY() && point.y <= getMaxY())//注意这里的等号
{
bRet = true;
}
return bRet;
}
也就是说这里的范围的上限和下线全部在计算范围之内,按理说这是不应该的,因为如果这样计算和可能会出现重叠的地方(边界)。
cocos2d就很好的避免了这个重叠:
CG_EXTERN bool CGRectContainsPoint(CGRect rect, CGPoint point)
虽然看不到具体实现,但我测试结果是范围不包括上临界值。
为了避免重叠出现,于是我重写了一个方法:就是把边界值去掉
bool LevelScene::CCRectContainsPoint(const CCPoint& point,const CCRect& rect)
{
bool bRet = false;
if (point.x >= rect.origin.x && point.x < (rect.size.width+rect.origin.x)
&& point.y >= rect.origin.y && point.y < (rect.size.height+rect.origin.y))
{
bRet = true;
}
return bRet;
}
virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent);
virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent);
virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent);
早这几个方法中我们会获得点击的点:
touchMove = pTouch->getLocation();
moveLayerPos = moveLayer->getPosition();
然后判断点的位置是否存在我们需要的精灵:
if (CCRectContainsPoint(nodePos,spCover->boundingBox()))
{ XXXXX //如果存在。。我们需要做的事情}
最近在做cocos项目的时候发现cocos2d-x 和cocos2d 中CCRectContainsPoint实现是不同的,主要体现在边界的问题上,这都是一些小细节,如果不是很认真的话,这种错误越到最后往往越难以发现。首先我们看看cocos2d-x是如何实现CCRectContainsPoint
bool CCRect::CCRectContainsPoint(const CCRect& rect, const CCPoint& point)
{
return rect.containsPoint(point);
}
继续往下看:
bool CCRect::containsPoint(const CCPoint& point) const
{
bool bRet = false;
if (point.x >= getMinX() && point.x <= getMaxX()//注意这里的等号
&& point.y >= getMinY() && point.y <= getMaxY())//注意这里的等号
{
bRet = true;
}
return bRet;
}
也就是说这里的范围的上限和下线全部在计算范围之内,按理说这是不应该的,因为如果这样计算和可能会出现重叠的地方(边界)。
cocos2d就很好的避免了这个重叠:
CG_EXTERN bool CGRectContainsPoint(CGRect rect, CGPoint point)
虽然看不到具体实现,但我测试结果是范围不包括上临界值。
为了避免重叠出现,于是我重写了一个方法:就是把边界值去掉
bool LevelScene::CCRectContainsPoint(const CCPoint& point,const CCRect& rect)
{
bool bRet = false;
if (point.x >= rect.origin.x && point.x < (rect.size.width+rect.origin.x)
&& point.y >= rect.origin.y && point.y < (rect.size.height+rect.origin.y))
{
bRet = true;
}
return bRet;
}
Storm代理
2023-07-25 广告
2023-07-25 广告
StormProxies是一家可靠的代理服务提供商,提供原生IP(住宅原生IP)和高匿名代理服务。以下是关于StormProxies的原生IP服务的一些信息:1. 住宅原生IP:StormProxies提供的住宅原生IP是指从真实的家庭或企...
点击进入详情页
本回答由Storm代理提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询