2011-07-04 6 views
6

http://dl.dropbox.com/u/3724424/Programming/Gifs/game6.gif2D 플랫폼 AABB 충돌 문제

AABB 충돌 해결에 문제가 있습니다.


X 축을 먼저 확인한 다음 Y 축을 분석하여 AABB 교차를 해결합니다. 이것은이 버그를 방지하기 위해 수행되어 오브젝트가 플레이어에 이동하고, 플레이어가 가로 푸시되어야 할 때 http://i.stack.imgur.com/NLg4j.png


현재의 방법은 잘 작동한다. .gif에서 볼 수 있듯이 수평 스파이크가 플레이어를 올바르게 밀어냅니다.


그러나 수직 스파이크가 플레이어로 이동하면 X 축이 먼저 해결됩니다. 이것은 "스파이크를 리프트로 사용하는"것은 불가능합니다.

플레이어가 수직 스파이크 (중력의 영향을 받음)로 이동하면 X 축에 겹침이 없기 때문에 Y 축을 밀었습니다.


제가 시도한 것은 first answer of this link에 설명 된 방법이었습니다. 그러나 스파이크와 움직이는 물체는 속도가 아닌 위치가 변경되어 움직이며 Update() 메서드가 호출 될 때까지 다음으로 예상되는 위치를 계산하지 않습니다. 말할 필요도없이이 솔루션은 작동하지 않았습니다. :(


나는 일 위에서 설명한 경우 모두하는 것은 의도 한대로하는 방식으로 AABB 충돌을 해결하기 위해 필요 이것은 나의 현재의 충돌 소스 코드

입니다

:. http://pastebin.com/MiCi3nA1

나는 것 이 버그가 처음부터 엔진에 남아 있기 때문에 누군가가이 문제를 조사 할 수 있다면 정말 감사드립니다. 그리고 나는 성공없이 좋은 해결책을 찾기 위해 고심하고 있습니다. 이것은 심각하게 나를 밤새 보며 보내고 있습니다. 충돌 코드에서 "재미있는 부분"에 도달하지 못하게하고 게임 논리를 코딩하는 것을 막습니다. (


XNA AppHub 플랫폼 데모에서와 동일한 충돌 시스템을 구현하려고했습니다. 대부분의 항목을 복사하여 붙여 넣습니다. 그러나 "점프"버그는 내 게임에서 발생하지만 AppHub 데모에서는 발생하지 않습니다. [jumping bug : http://i.stack.imgur.com/NLg4j.png]

점프하려면 점프하려면 플레이어가 "onGround"인지 확인한 다음, Velocity.Y에 -5를 추가하십시오.

플레이어의 Velocity.X가 Velocity.Y (다이어그램의 네 번째 패널 참조)보다 높기 때문에 onGround가 true가 아닌 경우 true로 설정되므로 플레이어는 공중에서 점프 할 수 있습니다.

플레이어의 Velocity.X가 절대로 Velocity.X보다 높지 않으므로 AppHub 데모에서는이 문제가 발생하지 않는다고 생각합니다.하지만 실수 일 수 있습니다.

먼저 X 축에서 확인한 다음 Y 축에서 확인하여 해결했습니다. 하지만 제가 위에서 언급 한 것처럼 스파이크와의 충돌은 나사못으로 막힙니다.

+0

여기 gamedev.stackexchange.com에 대한 질문이 있습니다. 답변이 더 있습니다. http://gamedev.stackexchange.com/questions/14486/2d-platformer-aabb-collision-problems?lq=1 – LearnCocos2D

답변

0

내가 찾은 가능한 해결책 중 하나는 플레이어의 속도에 따라 해결하기 전에 개체를 정렬하는 것입니다.

0

세로 스파이크의 경우 Y 축에서 먼저 분해하고 가로 스파이크의 경우 먼저 X 축에서 분해하지 않는 이유는 무엇입니까?

멋진 그래픽.


내가 알고있는 것처럼

, 당신은이 같은 움직임과 충돌 뭔가를 처리하고 있습니다 :

  1. 이동을 모든 객체. 각각에
  2. 플레이어와 O 간의 교차로 O 테스트 객체, 필요하다면 더 이상 O과 교차되도록 수평 또는 수직으로 플레이어를 배출하지 않는다.
  3. 플레이어가 여전히 어떤 물건과 교차하고 있다면 (무언가).

이은 (2) 단계로 올 때, 당신이 위 또는 옆으로 플레이어를 밀어하려고하는 경우에 당신이 말할 수 있도록 객체 O이 이동 된 방법을 잊어 버린 것을 의미한다.

해결 방법 : 단계 (1)에서 각 개체에 대해 움직이는 방향을 저장하십시오. 플레이어가 개체와 교차하는 것을 발견하면 개체가 위, 아래, 왼쪽 또는 오른쪽으로 움직이는 지 확인할 수 있습니다. 그러면 개체를 내보내는 방법을 알 수 있습니다.

+0

"최후의 수단"해결책. 나는 "자동적으로"모든 상황에서 작동하는 일반적인 솔루션을 찾는 것을 선호합니다. –

+0

"재미있는 부분"으로 옮기려하지 않으셨습니까? ;) 이 솔루션은 상당히 좋게 들릴 수 있지만 아마도 유일한 해결책 일 것입니다. 그것을 시도하고 하나를 이동, 당신은 항상 나중에 다시 올 수 있습니다. – LearnCocos2D

+0

생각해 보니 정적 충돌 타일과는 다른 움직이는 "플랫폼"을 다룰 필요가 있습니다. 플레이어가 움직이는 플랫폼 위에있을 때, 플랫폼을 움직일 때마다 플랫폼의 움직임의 델타 위치를 플레이어 위치에 추가하여 충돌을 평가합니다. 이를 위해서는 플레이어가 움직이기 전에 플랫폼을 움직여야합니다. 다음 플랫폼 섹션을 참조하십시오. http://higherorderfun.com/blog/2012/05/20/the-guide-to-implementing-2d-platformers/ – LearnCocos2D

0

가레스리스 (Gareth Rees)가 이미 말했듯이 충돌은 충돌이 감지 된 후에 발생합니다. 충돌 응답을 수행하는 데 더 많은 정보가 필요합니다 (현재 위치와 방향 중 하나 또는 둘 모두가 필요합니다).

두 개체가 움직이는 경우 상당히 복잡해집니다. 대신 하나의 객체를 참조 프레임으로 선택하고 다른 모든 객체에서 속도를 뺍니다.

직접적인 해결책은 참조 프레임이 아닌 개체의 이동/델타에 대한 선분을 만드는 것일 수 있습니다. 그런 다음 해당 세그먼트를 4 개의 AABB 모서리와 교차시킵니다. 이것은 교차 시간과 교차점에서의 법선을 제공합니다. 그런 다음 지금 동일한 응답을 적용 할 수 있습니다.