c # — Сохранение вектора указателей классов (по структуре кода 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 ++, чтобы получить правильную структуру и работать с чем-то, что можно использовать в более масштабных проектах.

Редактировать:
Было бы лучше, чтобы непосредственно хранить Пол * в классе Существо? И нет идентификатора существа?

Edit2:

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

Определение пол.ч

заранее спасибо

0

Решение

std::vector<Gender*> mGenders;

Я не вижу веской причины хранить указатели в вашем векторе. Почему бы просто не иметь std::vector<Gender>?

Во всяком случае, кажется странной идеей иметь контейнер Genders. Как вы говорите, у вас есть 4 возможных пола, которые вы затем сохраните в этом векторе. Таким образом, вектор всегда имеет размер 4, и вы никогда ничего не удаляете из него или ничего не добавляете к нему? И каждый элемент в основном просто представляет возможный пол, который может иметь существо? То есть ты Enumerating возможные полы. Похоже, вы хотите enum (или же enum class) вместо!

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

Тогда нет необходимости возиться с уродливыми идентификаторами, которые ничего не значат (по крайней мере, теперь они скрыты за перечислением).

Тогда вы могли бы создать существо так:

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

Если затем вы захотите распечатать их, вам понадобится какое-то отображение от значения enum к строкам. Одним из способов сделать это является просто иметь функцию, которая switchна gender аргумент и возвращает соответствующую строку. Кроме того, вы можете создать std::map вот так:

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

Затем вы можете напечатать определенный пол существа, выполнив:

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

Похоже, у вас нездоровая тенденция хотеть использовать динамическое распределение для ваших объектов. Не делайте этого, если в этом нет необходимости, и, когда это необходимо, предпочитайте умные указатели необработанным указателям.

0

Другие решения

С большой помощью от gamedev я теперь доволен тем, как много кода написано.

Вместо того, чтобы хранить целые числа, содержащие идентификаторы полов, рас и так далее. Я сейчас храню указатель на них. Визуализация getGenderByID (int id) устаревшего атма.

Я также в настоящее время работаю над системой баффов / дебаффов (эффектов) вместо того, чтобы иметь все различные бонусные переменные.

Эти изменения должны сделать код достаточно хорошим для практики!

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, так что не могу о нем много рассказать.

Спасибо за комментарии.

0

По вопросам рекламы [email protected]