2014-07-22 2 views
0

무한 러너에서 작업 중이며 단일 스프라이트와 스프라이트의 CCArray에서 스프라이트 사이의 충돌 감지가 필요합니다. 내가 이걸 어떻게 하는게 좋을지 어떻게 생각해? 현재 이것은 충돌을 확인하기 위해 호출하는 메서드이지만 작동하지 않습니다.스프라이트와 스프라이트의 배열 사이의 충돌 감지

bool RunningScene::spritesAreColliding(cocos2d::CCSprite *spr1, cocos2d::CCSprite *spr2) 
{ 
//Take the bounding box of the two sprites that are bounded 
CCRect r1 = spr1->boundingBox(); 
CCRect r2 = spr2->boundingBox(); 

if (r1.intersectsRect(r2)) { //Check if the bounding boxes are intersecting and return a true/false 
    return true; 
} else { 
    return false; 
} 

}

나는 if 문에서 사용하고, 결과가 true면 명령문 작동하는지. 픽셀 완벽한 충돌 탐지를 기대하고 있지는 않지만 충돌 검사에이 메서드가 작동하는지 궁금합니다. _runner 스프라이트와 충돌하는 CCArray에서 스프라이트에 액세스하는 방법을 궁금합니다.

+0

작동하지 않는 이유는 무엇입니까? 'return r1.intersectsRect (r2); '를 사용하면 좀 더 효율적일 수 있지만 개념은 기본적으로 소리가납니다. – Logicrat

답변

0

내가하는 일을 볼 수 없기 때문에 코드가 작동하지 않는 이유가 확실하지 않습니다. 이 메소드가 true를 리턴한다고 가정 해보자. 너 뭐하니?

충돌 감지가 어렵습니다. 이 책의 해당 장을 확인하시기 바랍니다 : Real Time Collision Detection.

두 가지 접근법이 있습니다 : 연속 및 이산.

이산 충돌 감지 기능을 사용하려는 것 같습니다. 이것은 당신이 후에 일어나는 충돌에 반응 할 때 일어납니다. 침투 축을 찾아야 '상자를 서로 밀어 넣을'방향을 알 수 있습니다. 이 작업을 수행하는 간단하면서도 느린 방법 중 하나는 일 전에이 충돌하기 직전에 일종의 '2 진 검색'을 수행하는 것입니다. 속도가 적용되기 전에 물체를 자신의 위치로 가져갑니다 (프레임 시작). 이제 속도의 절반을 적용하십시오. 그들은 교차하고 있습니까? 그렇지 않다면 0.75의 속도를 적용하고, 그렇다면 0.25의 속도를 적용하십시오. 사전 설정된 반복 횟수 동안 더 이상 교차하지 않을 때까지 반복합니다.

또한 '되돌아 오거나'적어도 교차 한 축을 따라 움직이는 속도가 느려지도록 속도를 설정해야합니다.

이산 충돌 감지는 문제가 있습니다. 가장 잘 알려진 문제는 터널링입니다. 이것은 물체가 너무 빨리 움직여 교차하지 않는 경우입니다. 속도가 적용되면 '서로를 통해 이동'하고 충돌이 발생하지 않습니다. 2D 충돌 감지의 경우 연속적인 접근 방식을 권장합니다.