存储类指针矢量(RPG代码结构)

Storing class pointers vector (RPG Code Structure-wise)

本文关键字:RPG 代码 结构 指针 存储      更新时间:2023-10-16

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

所以我有下面的向量,它存储了Gender的类指针。我知道只有四种性别,未知(用于错误捕捉),男性,女性和中性。

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();

所以我的问题是,这是构建代码的好方法吗?想象一下,一个无限引擎般的游戏,《巴尔杜之门》(Baldur‘s Gate)左右。它应该对大多数人都有效,即使我要做一个类似《天际线》(Skyrim)或《侠盗猎车手》(GTA)的游戏。

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

编辑:将性别*直接存储在生物类中会更好吗?没有这个生物的身份证?

第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;
};

性别的定义。h

提前感谢

std::vector<Gender*> mGenders;

我看不出有什么好的理由将指针存储在向量中。为什么不只是有一个std::vector<Gender>

无论如何,有一个Genders的容器似乎是一个奇怪的想法。正如你所说,你有4种可能的性别,然后你将其存储在这个向量中。所以向量的大小总是4,你从来没有从中删除过任何东西,也没有添加过任何东西?每个元素基本上都代表了一个生物可能拥有的性别?也就是说,你正在列举可能的性别。听起来你想要的是enum(或enum class)!

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

然后就没有必要再纠缠那些没有任何意义的丑陋ID了(至少,它们现在隐藏在枚举后面)。

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

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

如果您想打印出这些,您需要从枚举值到字符串的某种映射。实现这一点的一种方法是让switchgender参数执行一个函数,并返回一个适当的字符串。或者,您可以创建一个std::map,如下所示:

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

然后你可以通过以下操作打印特定生物的性别:

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

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

在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);

目前正在处理效果类,所以不能告诉太多关于它。

谢谢你的评论。