2010-04-17 3 views
4

저는 C++과 SDL로 약간의 2D 플랫폼/파이팅 게임을하고 있으며, 충돌 감지에 많은 문제가 있습니다.2D 플랫폼과 양축의 충돌 문제

레벨은 타일 배열로 구성되어 있으며 for 루프를 사용하여 각 패턴을 처리합니다 (이 패턴을 수행하는 가장 좋은 방법은 아닐 수 있습니다. 도움이 필요할 수도 있음). 캐릭터의 각면에 대해, 그 방향으로 한 픽셀 씩 이동시키고 충돌을 확인합니다 (또한 캐릭터가 그 방향으로 움직이는 지 확인합니다). 충돌이 발생하면 속도를 0으로 설정하고 플레이어를 타일 가장자리로 이동시킵니다.

내 문제는 먼저 수평 충돌을 확인하고 플레이어가 프레임 당 둘 이상의 픽셀에서 수직으로 이동하면 타일이 수평이더라도 수평 충돌을 처리하고 문자가 타일의 측면으로 이동한다는 것입니다. (이상). 수직 충돌을 먼저 처리하면 수평 축에 대한 작업을 제외하면 동일하게 수행됩니다.

두 축의 충돌을 어떻게 처리 할 수 ​​있습니까? 어떻게 처리하는지보다 충돌을 처리 할 수있는 더 좋은 방법이 있습니까?

+0

캐릭터를 이동하기 전에 또는 이동 한 다음 확인한 후에 충돌을 확인하고 있습니까? –

+0

캐릭터를 옮긴 후 확인하고 있습니다. – ausgat

답변

3

XNA's 2D platformer example도 타일 기반 충돌을 사용합니다. 그들이 그것을 처리하는 방법은 매우 간단하고 유용 할 수 있습니다. 여기에 (특정 - 투 - 자신의 - 데모 물건을 제거) 거기에 무엇을 벗었 설명입니다 :

  1. 운동을 적용 후에는 충돌을 확인합니다.
  2. 플레이어의 테두리 상자에 따라 플레이어가 겹치는 타일을 결정합니다.
  3. 그 모든 타일을 반복합니다 ...타일이 선택되는 경우
    1. 은 무난되지 않습니다 :
    2. 이 얼마나 멀리 X에 결정하고 Y 플레이어가
    3. 충돌은 얕은 축에 를 해결 비 무난 타일 겹치는 축 :
      1. Y가 얕은 축 (abs (overlap.y) < abs (overlap.x)) 인 경우 position.y + = overlap.y; 마찬가지로 X가 얕은 축인 경우에도 마찬가지입니다.
      2. 경계 상자가 위치 변화에
    4. 다음 타일로 이동 ...
  4. 그것은 HandleCollisions에 player.cs에있어

() 함수를 사용하면 경우를 기준으로 갱신된다 코드를 잡고 그들이 구체적으로 무엇을하는지 알아야합니다.

+0

이것은 아마도 이상하게 들릴지 모르지만 얕은 축은 무엇입니까? 내가 봤 거든 그것에 관련된 아무것도 찾을 수 없습니다. – DMan

+0

"Shallow axis"란 충돌로 인해 침투가 덜한 것을 의미합니다. 예를 들어, 문자의 위치가 Y 축에서 5 단위, X 축에서 10 단위로 계산 된 경우 Y는 얕은 축입니다. – chaosTechnician

0

예. 벡터 기반 충돌은 타일 기반보다 훨씬 낫습니다. 타일의 각 모서리를 선으로 정의하십시오 (지름길이 있지만 현재는 무시하십시오). 이제 충돌이 발생했는지 확인하려면 가장 가까운 수평선과 수직선을 찾으십시오. lastPos.x * LineVector.y - LastPos.y * LineVector.x의 부호를 취하여 thisTurnsPos.x * LineVector.y - ThisTurnsPos.y * LinePos.x와 비교하십시오. 이 두 값의 징조가 다른 경우이 선을 넘어 섰습니다. 그래도 선분의 끝에 도달했는지 여부는 확인하지 않습니다. 동일한 lineVector와 curPosition 사이에 내적을 형성 할 수 있습니다 (약간의 오차가 있지만 충분히 좋을 것입니다). 음수이거나 라인의 크기 제곱보다 커야합니다. 그 라인 세그먼트 안에 있지 않고 충돌이 발생하지 않았습니다. .

이제이 작업이 복잡해졌으며 간단한 격자 검사를 통해 다른 사각형 영역으로 넘어 갔는지 확인할 수 있습니다. 그러나! 벡터로이 작업을 수행하는 이점은 충돌 상자 문제의 크기보다 빠르게 움직이는 문제를 해결하고 충돌에 대해 축이 아닌 정렬 된 선을 사용할 수 있다는 것입니다. 이 시스템은 모든 2D 벡터에서 사용할 수 있습니다. (또한 약간의 마사지 만 있으면 3D도 가능합니다.) 또한 수학의 99 %를 이미 완료했기 때문에 충돌 상자 가장자리를 따라 문자를 쉽게 이동할 수 있습니다. 충돌 후 당신이 있어야 할 곳을 찾아라.

몇 가지 구현 세부 사항을 살펴 보았지만 수많은 상업용 비디오 게임에서 위의 방법을 사용했음을 알 수 있습니다. 행운을 빕니다!

+0

나는 게임 개발에 새로운 경험이 있다는 것을 잊어 버렸고, 내가하고있는 게임은 꽤 간단하다. 벡터 기반 충돌 감지는 더 잘 들리지만 아직 할 수는 없다고 생각합니다. – ausgat