我在研究一个rpg的库存系统。我想要能够比较项目,限制特定物品(即消耗品)对特定库存时段(即腿、头)的访问,根据它们的属性总结项目,并使引入新类型的项目变得容易。
管理这些需求的好结构是什么?
我尝试了以下几点,但我对它有疑问(我把它缩短了,以使它更易读):
class Attributes{
public:
int agility = 0;
};
class Stackable{};
class Inventoryable : Entity{
public:
string name = "";
};
class Wearable : Itemable, Attributes{};
class Consumable : Itemable, Stackable{};
class Armor : Wearable{};
class Weapon : Wearable{};
class Cloth : Armor{};
class Pike : Weapon{};
class Item : Inventoryable{
private:
Inventoryable inv_;
public:
Item(Inventoryable inv_type) : inv_(inv_type) {};
}
int main(void) {
Item socks = new Item(Cloth);
socks.name = "Stinky Socks"; //Inventoryable
socks.agility = 10; //Attributes
}发布于 2017-10-27 09:16:11
根据您将拥有的项目类型和在任何时候将有多少个项目是活的,它可能支付使用飞重模式。其中,每个项堆栈都有一个指向包含所有行为的项类型的指针,并且保存使堆栈惟一和/或经常使用的数据(堆栈中有多少项,供sprite绘制的id,.)。
使ItemStack对象固定大小(当您需要额外的存储空间时使用指针)将允许您使库存持有一个std::vector<ItemStack>而不是std::vector<std::unique_ptr<ItemStack>>。当迭代一个库存中的所有项目时,第一个将具有更好的性能。按价值持有你所能使用的东西,并尽可能少的使用其他的指针。
我不喜欢复杂的继承树,不管是你还是需要基类中的一个虚拟函数,还是到处都需要dynamic_casts。
Stackable作为一种标记类型是一种非常糟糕的方法,可以使某些东西堆叠起来。您将需要dynamic_cast来确定它是否可以堆栈,并且堆栈项可能每个都有不同的最大堆栈大小,然后需要进行查询。因此,只需在item类型的基类中创建一个virtual size_t get_max_stack()即可。
https://codereview.stackexchange.com/questions/178868
复制相似问题