(내가 설명하는 것은이 디자인을 기반으로합니다 : 엔티티 시스템 프레임 워크는 무엇입니까? , 아래로 스크롤하면 찾을 수 있습니다)
C ++에서 엔터티 구성 요소 시스템을 만드는 데 문제가 있습니다. 컴포넌트 클래스가 있습니다 :
class Component { /* ... */ };
실제로 다른 구성 요소를 작성하기위한 인터페이스입니다. 따라서 커스텀 컴포넌트를 만들려면 인터페이스를 구현하고 게임 내에서 사용될 데이터를 추가하기 만하면됩니다.
class SampleComponent : public Component { int foo, float bar ... };
이러한 구성 요소는 Entity 클래스 안에 저장되어 Entity의 각 인스턴스에 고유 한 ID를 제공합니다.
class Entity {
int ID;
std::unordered_map<string, Component*> components;
string getName();
/* ... */
};
구성 요소 이름을 해시하여 구성 요소를 엔터티에 추가합니다 (아마도 좋은 생각은 아닙니다). 사용자 컴포넌트를 추가하면 컴포넌트 유형 (기본 클래스)으로 저장됩니다.
반면에, 내부에 노드 인터페이스를 사용하는 시스템 인터페이스가 있습니다. Node 클래스는 단일 엔터티의 일부 구성 요소를 저장하는 데 사용됩니다 (시스템이 모든 엔터티의 구성 요소 사용에 관심이 없기 때문에). 시스템이 update()
해야 할 경우, 다른 엔티티에서 생성 한 저장된 노드를 통해서만 반복하면됩니다. 그래서:
/* System and Node implementations: (not the interfaces!) */
class SampleSystem : public System {
std::list<SampleNode> nodes; //uses SampleNode, not Node
void update();
/* ... */
};
class SampleNode : public Node {
/* Here I define which components SampleNode (and SampleSystem) "needs" */
SampleComponent* sc;
PhysicsComponent* pc;
/* ... more components could go here */
};
이제 문제 : 엔티티를 SampleSystem에 전달하여 SampleNode를 빌드한다고 가정 해 봅시다. 그런 다음 SampleNode는 엔티티에 SampleSystem에서 사용할 필수 구성 요소가 있는지 "확인"합니다. Entity 내부의 원하는 구성 요소에 액세스해야 할 때 문제가 나타납니다. 구성 요소가 Component
(기본 클래스) 컬렉션에 저장되어 있으므로 구성 요소에 액세스하여 새 노드에 복사 할 수 없습니다. Component
파생 형식으로 다운 캐스팅하여 문제를 일시적으로 해결 했지만 더 좋은 방법이 있는지 알고 싶었습니다. 이것이 내가 이미 가지고있는 것을 다시 디자인하는 것을 의미하는지 이해합니다. 감사.