矩形和圆形碰撞检测

时间:2013-11-25 07:58:31

标签: ios objective-c cocos2d-iphone

我正在尝试在矩形和圆形之间进行碰撞检测。我想出了这个方法:

-(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];
}

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

Kinda Like this..

有没有办法可以正常检测到这种碰撞?谢谢你的帮助。

2 个答案:

答案 0 :(得分:4)

您可以使用CGRectIntersectsRect来实现此目标。

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

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

答案 1 :(得分:0)

对于那些使用Cocos2d-ObjC的人来说,这不是一个解决方案,但是对Cocos2d-x开发者有帮助(例如,我个人发现这个主题是因为我的c ++游戏正在搜索相同的内容)。

Cocos2d-x为Rect类提供了方法“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 );
}

这里传递的Sprite是矩形,而ObstacleEntity几乎总是理想的圆形。 请注意,在我的情况下,所有实体的锚点都设置为左下角。