首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RPG库存系统

RPG库存系统
EN

Code Review用户
提问于 2017-10-26 15:24:41
回答 1查看 1K关注 0票数 1

我在研究一个rpg的库存系统。我想要能够比较项目,限制特定物品(即消耗品)对特定库存时段(即腿、头)的访问,根据它们的属性总结项目,并使引入新类型的项目变得容易。

管理这些需求的好结构是什么?

我尝试了以下几点,但我对它有疑问(我把它缩短了,以使它更易读):

代码语言:javascript
复制
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
}
EN

回答 1

Code Review用户

回答已采纳

发布于 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()即可。

票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/178868

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档