Decidi recentemente reformular minha arquitetura de jogo para livrar-me de hierarquias profundas de classe e substituí-las por componentes configuráveis. A primeira hierarquia que estou substituindo é a hierarquia de itens e gostaria de alguns conselhos para saber se estou no caminho certo.
Anteriormente, eu tinha uma hierarquia que era algo assim:
Item -> Equipment -> Weapon
-> Armor
-> Accessory
-> SyntehsisItem
-> BattleUseItem -> HealingItem
-> ThrowingItem -> ThrowsAsAttackItem
Escusado será dizer que estava começando a ficar confuso e não foi uma solução fácil para itens que precisavam ser de vários tipos (ou seja, alguns equipamentos são usados na síntese de itens, outros são jogáveis etc.)
Tentei refatorar e colocar a funcionalidade na classe de item base. Mas então eu estava notando que o Item tinha muitos dados não utilizados / supérfluos. Agora estou tentando fazer um componente como arquitetura, pelo menos para meus itens, antes de tentar fazê-lo em minhas outras classes de jogos.
Aqui está o que estou pensando atualmente para a configuração do componente:
Eu tenho uma classe de item base que possui slots para vários componentes (ou seja, um slot de componente de equipamento, um slot de componente de recuperação, etc., bem como um mapa para componentes arbitrários), algo assim:
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;
}
Todos os componentes do item herdariam de uma classe ItemComponent base e cada tipo de componente é responsável por informar ao mecanismo como implementar essa funcionalidade. ou seja, o HealingComponent diz à mecânica da batalha como consumir o item como um item de cura, enquanto o ThrowComponent diz ao mecanismo de batalha como tratar o item como um item jogável.
O mapa é usado para armazenar componentes arbitrários que não são componentes principais do item. Estou associando-o a um bool para indicar se o Contêiner de Itens deve gerenciar o ItemComponent ou se está sendo gerenciado por uma fonte externa.
Minha idéia aqui foi que eu defina os componentes principais usados pelo meu mecanismo de jogo, e minha fábrica de itens atribuiria os componentes que o item realmente possui, caso contrário, eles serão nulos. O mapa conteria componentes arbitrários que geralmente seriam adicionados / consumidos por arquivos de script.
Minha pergunta é: esse é um bom design? Caso contrário, como pode ser melhorado? Eu considerei agrupar todos os componentes no mapa, mas o uso de indexação de strings parecia desnecessário para os componentes principais do item
fonte