2013-11-25 3 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에 해결하는 방법입니다 ++ 프로젝트는 거의 당신에 의해 기술 된 것과 같은 문제 : ObstacleEntity 항상 거의 이상적으로 라운드 동안 스프라이트 통과

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); 
} 

여기, 사각형입니다. 모든 엔티티에 대한 고정 점은 필자의 경우 왼쪽 하단으로 설정되어 있습니다.

+0

입니다. 내 솔루션에 대한 세부 정보가 추가되었습니다. . –