2010-11-30 6 views
16

제 질문은 충돌 감지 방법에 관한 것이 아니라 '어떤 코드가 충돌 감지를 소유해야하는지'에 관한 것입니다. 나는 과거에 게임을 작성했는데 (상대적으로 단순한 2D 플래시 게임), 어떤 코드가 충돌 감지를 소유해야한다고 생각하니?게임에서 충돌 감지 관리

게임에서 나는 플레이어 그룹이 발사 한 적군과 발사체 그룹이 있다고 말한다. 그래서 과거 엔 EnemyManager 클래스를 사용하여 모든 프레임이 적의 위치를 ​​업데이트하고 마찬가지로 플레이어의 탄환은 총알 주위를 움직이는 PlayerProjectilesManager 클래스를 가졌습니다. 멋지다. 모든 것이 훌륭하고 멋쟁이 다. 그런데, 나는 총알이 에 영향을 미치기로 결정한 적이에 달한다. (내가 아는 미친!). 각 충돌

그래서에 대한 응답에서

  • 그림 (나는이 질문에 얼마나 상관 없어) 글 머리 기호 및 적들이 충돌하는

    1. 그림 아웃 : 그래서 내가해야 할 코드의 어딘가에 의미 기본적으로 EnemyManager 클래스는 충돌에 대한 소유권을 가져야하며 업데이트 루프 중에는 적의 총알 (즉 1 단계)과 충돌하는 플레이어 글 머리 기호를 찾고 두 객체에 대한 코드를 호출합니다 충돌 (예 : 적 손실 건강, 총알이 사라짐)을 처리합니다 (즉 2 단계). 그래서 EnemyManager에 충돌 감지 및 충돌 '반응'을 제어했습니다. 그것에 대해

      몇 가지 코멘트 :

      • 그것은 EnemyManager가 PlayerProjectilesManager
      • 모두 충돌 감지 및 충돌 '반응'이 동일한 소유자에 의해 처리되는 대신 '통제'에 있음을 나에게 임의의 변화 느낌 내 관점에서 볼 때 요구 사항이 아닙니다.

      내 마음에 나타나는 것은 충돌 탐지를 관리하는 타사 엔티티입니다. 예를 들어 다른 관리자가 충돌을 감지해야하는 코드가있는 CollisionManager가 있습니다. 이는 CollisionManager에 너무 많은 내부를 노출시키지 않으면 서 효율적인 충돌 감지를 위해 '관리자'가 노출해야하는 인터페이스와 같은 다른 질문을 유발합니다. 그런 다음 CollisionManager가 어떤 종류의 이벤트를 브로드 캐스팅하는 것으로 가정합니다. 두 개의 객체가 서로 충돌하는 등 ... EnemyManager/PlayerProjectilesManager는 이러한 이벤트를 개별적으로 수신하여 그에 따라 개별적으로 대응할 수 있습니다. 내 마음에 감각을 만들기 시작했다. :)

      생각하십니까? 거의 모든 게임에 충돌 감지 기능이 있으므로 이전에이 기능에 대해 논의 해 보았습니다. :)

  • 답변

    11

    이것은 좋은 질문입니다. 개인적으로, 나는 "관리자"를 사용하여 그렇게 복잡하게 만들지 않을 것입니다. 우리는 GameEngine이 있다고 가정 해 봅시다. GameEngine은 메인 루프에서 게임을 실행합니다. 이 메인 루프는 3 단계로 구성 될 수 있습니다. 즉, 사용자 입력을 받고, 게임의 모든 객체 상태를 업데이트하고 (사용자 입력에 따라) 마지막으로 화면에 모든 것을 다시 그립니다.

    두 번째 단계 - 개체의 상태를 업데이트 할 때 충돌 검색에 대한 모든 내용이 수행됩니다. 게임의 모든 객체가 풀에 저장되어 있다고 가정 해 봅시다. 여기에는 플레이어, 총알, 적, 심지어 세상이 포함됩니다 (세상에 어떻게 든 영향을주고 싶다면). 모든 다른 객체는 공통 속성을 가질 수 있습니다. Drawable, Movable, Collidable e.t.c가 될 수 있습니다. (인터페이스를 구현하거나 기본 클래스를 확장하여 이러한 속성을 갖는 것으로 생각하십시오.)

    이러한 속성 각각에 대해 풀의 모든 개체에 대해 작업을 수행하는 클래스가 있어야합니다. Mover.moveAll (objectsFromPool)과 같습니다.그러면 움직일 수있는 모든 객체가 이동합니다. 충돌 감지 -> 개체를 Mover로 재배치 한 후 CollisionDetector.cehckAll (objectsFromPool)과의 충돌을 확인합니다. 이 checkAll() 메서드는 객체 사이의 실제 충돌 감지를 수행하고 좌표를 알고 있습니다. 오브젝트가 Collidable 인 경우, CollisionDetector는 onCommand (withOtherObject) 메소드를 호출하고 다른 오브젝트가 충돌 한 것에 따라 오브젝트 자체가 올바르게 반응합니다. 예를 들어 플레이어가 적의 몸에 닿은 경우 두 사람 모두 뒤로 물러 설 것입니다. 총알이 다른 총알에 맞으면 - 둘 다 삭제 표시됩니다. 적에게 총알이 치면 피해가 생기고 총알은 삭제로 표시됩니다. 이러한 모든 반응은 해당 개체 자체에 있어야합니다. 충돌 감지기는 알고리즘을 적용하여 두 개체 간의 충돌을 감지 한 다음 onCollide (withOtherObjct) 메서드를 호출합니다. 개체가 Collidable이 아닌 경우 CollisionDetector에서 개체를 무시합니다 (예 : 비 입자 또는 먼지는 Collidable이 아닙니다).

    은 내가 올바른 : 나 자신에게 방법에 의해 https://gamedev.stackexchange.com/에있는 가장 적합한 게임 개발에 고유의

    0

    질문을 표현하기 위해 관리를 바랍니다. 그래서 과거에 내가 했어

    는 EnemyManager 클래스

    난 당신의 코드를 정확하게 아직 구성되지 않은 기호로 어떤 SomethingManager 클래스를 고려 말한다. 대부분의 경우 객체는 스스로 관리해야합니다. 그들이 할 수 없다면, 그것은 그들에 대한 어떤 외부 정보가 있다는 것을 암시하며 그 정보는 아마 '매니저'보다 더 구체적인 표현을 가지고있을 것입니다. 3 개의 게임 특정 예제는 GameWorld, GameRegion 또는 GameLevel 일 수 있습니다. 적들은 세계 또는 세계의 한 지역 또는 현재의 게임 레벨에 존재하므로 적의 목록을 유지해야합니다. 플레이어 발사체

    마찬가지로이

    이 발사체가 너무 게임 공간, 세계, 지역, 또는 레벨의 일종에 살고있는 것 PlayerProjectilesManager 클래스를했다.

    위의 객체 중 하나가 (아마도 간접적으로, 컨테이너 클래스를 통해 간접적으로 모든 유형의 헤비급 관리자를 통해가 아니라) 위의 모든 객체를 소유 할 수 있다는 것을 아마 추측 할 수 있습니다. 충돌을 감지하고 해결하는 역할을 담당합니다.