나는 최근에 '엔티티 시스템'을 사용하여 간단한 Space Invadors 게임을 만들었습니다. 속성과 동작을 매우 잘 분리하는 패턴입니다. 완전히 이해하기 위해 몇 번의 반복이 필요했지만 일단 몇 가지 구성 요소를 설계하면 기존 구성 요소를 사용하여 새 객체를 작성하는 것이 매우 간단 해집니다.
이것을 읽어야합니다.
http://t-machine.org/index.php/2007/09/03/entity-systems-are-the-future-of-mmog-development-part-1/
지식이 풍부한 사람이 자주 업데이트합니다. 또한 구체적인 코드 예제가있는 유일한 엔터티 시스템 토론이기도합니다.
내 반복은 다음과 같이 진행되었습니다.
첫 번째 반복에는 Adam이 설명한 "EntitySystem"오브젝트가있었습니다. 그러나 내 구성 요소에는 여전히 메서드가 있습니다. '렌더러 블'구성 요소에는 paint () 메서드가 있고 내 위치 구성 요소에는 move () 메서드가 있습니다. 엔티티를 살살 내기 시작했을 때 구성 요소 업데이트 및 구성 요소 업데이트 실행 순서가 너무 복잡합니다.
그래서 돌아가서 T-machines 블로그를 다시 읽었습니다. 주석 스레드에는 많은 정보가 있으며 실제로 컴포넌트 에는 동작이 없는 컴포넌트가 엔티티 시스템에 의해 제공됨을 강조 합니다. 이러한 방식으로, 순서는 전체 시스템 실행 순서에 따라 결정되므로 구성 요소와 주문 구성 요소 업데이트간에 메시지를 전달할 필요가 없습니다 . 확인. 어쩌면 너무 추상적 일 수도 있습니다.
어쨌든 반복 # 2를 위해 이것은 블로그에서 얻은 것입니다.
EntityManager-특정 유형의 구성 요소를 포함하는 엔티티에 대해 조회 할 수있는 구성 요소 "데이터베이스"역할을합니다. 빠른 액세스를 위해 인 메모리 데이터베이스로 백업 할 수도 있습니다. 자세한 내용은 t-machine part 5를 참조하십시오.
EntitySystem-각 시스템은 기본적으로 일련의 엔트 라이트에서 작동하는 방법입니다. 각 시스템은 엔티티의 구성 요소 x, y 및 z를 사용하여 작업을 수행합니다. 따라서 구성 요소 x, y 및 z가있는 엔티티에 대해 관리자에게 조회 한 다음 해당 결과를 시스템에 전달합니다.
엔터티-long과 같은 id입니다. 엔티티는 컴포넌트 인스턴스 세트를 '엔티티'로 그룹화하는 것입니다.
구성 요소-일련의 필드 .... 동작 없음! 당신이 행동을 추가하기 시작할 때 그것은 단순한 우주 인베이더 게임에서도 지저분 해지 기 시작합니다.
편집하다 : 그런데 'dt'는 마지막 메인 루프 호출 이후의 델타 시간입니다.
제 주요 Invadors 루프는 다음과 같습니다.
Collection<Entity> entitiesWithGuns = manager.getEntitiesWith(Gun.class);
Collection<Entity> entitiesWithDamagable =
manager.getEntitiesWith(BulletDamagable.class);
Collection<Entity> entitiesWithInvadorDamagable = manager.getEntitiesWith(InvadorDamagable.class);
keyboardShipControllerSystem.update(entitiesWithGuns, dt);
touchInputSystem.update(entitiesWithGuns, dt);
Collection<Entity> entitiesWithInvadorMovement = manager.getEntitiesWith(InvadorMovement.class);
invadorMovementSystem.update(entitiesWithInvadorMovement);
Collection<Entity> entitiesWithVelocity = manager.getEntitiesWith(Velocity.class);
movementSystem.move(entitiesWithVelocity, dt);
gunSystem.update(entitiesWithGuns, System.currentTimeMillis());
Collection<Entity> entitiesWithPositionAndForm = manager.getEntitiesWith(Position.class, Form.class);
collisionSystem.checkCollisions(entitiesWithPositionAndForm);
처음에는 조금 이상해 보이지만 매우 유연합니다. 최적화하는 것도 매우 쉽습니다. 다른 구성 요소 유형의 경우 검색을 더 빠르게하기 위해 다른 백업 데이터 스토어를 가질 수 있습니다. 'form'클래스의 경우 충돌 감지를위한 액세스 속도를 높이기 위해 쿼드 트리로 백업 할 수 있습니다.
나는 당신과 같습니다. 나는 노련한 개발자이지만 게임 작성 경험이 없습니다. 나는 개발 패턴을 연구하는 데 약간의 시간을 보냈고, 이것은 내 눈을 사로 잡았습니다. 그것은 일을하는 유일한 방법은 아니지만 매우 직관적이고 강력하다는 것을 알았습니다. 이 패턴은 "Game Programming Gems"시리즈 ( http://www.amazon.com/Game-Programming-Gems/dp/1584500492)의 6 권에서 공식적으로 논의되었다고 생각합니다 . 나는 어떤 책도 읽지 않았지만 게임 프로그래밍에 대한 사실상의 참조라고 들었습니다.