다른 유형의 엔티티 목록 관리-더 좋은 방법이 있습니까?


9

모바일 장치 용 2D 우주 게임을 개발하고 있지만 실제로 복잡해지고 솔루션이 실제로 혼란스럽고 반복되는 많은 코드 세그먼트를 생성합니다.

나는 다음과 같은 다른 객체의 다중 목록을 가진 세계적 수준을 가지고 있습니다.

List<Enemy> enemys;
List<Projectile> projectiles;
List<Collectable> collectables;
List<Asteroid> asteroids;
List<Effect> effects;
..

각 목록은 월드 클래스에 의해 업데이트됩니다. 그러나 전부는 아닙니다. 각 적에게는 엔진 목록과 적에 의해 업데이트되는 무기 런처 목록이 있습니다. 이제 각 엔진은 월드리스트 '효과'에 불 효과를 추가하고, 각 무기 발사기는 월드리스트 '발사체'에 발사체를 추가합니다. 이 모든 클래스에는 다른 매개 변수가 있으므로 각 클래스마다 추가 업데이트 및 추가 렌더링 기능이 필요합니다.

적어도 그들은 위치, 속도 및 가속도 벡터, 경계 다각형 및 applyForce 및 유한 상태 기계와 같은 함수와 같은 기본 사항을 제공하는 'GameObject'의 모든 자식입니다.

이 작업을 수행하는 더 낫거나 더 일반적인 방법이 있습니까? 모든 다른 객체에 대해 가능한 모든 매개 변수와 메소드를 포함하는 하나의 포괄 클래스와 같습니다. (이것은 훨씬 더 혼란스러운 코드를 생성 할 것이라고 생각합니다)


이것은 내 질문과 비슷합니다 : gamedev.stackexchange.com/questions/22559/… 나는 주어진 답변을 살펴볼 것을 제안합니다.
Derek

답변:


5

이 작업을 수행하는 더 낫거나 더 일반적인 방법이 있습니까? 모든 다른 객체에 대해 가능한 모든 매개 변수와 메소드를 포함하는 하나의 포괄 클래스와 같습니다.

그렇습니다. 건축물. 자세한 내용 은 여기 를 보십시오 .

이를 통해 세계 수준의 엔티티 목록을 하나만 만들 수 있습니다.

List<Entity>

상속을 통한 컴포지션 의 한 예입니다 .


3

원래 질문의 범위 내에서 하나의 옵션은 목록을 사용자가 가진 것과 같은 유형 대신 작업으로 나누는 것입니다. 예를 들어,이 것 List<HasAI>하고 하나 List<Collidable>와 새로운 객체를 생성 할 때이 객체가 파괴 될 때이 필요로 어떤 행동 목록이 해당 목록에서 자신을 제거에 자신을 추가합니다. 개체는 여러 목록에있을 수 있습니다.

이 옵션의 2 단계는 클래스를 계층 구조에서 인터페이스를 사용하는 계층으로 리팩토링하는 것이므로 HasAI 유형은 IBrains 인터페이스를 예로 구현하는 클래스입니다. List<HasAI>객체에만 IBrains 인터페이스가 필요 하다는 것을 일치 시킵니다.

복잡성을 정리하는 데 도움이됩니다.


2

나는 당신이해야 할 일은 자신의 클래스로 렌더링을 추상화하는 것입니다. 플레이어와 적을위한 것 (또는 플레이어를위한 것)과 플레이어와 적을위한 인스턴스를 만듭니다 .100 % 확실하지 않습니다. 게임 디자인.)

방문자 패턴을 사용하여 렌더러가 다양한 객체 주위를 반복하고 그릴 대상을 결정하면 덜 복잡 할 수 있습니다.


2

기본 클래스를 사용하고 다형성에 의존하는 것이 좋습니다. 그러나 몇 가지 대안이 있습니다. Noel Llopis의 두 가지 기사가 있습니다. 최근 Data Oriented Design을 살펴 보았고 장점이 있다고 생각합니다.

기사는 여기여기에 있습니다 . 다형성보다 코드를 조금 더 단순화 할 수 있습니다. 그러나 YMMV와 마찬가지로 살펴보고 달성하려는 것과 일치하는지 확인하십시오. 다형성은 상속을 사용하고 DOD는 집계에 장단점이 있으므로 독을 선택하십시오.


1

OOP, 특히 다형성을 활용하면 가능합니다.

기본적으로 모든 게임 개체가 상속하는 기본 클래스를 만들어야합니다. 이 기본 클래스는 가능한 한 추상적이며 Creation, Update 및 아마도 Destroy 함수와 같은 것들을 포함합니다.

그런 다음이 클래스에서 다른 모든 게임 개체를 파생시킵니다. 언어가 지원하지 않는 경우 고급 기능을 수행하려면 코드에 일종의 리플렉션을 추가해야하지만 상속을 올바르게 구성하는 방법을 알고 있으면 피할 수 있습니다.


1
그는 이미 이것을했습니다. 그의 모든 클래스는 GameObject의 자식입니다. 그는 일련의 목록을 단일 게임 오브젝트 목록으로 바꾸면됩니다.
SomeGuy
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.