비디오 게임에서 발사체를 어떻게 표현합니까?


14

내가 하고있는 프레젠테이션의 일부로 "Galaga" 와 비슷한 간단한 고정 슈팅 게임을 만들고 있습니다. 우주선에서 발사 된 레이저와 같이 발사체를 추적하기 위해 사람들이 어떤 전략과 데이터 구조를 사용할지 궁금합니다. 이전에 사용했던 매우 간단한 구현은 각 발사체를 점으로 표시하고 장면의 모든 객체와의 충돌을 확인하는 것입니다.

그러나 발사체가 많은 대형 장면에서는 비용이 많이 든다. 이 유형의 유스 케이스에 다른 유형의 전략 또는 구현이 사용되는지 궁금합니다. FPS와 같은 게임은 발사체 (총알, 탱크 포탄 등)를 추적하기 위해 무엇을 사용합니까?


5
많은 FPS 게임은 총알이 즉각적이라고 가정하지만 궤도와 이동 시간을 계산하는 게임이 있습니다.
존 맥도날드

2
+1 이것은 좋은 질문이며, 반드시 3d로 제한하지는 않습니다.
ashes999

답변:


8

들어 매우 빠른 (예 : 레이저 또는 글 머리 기호 등) 발사체, 당신은 사용할 수 레이 .

광선에는 시작점과 끝 점이 있습니다. 광선의 (최소한) 데이터 구조는 다음과 같습니다.

struct Ray
{
  Vector3f start, end ;
} ;

다음과 같습니다 :

여기에 이미지 설명을 입력하십시오

(방향 벡터와 길이를 캐시 할 수도 있지만 위의 매우 간단한 defn을 사용했습니다).

광선이 빛의 속도로 이동하는 레이저 광선 인 경우 광선 (총 노즐에서 시작하여 벽 어딘가에서 끝나는 것처럼)을 몇 프레임 동안 유지합니다. 프레임마다 광선을 교차시키는 것은 손상을 입습니다.

광선이 더 느린 발사체 (예 : 총알과 같은) 인 경우, 시간 간격에 걸쳐 총알이 이동 한 거리는 광선에 의해 모델링됩니다. 시작점은 광선이 프레임의 시작 부분에 있고 끝점은 프레임이 끝난 후 광선이있는 곳입니다. 총알의 광선에있는 모든 것은 총알에 의해 손상됩니다.

광선은 구, aabb, 볼록 껍질 등과 효율적으로 충돌 할 수 있습니다. 실제 실행중인 프로그램 (CTRL + Click to fire rays)은 Hullinator 프로젝트를 확인하십시오.


1
광선은 많은 발사체에서 잘 작동하지 않습니다. 예를 들어 탱크 포탄과 같이 로빙 할 수있는 발사체입니다. 광선은 발사체 발사에 좋습니다.
MichaelHouse

글쎄, 껍질이 매우 느리게 움직이는 경우 (탄환 또는 레이저와 비교하여) 예, 일반 플레이어 (플레이어처럼)로 모델링했습니다
bobobobo

7
기술적으로 광선은 시작점과 방향입니다. 이것은 시작 지점과 다른 지점으로 결정할 수 있지만 정의의 일부는 아닙니다. 정의에 따르면 광선은 무한하며 끝 점이 없습니다.
케이시 쿠볼

1
맞습니다. 제가 설명한 것은 실제로 선분 이지만 대부분의 사람들은 충돌 감지에 대해 말할 때 광선이라고 부릅니다.
bobobobo

3

광선을 사용하면 총알과 같은 순간 이동 발사체에 적합합니다. 우주 게임에 사용할 유형과 같이 속도가 느린 발사체의 경우 다른 개체와 마찬가지로 게임 세계에서의 위치를 ​​추적하는 것이 좋습니다. 내가하는 일은 위치, 회전, 충돌 상자 등의 모든 지속되는 게임 객체의 속성을 포함하는 Entity라는 기본 클래스를 가지고 있습니다. 각 개별 유형의 엔티티가 아닌 수퍼 클래스 엔티티

성능을 향상 시키려면 자주 만들고 파괴 할 객체에 대한 풀을 유지하는 것이 매우 일반적입니다. 새 발사체가 필요할 때이 풀에서 끌어 당겨 필요에 따라 새 발사체를 수정하고 만료되면 다시 풀로 되돌립니다.


2

충돌 감지를 위해 최적화하려는 경우 모든 게임 오브젝트를 2 차원 또는 3 차원 트리 에 저장할 수 있습니다 . 이 데이터 구조는 특정 영역의 모든 객체를 검색하는 데 매우 효율적입니다.

그러나 이진 트리는 객체가 추가, 제거 및 위치를 변경할 때 쉽게 변질된다는 단점이 있으므로 자동 균형 조정 이 필요 합니다.

구현하기는 쉽지만 효율적이지 않은 타협은 청크 기반 접근 방식을 사용하는 것입니다. 경기장을 큐브로 나누고 각 큐브에 닿는 물체를 추적하십시오. 개체와의 충돌을 검사 할 때는 해당 개체가 만지고있는 큐브의 개체 목록과 비교하여 검사해야합니다 (2 차원 게임에서는 "큐브"를 "직사각형"으로 대체).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.