存储类指针矢量(RPG代码结构)
Storing class pointers vector (RPG Code Structure-wise)
我正在构建稍后将用于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>
?
无论如何,有一个Gender
s的容器似乎是一个奇怪的想法。正如你所说,你有4种可能的性别,然后你将其存储在这个向量中。所以向量的大小总是4,你从来没有从中删除过任何东西,也没有添加过任何东西?每个元素基本上都代表了一个生物可能拥有的性别?也就是说,你正在列举可能的性别。听起来你想要的是enum
(或enum class
)!
enum class gender {
unknown,
male,
female,
neuter
};
然后就没有必要再纠缠那些没有任何意义的丑陋ID了(至少,它们现在隐藏在枚举后面)。
然后你可以创造一个这样的生物:
Creature mPC("Name", gender::male);
如果您想打印出这些,您需要从枚举值到字符串的某种映射。实现这一点的一种方法是让switch
对gender
参数执行一个函数,并返回一个适当的字符串。或者,您可以创建一个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);
目前正在处理效果类,所以不能告诉太多关于它。
谢谢你的评论。
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 代码在main()中运行,但在函数中出现错误
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 编译包含字符串的代码时遇到问题
- 我在c++代码中生成了一个运行时#3异常
- 如何在linux终端中同时编译和运行c++代码
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 在Linux for Windows上编译C++代码时出错
- 我的字符计数代码计算错误.为什么
- 孤立代码块在结构中引发异常
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 此代码是否违反一个定义规则
- 为什么我的代码在输出中增加了93天
- 我的简单if-else语句是如何无法访问的代码
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 为什么在这个代码结束循环中没有得到结束
- 存储类指针矢量(RPG代码结构)
- C++有人能看看我完整的基于文本的新手rpg游戏代码吗