스프라이트 간의 충돌을 감지하는 가장 좋은 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/98642

  •  01-07-2019
  •  | 
  •  

문제

2D 게임 스프라이트에서 충돌을 감지하는 가장 좋은 방법은 무엇입니까?저는 현재 allegro와 G++로 작업하고 있습니다.

도움이 되었습니까?

해결책

충돌 감지를 감지하는 방법에는 여러 가지가 있습니다.2D 환경을 사용하는지 3D 환경을 사용하는지에 따라 사용하는 방법이 약간 변경됩니다.또한 충돌 감지 시스템을 구축할 때 현실감을 향상시키기 위해 게임에서 구현하려는 물리학(대부분의 하강 3D 게임에 필요함)을 고려해야 한다는 점을 기억하십시오.

짧은 버전은 경계 상자를 사용하는 것입니다.즉, 월드의 각 엔터티를 상자로 만든 다음 상자의 각 축이 다른 엔터티와 충돌하는지 확인합니다.

충돌을 테스트할 엔터티가 많으면 옥트리를 확인하는 것이 좋습니다.간단하게 월드를 섹터로 나눈 다음 동일한 섹터에 있는 개체 간의 충돌만 확인합니다.

더 많은 리소스를 보려면 sourceforge로 이동하여 오픈 소스 충돌 감지 및 물리 엔진인 Bullet 역학 엔진을 검색하거나 확인해 보세요. http://www.gamedev.net 여기에는 다양한 게임 개발 주제에 대한 많은 리소스가 있습니다.

다른 팁

괜찮은 2D 그래픽 라이브러리라면 정렬된 스프라이트부터 폴리곤, 픽셀까지 모든 것에 대한 자체 충돌 감지 기능을 제공하거나 이러한 기능을 수행하는 하나 이상의 좋은 타사 라이브러리가 있을 것입니다.엔진/라이브러리/프레임워크 선택에 따라 충돌 감지 선택이 결정되어야 합니다. 충돌 감지 선택은 단독으로 생성할 수 있는 것보다 훨씬 더 최적화될 가능성이 높기 때문입니다.

알레그로에게는 콜레그로.SDL의 경우 SDL_Collide.h 또는 SDL-충돌.당신이 사용할 수있는 나는_충돌한다 OpenGL로.DarkBASIC에는 충돌 시스템이 내장되어 있으며, 다크피직스 충돌을 포함한 매우 정확한 상호작용을 위해.

도서관을 이용하세요. 추천합니다 Box2D

이 질문은 매우 일반적입니다.2D 게임에서 충돌 감지를 수행하는 방법에는 여러 가지가 있습니다.당신이 무엇을 하려고 하는지 아는 것이 도움이 될 것입니다.

하지만 시작점으로 원, 직사각형 등 사이를 감지할 수 있는 매우 간단한 방법이 있습니다.나는 gamedev.net의 열렬한 팬은 아니지만 이러한 유형의 탐지에 대한 좋은 리소스가 있습니다.그러한 기사 중 하나는 여기.시작하는 데 도움이 될 수 있는 몇 가지 기본 자료를 다루고 있습니다.

기본 2D 게임에서는 직사각형이나 원을 사용하여 화면의 개체를 "감싸" 수 있습니다.직사각형이 겹칠 때나 원이 겹칠 때를 감지하는 것은 매우 간단한 수학입니다.더 복잡한 것(예: 볼록 관절 폴리)이 필요한 경우 솔루션은 더 복잡합니다.여기서도 gamedev.net이 도움이 될 수 있습니다.

하지만 실제로 귀하의 질문에 대답하려면 귀하가 무엇을 하려는지 알아야 합니다.어떤 종류의 게임인가요?어떤 유형의 물체를 충돌시키려고 합니까?화면 경계 등에 충돌하려고 하시나요?

충돌 감지 시스템을 구현하는 것은 복잡한 문제이지만 세 가지 사항을 고려하고 싶습니다.

  • 사물의 세계.공간 분할.세계의 모든 2D 스프라이트에 대해 다른 모든 것에 대해 충돌 검사를 수행하면 프로그램이 느려질 것입니다!우선순위를 정해야 합니다.공간을 나누어야 합니다.직교 그리드 시스템을 사용하여 세계를 2D 그리드로 분할할 수 있습니다.또는 라인을 구분자 기능으로 사용하여 BSP 트리를 사용할 수도 있습니다.

  • 광범위한 위상 충돌 감지 이것은 실린더 또는 엘립스와 같은 경계 볼륨을 사용하여 (스프라이트의 모양을 가장 근사하는 것) 객체가 더 자세히 비교할 가치가 있는지 여부를 결정합니다.이에 대한 수학은 쉽습니다.2D 행렬 변환을 알아보세요.그리고 2D 교차점의 경우 고성능 비디오 카드를 사용하여 많은 작업을 수행할 수도 있습니다!

  • 좁은 위상 충돌 감지 이제 두 개 이상의 객체를 비교할 가치가 있다고 판단하므로 미세 조정 된 섹션으로 들어갑니다.이 단계의 목표는 충돌 결과를 결정하는 것입니다.침투 깊이, 포괄 부피 등...그리고 이 정보는 여러분이 계획한 모든 물리 엔진에 입력됩니다.3D에서 이것은 우리 모두가 그토록 좋아하는 GJK 거리 알고리즘 및 기타 니토 알고리즘의 영역입니다!

이 모든 것을 일반적으로 구현하고 광범위하고 좁은 해상도를 다형적으로 지정하거나 하위 수준 언어로 작업하는 경우 후크를 제공할 수 있습니다.

무엇 사이의 충돌?스프라이트, 오목 다각형, 볼록 다각형, 직사각형, 정사각형, 원, 점 등을 사용하는지 여부에 따라 다릅니다.

2D에서 두 공 사이의 충돌을 확인하는 것은 쉽습니다.Google에서 검색할 수 있지만 기본적으로 두 공의 반경을 합친 길이가 두 공의 중심 사이의 거리보다 크거나 같은지 확인합니다.

그런 다음 공 중심 사이의 단위 벡터를 가져와 공 반경 중 하나와 곱하여 충돌 지점을 찾을 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top