cocos2d использует boundingBox для проверки столкновения - PullRequest
0 голосов
/ 18 марта 2011

Я использую 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 голосов
/ 18 марта 2011

Так как они все круги, это довольно просто. Просто проверьте расстояние между центрами двух кругов. Если оно больше, чем сумма радиусов кругов, спрайты не соприкасаются. Если меньше, они перекрываются. Если они равны, они просто соприкасаются.

...