2013-11-25 253 views
2

我正試圖在矩形和圓形之間進行碰撞檢測。我想出了這個方法:矩形和圓形碰撞檢測

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

這似乎在矩形的一側正常工作,但它不高於或低於它。在頂部和底部,碰撞發生得太早。

Kinda Like this..

有沒有方法可以讓我得到這個碰撞到正確檢測?感謝您的幫助。

+2

順便說一句,如果你正在返回一個'BOOL',請使用'YES'和'NO'。你也可以返回比較結果並避免if/else。 –

+0

謝謝!我在我的問題中更新了這個。 –

+1

如果你做'return(diff

回答

4

您可以使用CGRectIntersectsRect來實現此目的。

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

這不是像素完美的,但據我所知,在這種情況下不是必需的。

+0

謝謝!這工作完美!另外,我想你在'[spriteTwo boundingBox]'之後忘了括號。 –

+2

當圓的邊界框位於矩形的內部時,這將返回TRUE,而不是圓形本身。請參閱:http://www.pixentral.com/pics/1UsZAiYadMHwyToj3ruWOKms2gAAb0.png – erkanyildiz

+0

這是真的,但正如我所說,它不是像素完美的,但僅僅足夠適合這種情況,並且大多數遊戲情況 –

0

對於那些使用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); 
} 

傳遞雪碧這裏是長方形,而ObstacleEntity總是幾乎是理想的圓。 請注意,在我的情況下,所有實體的錨點都設置在左下角。

+0

在我的解決方案中添加了一些細節。 –