2012-04-29 2 views
1

저는 현재 C#을 배우고 일반적으로 게임 디자인을 배우려고 노력하는 경험이 거의없는 프로그래머입니다.충돌 감지를 더 효율적으로 만들기 (C# XNA)

저는 Microsoft의 XNA 프레임 워크를 사용하여 Galaga-esque Scrolling Shooter 게임을 제작하고 있습니다. 내가 엉성한 OOP 구조로 고심하고 몇 가지 나쁜 디자인 선택을 한 약간의 거친 시련 끝에, 마침내 엔진의 훌륭한 출발을 생각해 냈습니다.

현재 게임을 방해하지 않는 충돌 감지에 문제가 있습니다. 현재 엔진은 모든 활성 게임 객체를 List 객체에 유지하고 각 객체를 순환하여 서로 다른 객체와 충돌하는지 확인합니다. 말할 것도없이 훨씬 더 좋을 수 있습니다.

여기 내 충돌 검사가 ObjectHandler 클래스에서 수행되었습니다.

public override void Update(GameTime gameTime) 
    { 
    ... 
     //Handle collisions 
     foreach (GameObject obj in Objects) 
     { 
      ICollideable e = obj as ICollideable; 
      //Check if the object implements ICollideable 
      if (e != null) 
      { 
       //Check collision with each other object 
       foreach (GameObject obj2 in Objects) 
       { 
        //Check if the second object implements ICollideable 
        ICollideable e2 = obj2 as ICollideable; 
        //check if they are in the same sector 
        if (e2 != null && SameSector(e.Sector,e2.Sector)) 
        { 
         //Check if the collision masks interesect 
         //if so call each object's collision event 
         if (e.Mask.Intersects(e2.Mask)) 
         { 
          e.CollisionEvent(e2); 
          e2.CollisionEvent(e); 
         } 
        } 
       } 
      } 
     } 
     ... 
    } 

다음은 SameSector 기능입니다.

private bool SameSector(Point p1, Point p2) 
    { 
     if (Math.Abs(p1.X-p2.X)<=1 && Math.Abs(p1.Y-p2.Y)<=1) 
      return true; 
     else 
      return false; 
    } 

"마스크"는 XNA 프레임 워크의 일부인 Rectangle 개체입니다. 보시다시피 저는 일종의 공간 분할 시스템을 구현했습니다. 각 개체는 60x60 제곱으로 설정되어 있습니다. 그러나 실제로 유용한 지 확인한 것은 아닙니다. 두 개체는 충돌 여부를 확인하는 것과 동일한 섹터 (또는 인접 섹터)에 있습니다.

나는 이와 비슷한 질문을 이미 보았지만, 내 질문에 만족하지 못했습니다. 그것으로부터 시간 관리 시스템이 유용하다는 것을 모았습니다. 최종적으로 구현하려고 노력할 것입니다. 그러나 아직 프로그래밍에 익숙하지 않으므로보다 진보 된 설계를 탐구하기 전에 충돌 검사 자체를 최적화하고 싶습니다.

그래서 현재의 충돌 검사를 효과적으로 최적화 할 수 있을까요? 아니면 처음부터 어떻게해야할까요?

답변

3

공간 분할은 모든 객체를 어떤 방식 으로든 모든 객체와 비교할 필요가없는 방식으로 구현 한 경우에만 도움이됩니다.

공간 분할 그리드에서는 각 그리드 셀에 개체의 멤버 목록을 포함시키고 각 개체가 어떤 셀에 있는지 파악해야합니다. 그런 다음 비교를 수행하면됩니다 객체 및 인접 셀의 모든 다른 객체 (객체가 경계를 겹칠 수 있기 때문에). 단점은 이제 모든 상태를 업데이트 된 상태로 유지해야한다는 것입니다.

다른 CD 주제 이외에 몇 가지 다른 광범위한 단계 분할 스키마와 상대적인 강점과 약점을 다루는 책 Real-Time Collision Detection을 적극 권장합니다. 획일적 인 그리드 외에도 계층 형 그리드, 쿼드 트리, 스윕 (sweep) 및 가지 치기 (prune) 및 기타 적합한 기술이 있습니다 (sweep and prune이 특히 유용 할 수 있습니다).