我使用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是批处理节点中的整个纹理。我该怎么用?
答案 0 :(得分:0)
因为他们都是圈子,所以非常简单。只需检查两个圆圈中心之间的distance即可。如果它大于圆的半径之和,则精灵不会接触。如果它更少,它们就会重叠。如果它是平等的,那么它们只是在触摸。