이것은 후속 조치입니다 내가 대답 한이 질문에 이지만 훨씬 구체적인 주제를 다루고 있습니다.
이 답변을 통해 기사보다 엔티티 시스템을 더 잘 이해할 수있었습니다.
엔터티 시스템에 대한 기사를 읽었 으며 다음과 같이 말했습니다.
엔터티 는 ID와 구성 요소의 배열 일뿐입니다 (이 기사에서는 구성 요소에 엔터티를 저장하는 것이 좋은 방법은 아니지만 대안을 제공하지는 않음).
구성 요소 는 특정 엔터티로 수행 할 수있는 작업을 나타내는 데이터 조각입니다.
시스템 은 "메소드"이며 엔터티에 대한 데이터 조작을 수행합니다.
이것은 많은 상황에서 실제로 실용적으로 보이지만 데이터 클래스 인 구성 요소에 대한 부분은 나를 귀찮게합니다. 예를 들어 엔터티 시스템에서 Vector2D 클래스 (위치)를 어떻게 구현할 수 있습니까?
Vector2D 클래스는 x, y 좌표와 같은 데이터를 보유하지만 , 유용성에있어 결정적인 두 개의 요소 배열과 클래스를 구분하는 methods 도 있습니다 . 예제 방법은 다음과 같습니다 add()
. rotate(point, r, angle)
,,substract()
, normalize()
, 및 기타 모든 기준은, 유용하고, 절대적으로 필요한 방법합니다 (Vector2D 클래스의 인스턴스) 위치는 있어야한다고.
구성 요소가 데이터 홀더 인 경우 이러한 방법을 사용할 수 없습니다!
아마도 팝업 될 수있는 한 가지 해결책은 시스템 내부에서 구현하는 것이지만 매우 직관적입니다. 이 방법들은 내가 지금 수행하고 싶은 것들이며 , 완성되어 사용할 준비가 된 것입니다. MovementSystem
엔터티 위치에 대한 계산을 수행하도록 지시하는 값 비싼 메시지 세트를 읽을 때까지 기다리고 싶지 않습니다 !
그리고, 기사는 매우 명확하게한다고 만 시스템이 있어야 하나를 "피하기 OOP에"있었다, 기능, 그리고 내가 찾을 수있는 유일한 설명. 우선 엔티티와 컴포넌트에서 메소드를 사용하지 않는 이유를 이해하지 못합니다. 메모리 오버 헤드는 실질적으로 동일하며 시스템과 결합 될 때 흥미로운 방식으로 구현하고 결합하기가 매우 쉬워야합니다. 예를 들어, 시스템은 구현 자체를 알고있는 엔티티 / 구성 요소에 기본 로직 만 제공 할 수 있습니다. 당신이 나에게 묻는다면-이것은 기본적으로 ES와 OOP 모두에서 좋은 점을 취한 것입니다.이 기사의 저자에 따르면 할 수 없지만 좋은 습관처럼 보입니다.
이런 식으로 생각하십시오. 게임에는 다양한 유형의 드로어 블 객체가 있습니다. 평범한 오래된 이미지, 애니메이션 ( update()
,getCurrentFrame()
등), 이러한 기본 유형의 조합 및 그 모두는 단순히 draw()
렌더링 시스템에 메소드를 제공 할 수 있으며 엔티티의 스프라이트가 어떻게 구현되는지 신경 쓰지 않아도됩니다. 인터페이스 (드로우)와 위치에 대해 그런 다음 렌더링과 관련이없는 애니메이션 관련 메서드를 호출하는 애니메이션 시스템 만 있으면됩니다.
그리고 한 가지 더 ... 구성 요소를 저장할 때 배열에 대한 대안이 실제로 있습니까? Entity 클래스 내부의 배열 이외의 구성 요소를 저장할 수있는 다른 곳은 없습니다 ...
어쩌면 이것은 더 나은 접근 방법입니다. 구성 요소를 엔티티의 간단한 속성으로 저장하십시오. 예를 들어 위치 구성 요소는entity.position
.
유일한 다른 방법은 이상한 조회 테이블의 일종해야하는 것입니다 내부 , 시스템을 참조 다른 실체가. 그러나 단순히 엔티티에 구성 요소를 저장하는 것보다 개발이 매우 비효율적이고 복잡해 보입니다 .