【问题标题】:Rectangle and Circle collision detection矩形和圆形碰撞检测
【发布时间】:2013-11-25 07:58:30
【问题描述】:

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

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

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

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

【问题讨论】:

  • 顺便提一下,如果您要返回BOOL,请使用YESNO。您也可以只返回比较结果并完全避免 if/else。
  • 谢谢!我在我的问题中更新了这个。
  • 如果你这样做会更好return (diff &lt; obj1Radii + obj2Radii)

标签: ios objective-c cocos2d-iphone


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢!这非常有效!另外,我认为您在[spriteTwo boundingBox] 之后忘记了括号。
  • 当圆的边界框在矩形内而不是圆本身时,这将返回 TRUE。见:pixentral.com/pics/1UsZAiYadMHwyToj3ruWOKms2gAAb0.png
  • 确实如此,但正如我所说,它不是像素完美的,但对于这种情况和大多数游戏情况来说已经足够了
【解决方案2】:

对于使用 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 总是几乎理想的圆形。 请注意,在我的例子中,所有实体的锚点都设置为左下角。

【讨论】:

  • 在我的解决方案中添加了一些细节。
猜你喜欢
  • 2023-01-26
  • 2014-09-03
  • 2010-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多