빠르고 정확한 2D 충돌


17

2D 하향식 슈팅 게임을하고 있는데 기본 사각형 경계 상자 충돌 시스템을 넘어서야합니다.

스프라이트가 여러 개인 큰 레벨이 있는데 모두 모양과 크기가 다릅니다. 스프라이트의 텍스처는 모두 투명한 배경을 가진 정사각형 PNG 파일이므로 플레이어가 투명한 배경이 아닌 텍스처의 컬러 부분으로 들어올 때 충돌을 일으킬 수있는 방법이 필요합니다.

다음과 같이 충돌을 처리 할 계획입니다.

  1. 스프라이트가 플레이어 범위 내에 있는지 확인하십시오
  2. 올바른 경계 상자 충돌 테스트 수행
  3. 정확한 충돌을하십시오 (도움이 필요한 경우)

모든 요구 사항을 염두에 두고이 기술을 사용하고 싶기 때문에 고급 기술은 신경 쓰지 않지만 어떻게 접근 해야하는지 잘 모르겠습니다. 시도 할 기술이나 라이브러리. 각 스프라이트에서 투명 배경을 뺀 것을 정확하게 나타내는 일종의 모양을 만들고 저장해야 할 것입니다.

픽셀 당 속도가 느리다는 것을 읽었으므로 큰 레벨과 많은 수의 객체를 고려할 때 적절하다고 생각하지 않습니다. Box2d도 살펴 보았지만 SFML을 사용하여 문서를 작성하고 실행하는 방법에 대한 많은 문서 또는 예제를 찾을 수 없었습니다.

답변:


18
  1. 1 단계 : 그리드를 생성하고 움직이는 모든 객체에 대해 그리드를 업데이트합니다.
  2. 동일한 정사각형의 객체 간 충돌 만 확인하십시오.
  3. 객체의 경계 상자가 사각형과 교차하는지 확인하십시오.
  4. 저해상도 버전의 외곽선을 사용하여 픽셀 완벽한 충돌을 확인하십시오 (게임 물리 참조).
  5. 게임 물리학 (Q 2)에 설명 된대로 개요 추적을 정상적으로 확인하십시오.

1 단계:

그리드 2D 배열을 만듭니다. 모든 객체는 x, y 위치와 너비와 높이가 차지하는 사각형을 알고 있습니다. 개체가 멀리 이동하면 이전 사각형에서 자신을 지우고 사용중인 새 사각형을 업데이트합니다.

이것은 n 개의 객체에 대해 총 O (n) 만 필요합니다. 특정 객체 O (1)

2 단계:

동일한 정사각형으로 개체 간 충돌에 대한 모든 검사를 실행하십시오. 다른 정사각형의 객체 간 충돌 테스트를 실행할 필요가 없습니다. 개체가 평균 크기 인 경우 최대 4 개의 사각형을 차지할 수 있습니다. 이것은 확인이 거의 없다는 것을 의미합니다.

3 단계 :

객체 사각형 사이의 교차점을 확인하십시오. 교차로가 없으면 중지하십시오.

4 단계 :

교차 영역 내부에서만 개체의 윤곽선 사이의 픽셀 완벽한 충돌을 확인하십시오. 충분히 빠르다. 그렇지 않은 경우 저해상도 2d- 부울 배열을 만들고 먼저 확인하십시오. 충돌이 발견되면 고해상도 2d- 어레이에서 작은 세그먼트 만 확인하면 소중한 시간을 절약 할 수 있습니다.

게임 세계를 사각형 격자 로 나누는 방법에 대한 개념은 다음을 읽으십시오 .

효율적인 충돌 감지 시스템 만들기

픽셀 퍼펙트 충돌 을 감지하는 방법에 대한 이해를 위해 이것을 읽으십시오 .

게임 물리학 / 2D 충돌 감지 AS3

성능을 크게 향상시킬 수 있습니다.

  1. 저해상도 (1/16) 버전의 개요를 저장하여 먼저 확인하십시오.

  2. 두 rect가 교차하는 영역에서만 체크인하십시오.

  3. 개요를 대략 세그먼트로 나누고 세그먼트 간의 충돌 만 먼저 확인합니다.

의견을 환영합니다 그리고 내가 자세히 설명하겠습니다.

교차로를 확인하십시오


1
Arthur가 말했듯이 1 단계와 2 단계를 그리드로 바꾸고 정확한 충돌 감지를 위해 이미지의 저해상도 버전을 사용할 수 있습니다.
Markus von Broady

1
그리고 당신이 정말로 필요하다면, 당신은 또한 내 대답과 비슷한 기술을 사용할 수 있습니다 : gamedev.stackexchange.com/questions/38481/…
Markus von Broady

마르쿠스는 좋은 생각을 지적합니다. 2d로 취급되는 2d- 부울 배열 또는 1d- 배열을 사용해야하며, 해당 배열의 1/2 1/4 1/8 저해상도 버전을 저장하여 속도를 높일 수 있습니다. 2d- 부울 배열에서의 계산이 매우 빠르기 때문에 이것은 아마도 필요하지 않을 것입니다. 여전히 유용한 도구입니다.
wolfdawn

플레이어가 그리드의 한 사각형 안에 완전히 포함되어 있으면 해당 사각형의 개체에 대해서만 확인할 수 있습니다. 플레이어는 한 번에 네 개의 인접한 사각형에있을 수 있습니다. 이게 네가 말하는거야? 사각형 사이의 교차를 의미하는 경우 예, 교차하는 경우 충돌 만 확인하면됩니다.
wolfdawn

1
업데이트가 문제를 해결하는 데 도움이되기를 바랍니다. 작성한 코드가 있으면 코드 검토에 게시하고 의견을 보내도록 링크 할 수 있습니다. codereview.stackexchange.com
wolfdawn
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.