我最近决定修改游戏架构,以摆脱深层的类层次结构,并用可配置的组件替换它们。我要替换的第一个层次结构是Item层次结构,我想了解一些有关我是否处在正确轨道上的建议。
以前,我的层次结构如下所示:
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类继承,并且每种Component类型都负责告诉引擎如何实现该功能。也就是说,HealingComponent告诉战斗机械师如何将物品当作治疗物品使用,而ThrowComponent告诉战斗引擎如何将物品视为可扔物品。
该映射用于存储不是核心项目组件的任意组件。我将其与布尔值配对以指示项目容器应管理ItemComponent还是由外部源进行管理。
我的想法是,我先定义游戏引擎使用的核心组件,而我的商品工厂将分配商品实际拥有的组件,否则它们为null。该映射将包含通常由脚本文件添加/使用的任意组件。
我的问题是,这是一个好的设计吗?如果没有,该如何改善?我考虑过将所有组件分组到地图中,但是对于核心项组件而言,似乎不需要使用字符串索引