0

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

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

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

性别.h的定义

提前致谢

4

2 回答 2

0

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

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

感谢您的评论。

于 2013-12-30T23:17:54.393 回答
0
std::vector<Gender*> mGenders;

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

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

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

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

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

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

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

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

然后,您只需执行以下操作即可打印特定生物的性别:

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

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

于 2013-12-30T09:47:28.163 回答