【问题标题】:Storing class pointers vector (RPG Code Structure-wise)存储类指针向量(RPG 代码结构)
【发布时间】:2013-12-30 09:30:48
【问题描述】:

我正在构建稍后将用于 RPG 的小型组件,但是我在这种规模的项目中的经验非常有限,这就是为什么我选择独立构建它们的原因。这部分将介绍角色的创建和处理。

所以我有以下存储 Gender 的类指针的向量。我知道只有四种性别,Unknown(用于错误捕获)、Male、Female 和 Neuter。

std::vector<Gender*> mGenders;

但是对于其他一些向量,我不知道确切的数量。

std::vector<BClass*> mBClasses;

我有一个拥有 mGenderID 和 mBClassID 的生物。我有一个初始化所有性别和基类(以及许多其他类)的 game.h。假设我有一个

Creature* mPC = new Creature ("Name", GenderID, BClassID);

然后我应该有一个

Gender* Game::getGenderByID(int id) {
    for (std::vector<Gender*>::iterator it = mGenders.begin(); it != mGenders.end(); ++i) {
        if ((*it)->getID() == id) return (*it)
    }
}

并按如下方式使用

std::cout << "Your name is " << mPC->getName() << ". Your gender is " << getCreatureByID(mPC->getGenderID())->getName();

所以我的问题是,这是构建代码的好方法吗?想象一个无限引擎的游戏,博德之门左右。最好它应该适用于大多数人,即使我要做一个天际或类似 GTA 的游戏。

最后,移植到 C# 有多容易?由于我对 C++ 的了解比 C# 好,所以我想我应该先在 C++ 中尝试一下,以确保结构正确并使用可用于大型项目的东西。

编辑: 将 Gender* 直接存储在 Creature 类中会更好吗?并且没有该生物的 ID?

编辑2:

class Gender {
public:
Gender::Gender(int id, std::string name, std::string desc, int coeBonus, int strBonus, int agiBonus, int attBonus, int intBonus, int chaBonus);
~Gender();

int getID () const;
std::string getName () const;
std::string getDesc () const;

int getStrBonus () const;
int getAgiBonus () const;
int getAttBonus () const;
int getIntBonus () const;
int getChaBonus () const;
int getCoeBonus () const;

private:
int mID;
std::string mName;
std::string mDesc;
int mStrBonus;
int mAgiBonus;
int mAttBonus;
int mIntBonus;
int mChaBonus;
int mCoeBonus;
};

gender.h的定义

提前致谢

【问题讨论】:

  • 您在哪里创建性别?如果性别是强制性的,那么存储指向它们的指针是安全的。如果你使用 C++11,你可以考虑内存类。根据您的Gender 结构,您可以考虑使用枚举或枚举类。
  • 现在,我在 game.h 中创建性别,如果我有 int initGenders();它对所有性别执行 push_back()。我会为 BClasses 和比赛(等)做同样的事情。正如我在下面回答的那样,当 Genders 不仅仅拥有一个名字时,枚举并没有真正的用处。

标签: c# c++ code-structure


【解决方案1】:
std::vector<Gender*> mGenders;

我看不出将指针存储在向量中的充分理由。为什么不直接使用std::vector&lt;Gender&gt;

无论如何,拥有Genders 的容器似乎是一个奇怪的想法。正如您所说,您有 4 种可能的性别,然后将它们存储在此向量中。所以向量总是大小为 4 并且你永远不会从中删除任何东西或添加任何东西?每个元素基本上只是代表一个生物可以拥有的可能性别?也就是说,您正在枚举可能的性别。听起来你想要一个enum(或enum class)!

enum class gender {
  unknown,
  male,
  female,
  neuter
};

那么就没有必要乱用那些没有任何意义的丑陋 ID(至少,它们现在隐藏在枚举后面)。

然后你可以像这样创造一个生物:

Creature mPC("Name", gender::male);

如果你想把这些打印出来,你需要某种从枚举值到字符串的映射。一种方法是在gender 参数上使用switches 并返回适当字符串的函数。或者,您可以像这样创建std::map

std::map<gender, std::string> genderNames =
    {{gender::unknown, "Unknown"}, /* ... */};

然后你可以打印一个特定的生物性别,只需这样做:

std::cout << genderNames[mPC.getGender()];

您似乎有一种不健康的倾向,希望对您的对象使用动态分配。除非必要,否则不要这样做,并且在必要时,更喜欢智能指针而不是原始指针。

【讨论】:

  • 性别不仅仅是拥有一个名字,他们还有属性和技能的奖励。另外,后面一些更复杂的,比如比赛,我不知道他们会持有多少。我将不得不阅读更多关于智能指针的内容。
【解决方案2】:

在 gamedev 的大力帮助下,我现在对构建了多少代码感到满意。

而不是存储包含性别、种族等 ID 的整数。我现在存储一个指向它们的指针。渲染 getGenderByID(int id) 过时的 atm。

我目前也在研究一个 buff/debuff(效果)系统,而不是拥有所有不同的奖励变量。

这些更改应该使代码足以练习!

Gender::Gender(int id, std::string name, std::string desc, int coeBonus, int strBonus, int agiBonus, int attBonus, int intBonus, int chaBonus);

Gender(int id, std::string name, std::string desc, Effect* effect);

目前正在研究 Effect 类,所以不能说太多。

感谢cmets。

【讨论】:

    猜你喜欢
    • 2012-02-07
    • 1970-01-01
    • 2021-12-26
    • 2018-08-28
    • 2012-09-25
    • 1970-01-01
    • 2021-04-01
    • 2018-09-04
    相关资源
    最近更新 更多