矩形和圆形碰撞检测

我试图做一个矩形和一个圆之间的碰撞检测。 我想出了这个方法:

-(BOOL) isCollidingRect:(CCSprite *) spriteOne WithSphere:(CCSprite *) spriteTwo { float diff = ccpDistance(spriteOne.position, spriteTwo.position); float obj1Radii = [spriteOne boundingBox].size.width/2; float obj2Radii = [spriteTwo boundingBox].size.width/2; if (diff < obj1Radii + obj2Radii) { return YES; } else { return NO; } } 

这是我如何检查它:

 if ([self isCollidingRect:player WithSphere:blocker] == true) { [self playerdeathstart]; } 

这似乎在矩形的一边正常工作,但它不在上面或下面。 在顶部和底部,碰撞发生得太早。

有点像这个..

有没有办法让我的碰撞被正确的检测出来? 感谢您的帮助。

你可以使用CGRectIntersectsRect来实现这一点。

 -(BOOL) isCollidingRect:(CCSprite *) spriteOne WithSphere:(CCSprite *) spriteTwo { return CGRectIntersectsRect([spriteOne boundingBox],[spriteTwo boundingBox]); } 

这不是像素完美的,但据我所知在这种情况下不是必要的。

对于那些使用Cocos2d-ObjC的人来说,这不是一个解决scheme,但是会帮助Cocos2d-x开发者(例如,我个人发现这个主题是因为我的C ++游戏正在寻找相同的东西)。

对于Rect类,Cocos2d-x有方法“intersectsCircle”。

下面是我在我的C ++项目中解决的几乎和你所描述的一样的问题:

 bool ObstacleEntity::hasCollisionAgainst(cocos2d::Sprite *spr) { cocos2d::Rect rect = cocos2d::Rect( spr->getPositionX(), spr->getPositionY(), spr->getBoundingBox().size.width, spr->getBoundingBox().size.height); float rw = this->getBoundingBox().size.width / 2; float rh = this->getBoundingBox().size.height / 2; float radius = ( rw > rh ) ? rw : rh; cocos2d::Vec2 center( this->getPositionX() + rw, this->getPositionY() + rh ); return rect.intersectsCircle( center, radius ); } 

这里通过的雪碧是长方形的,而障碍的实体总是几乎是圆的。 请注意,在我的情况下,所有实体的锚点都设置在左下angular。