Я создаю небольшие компоненты, которые позже будут использоваться для РПГ, однако мой опыт в этом масштабе проекта очень ограничен, поэтому я решил создавать их независимо друг от друга. Эта часть будет посвящена созданию персонажей и их обработке.
Итак, у меня есть следующий вектор, в котором хранятся указатели класса 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;
};
Определение пол.ч
заранее спасибо
std::vector<Gender*> mGenders;
Я не вижу веской причины хранить указатели в вашем векторе. Почему бы просто не иметь std::vector<Gender>
?
Во всяком случае, кажется странной идеей иметь контейнер Gender
s. Как вы говорите, у вас есть 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()];
Похоже, у вас нездоровая тенденция хотеть использовать динамическое распределение для ваших объектов. Не делайте этого, если в этом нет необходимости, и, когда это необходимо, предпочитайте умные указатели необработанным указателям.
С большой помощью от 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, так что не могу о нем много рассказать.
Спасибо за комментарии.