Ios 矩形和圆形碰撞检测

Ios 矩形和圆形碰撞检测,ios,objective-c,cocos2d-iphone,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; flo

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

-(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;
    }
}
这似乎在矩形的一侧可以正常工作,但它不在矩形的上方或下方。在顶部和底部,碰撞发生得太早

有什么方法可以正确检测到碰撞吗?谢谢您的帮助。

您可以使用来实现这一点

-(BOOL) isCollidingRect:(CCSprite *) spriteOne WithSphere:(CCSprite *) spriteTwo {
    return CGRectIntersectsRect([spriteOne boundingBox],[spriteTwo boundingBox]);
}
它不是完美的像素,但据我所知,在这种情况下这是不必要的。

您可以使用来实现这一点

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

这不是像素完美,但我理解在这种情况下不是必要的。

< P>这不是使用COSCO2D Objc的解决方案,而是有助于COCOS2D-X DEVS,例如,我个人发现这个主题是因为我的C++游戏搜索相同。

Cocos2d-x为Rect类提供了方法intersectsCircle

这是我在C++项目中解决的问题和你描述的一样。

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

< P>这不是使用COSCO2D Objc的解决方案,但将有助于COCOS2D-X DEVS,例如,我个人发现了这个主题,因为我的C++游戏也在搜索这个主题。 Cocos2d-x为Rect类提供了方法intersectsCircle

这是我在C++项目中解决的问题和你描述的一样。

这里传递的精灵是矩形的,而障碍物几乎总是理想的圆形。
请注意,在我的例子中,所有实体的定位点都设置在左下角。

顺便说一句,如果返回BOOL,请使用YES和NO。您也可以返回比较结果,完全避免使用if/else。谢谢!我在我的问题中更新了这个。如果您确实返回diffbool 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 ); }