최근에는 딥 클래스 계층을 제거하고 구성 가능한 구성 요소로 대체하기 위해 게임 아키텍처를 개선하기로 결정했습니다. 내가 교체하는 첫 번째 계층은 항목 계층이며 올바른 길을 가고 있는지 알고 싶습니다.
이전에는 다음과 같은 계층 구조가있었습니다.
Item -> Equipment -> Weapon
-> Armor
-> Accessory
-> SyntehsisItem
-> BattleUseItem -> HealingItem
-> ThrowingItem -> ThrowsAsAttackItem
말할 것도없이 지저분 해지기 시작했고 여러 유형이 필요한 아이템에 대한 쉬운 해결책이 아니 었습니다 (즉, 일부 장비는 아이템 합성에 사용되고 일부 장비는 던질 수 있습니다).
그런 다음 리팩토링하고 기능을 기본 항목 클래스에 배치하려고했습니다. 그러나 나는 그 아이템에 사용되지 않은 / 불필요한 데이터가 많았다는 것에 주목했다. 이제 다른 게임 클래스에 시도하기 전에 적어도 항목에 대해 아키텍처와 같은 구성 요소를 만들려고합니다.
다음은 현재 구성 요소 설정에 대한 생각입니다.
다양한 구성 요소 (예 : 장비 구성 요소 슬롯, 치유 구성 요소 슬롯 등 및 임의 구성 요소에 대한 맵)에 대한 슬롯이있는 기본 항목 클래스가 있습니다.
class Item
{
//Basic item properties (name, ID, etc.) excluded
EquipmentComponent* equipmentComponent;
HealingComponent* healingComponent;
SynthesisComponent* synthesisComponent;
ThrowComponent* throwComponent;
boost::unordered_map<std::string, std::pair<bool, ItemComponent*> > AdditionalComponents;
}
모든 항목 구성 요소는 기본 ItemComponent 클래스에서 상속되며 각 구성 요소 유형은 엔진에 해당 기능을 구현하는 방법을 알려줍니다. 즉, HealingComponent는 배틀 메카닉에게 아이템을 힐링 아이템으로 소비하는 방법을 알려주는 반면, ThrowComponent는 배틀 엔진에게 아이템을 던질 수있는 아이템으로 취급하는 방법을 알려줍니다.
맵은 핵심 항목 구성 요소가 아닌 임의의 구성 요소를 저장하는 데 사용됩니다. 항목 컨테이너를 ItemComponent를 관리해야하는지 또는 외부 소스에서 관리하고 있는지 표시하기 위해 부울과 페어링하고 있습니다.
내 생각은 내 게임 엔진에서 사용하는 핵심 구성 요소를 미리 정의하고 항목 팩토리가 항목에 실제로있는 구성 요소를 할당한다는 것입니다. 그렇지 않으면 null입니다. 맵에는 일반적으로 스크립팅 파일에 의해 추가 / 소비되는 임의의 구성 요소가 포함됩니다.
내 질문은 이것이 좋은 디자인입니까? 그렇지 않은 경우 어떻게 개선 할 수 있습니까? 모든 구성 요소를지도로 그룹화하는 것을 고려했지만 핵심 항목 구성 요소에는 문자열 인덱싱을 사용하는 것이 불필요 해 보였습니다