cocos2d使用boundingBox来检查碰撞

时间:2011-03-18 14:38:15

标签: objective-c cocos2d-iphone collision bounding-box

我使用boundingBox检查碰撞,它对触摸很好,但对于2个精灵的碰撞完全没有(它们都是圆形但是它们的边界框是直的)

那么还有更好的方法吗?(如果你修改下面的代码会很棒:

-(bool) isFishCollidingWithRect:(CGRect) rect
{
     FishEntity* fish;
     CCARRAY_FOREACH(fishes, fish)
     {
        if (fish.visible && CGRectIntersectsRect([fish boundingBox], rect)) {
             [fish gotHit];
             return YES;
         }
      }
      return NO;
}

我认为有一种很好的方法可以得到一个较小的矩形,它位于原始矩形和矩形之间,它的顶点刚好接触圆形。大小很容易获得,但坐标很难,因为矩形可能有旋转,我的数学很糟糕

-(bool) isBirdCollidingWithSprite:(CCSprite*) sprite
 {
     BirdEntity* bird;
     CCARRAY_FOREACH(birdsAlone, bird)
     {
         float distance = sqrt((bird.anchorPoint.x - sprite.anchorPoint.x) * (bird.anchorPoint.x - sprite.anchorPoint.x) + (bird.anchorPoint.y - sprite.anchorPoint.y) * (bird.anchorPoint.y - sprite.anchorPoint.y)); 
         if (bird.visible && (bird.contentSize.width / 2 + sprite.contentSize.width / 2) >= distance) {
             if ([bird inBubble] == NO) {
                 [bird bubbled];
             }
             return YES;
         }
     }
     return NO;
 }
好吧,鱼总是被击中,我相信contentSize是批处理节点中的整个纹理。我该怎么用?

1 个答案:

答案 0 :(得分:0)

因为他们都是圈子,所以非常简单。只需检查两个圆圈中心之间的distance即可。如果它大于圆的半径之和,则精灵不会接触。如果它更少,它们就会重叠。如果它是平等的,那么它们只是在触摸。