SFML и C++ Уроки \ Разработка игр › Форумы › SFML System, Window и другие вопросы › Проблемы с инвентарем и подбором вещей
В этой теме 2 ответа, 2 участника, последнее обновление saxartom 7 года/лет, 1 месяц назад.
-
АвторСообщения
-
Вообщем писал я инвентарь с такой логикой. Есть базовый класс TItems от него наследуются классы TWeapons, TAmmo, и еще пару в будущем.
Отдельно сам класс инвентаря TInventory который реализует сам инвентарь по средствам вектора элементов TItems. Код:
Базовый класс:
C++123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051class TItems{Sprite emtyCell, mainSprite, icon;std::string groupName, ownName;bool isEmpty = true;bool isAdd = false;bool onGround = true;TItems(Sprite &eC){emtyCell = eC;emtyCell.setOrigin(emtyCell.getTexture()->getSize().x / 2, emtyCell.getTexture()->getSize().y / 2);icon = emtyCell;groupName = "empty";ownName = " ";}};Оружие:class TWeapons: public TItems{public:int magazine, ammo, ammoPack, maxAmmoPack;Sprite ammoSprite;TWeapons(Sprite &aS, int countAmmo, int countAmmoPack, std::string gN, std::string oN, Sprite& eC):TItems(eC){groupName = gN;ownName = oN;ammo = countAmmo;ammoPack = countAmmoPack;if (ownName == "shotgun"){///---///}if (ownName == "pistol"){///---///}}void reloadWeap(Thero &hero){///---///}};Боезапас:class TAmmo:public TItems{public:int count;TAmmo(int count, Sprite &eC) :TItems(eC){count = count;}};Инвентарь:
C++1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859lass TInventory{public:bool showInventory;std::vector <TItems> inventory;std::vector <TItems>::iterator p;TInventory(TItems &item){inventory.reserve(8);showInventory = false;for (int i = 0; i < inventory.capacity();i++){inventory.insert(inventory.begin()+i, item);}}void drawInventory(RenderWindow &window, int x, int y){if (showInventory){for (int i = 0; i < inventory.size(); i++)window.draw(inventory[i].icon);}}bool addWeap(TItems &pickItem){for (int i = 0; i < 3;)if (inventory[i].isEmpty){inventory.erase(inventory.begin() + i);inventory.insert(inventory.begin() + i, pickItem);inventory[i].isEmpty = false;return true;}else{if (inventory[i].ownName == pickItem.ownName)return false;else i++;}return false;}void peakUpWeap(Thero &hero, TWeapons &item){if (hero.x > item.mainSprite.getPosition().x &&hero.y > item.mainSprite.getPosition().y &&hero.x < (item.mainSprite.getPosition().x + item.mainSprite.getTextureRect().width) &&hero.y < (item.mainSprite.getPosition().y + item.mainSprite.getTextureRect().height)){if (item.ownName == "shotgun" && addWeap(item)){hero.haveOneShotGun = true;item.onGround = false;}if (item.ownName == "pistol" && addWeap(item)){hero.haveOnePistol = true;item.onGround = false;}}}};И в функции peakUpWeap основная проблема. Она принимает объект класса TItems, а не другие, чтобы не писать такую функцию, для каждого типа предметов. Если в качестве аргумента передается оружие – нормально, то есть TWeapons приводится к TItems и ничего страшного, поскольку в инвентаре от оружия надо только String icon , а это элемент как раз класса TItems.
А вот если передается TAmmo, и усекается поле int count, поскольку в базовом его нет, а как раз это поле и главное в объекте.
Вопрос: правильно ли я иду в реализации инвентаря, тогда подскажите как обойти проблему с приведением типов, или нужно не парится и сделать пару контейнеров для разного типа предметов в классе инвентаря.
Спасибо, заранее)
Шаблонный класс вектора std::vector должен хранить указатели на TItesm, в противном случае у тебя происходит копирование объекта в результате чего все поля не базового класса усекаются.
Спасибо, но как насчет общей структуры инвентаря? Стоит ли вообще дальше развивать эту структуру, или есть более удобные (или попросту лучшие) варианты для реализации инвентаря?
-
АвторСообщения
Для ответа в этой теме необходимо авторизоваться.