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


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.