탑 다운 멀티 플레이어 2D 슈팅 게임용 게임 엔진을 디자인하고 있는데, 다른 탑 다운 슈팅 게임에도 합리적으로 재사용 할 수 있기를 원합니다. 현재 엔터티 시스템과 같은 것을 어떻게 디자인해야하는지 생각하고 있습니다. 먼저 나는 이것에 대해 생각했다.
EntityManager라는 클래스가 있습니다. Update라는 메소드와 Draw라는 다른 메소드를 구현해야합니다. 논리와 렌더링을 분리하는 이유는 독립형 서버를 실행하는 경우 Draw 메소드를 생략 할 수 있기 때문입니다.
EntityManager는 BaseEntity 유형의 오브젝트 목록을 소유합니다. 각 엔터티는 EntityModel (엔터티의 드로어 블 표현), EntityNetworkInterface 및 EntityPhysicalBody와 같은 구성 요소 목록을 소유합니다.
EntityManager는 EntityRenderManager, EntityNetworkManager 및 EntityPhysicsManager와 같은 구성 요소 관리자 목록도 소유합니다. 각 구성 요소 관리자는 엔터티 구성 요소에 대한 참조를 유지합니다. 이 코드를 엔티티 자체 클래스에서 다른 그룹으로 옮기는 데는 여러 가지 이유가 있습니다. 예를 들어 게임에 외부 물리 라이브러리 인 Box2D를 사용하고 있습니다. Box2D에서 먼저 몸체와 모양을 월드에 추가하고 (이 경우에는 EntityPhysicsManager가 소유) 충돌 콜백을 추가합니다 (시스템의 엔티티 오브젝트 자체에 전달됨). 그런 다음 시스템의 모든 것을 시뮬레이션하는 기능을 실행하십시오. 이와 같은 외부 구성 요소 관리자에서 수행하는 것보다 더 나은 솔루션을 찾는 것이 어렵다는 것을 알았습니다.
엔티티 작성은 다음과 같이 수행됩니다. EntityManager 는 해당 클래스의 엔티티 작성 방법 을 등록 하는 RegisterEntity (entityClass, factory) 메소드를 구현합니다 . 또한 BaseEntity 유형의 오브젝트를 리턴하는 CreateEntity (entityClass) 메소드를 구현합니다.
이제 내 문제가 발생합니다. 구성 요소에 대한 참조가 구성 요소 관리자에 어떻게 등록됩니까? 팩토리 / 클로저에서 구성 요소 관리자를 참조하는 방법을 모르겠습니다.