inventory to unordered map
This commit is contained in:
parent
d46e5da520
commit
784da51a3f
@ -1,39 +1,51 @@
|
||||
#include "Inventory.h"
|
||||
#include <algorithm> // Для std::remove_if
|
||||
|
||||
namespace ZL
|
||||
{
|
||||
// Определяем глобальный инвентарь
|
||||
std::vector<InventoryItem> gInventory;
|
||||
// Определяем глобальную переменную
|
||||
std::unordered_map<std::string, InventoryItem> gInventoryMap;
|
||||
|
||||
void AddItemToInventory(const std::string& name, std::shared_ptr<Texture> tex)
|
||||
{
|
||||
gInventory.push_back({ name, tex });
|
||||
InventoryItem item;
|
||||
item.name = name;
|
||||
item.texture = tex;
|
||||
|
||||
// Вставляем или перезаписываем (operator[] так сделает).
|
||||
gInventoryMap[name] = item;
|
||||
}
|
||||
|
||||
void RemoveItemFromInventory(const std::string name)
|
||||
void RemoveItemFromInventory(const std::string& name)
|
||||
{
|
||||
gInventory.erase(
|
||||
std::remove_if(gInventory.begin(), gInventory.end(),
|
||||
[&name](const InventoryItem& item) {
|
||||
return item.name == name;
|
||||
}),
|
||||
gInventory.end());
|
||||
// erase вернёт количество удалённых элементов, если нужно проверить
|
||||
gInventoryMap.erase(name);
|
||||
}
|
||||
|
||||
InventoryItem* GetItemByName(const std::string& name)
|
||||
{
|
||||
// Пытаемся найти элемент по ключу
|
||||
auto it = gInventoryMap.find(name);
|
||||
if (it != gInventoryMap.end())
|
||||
{
|
||||
// Возвращаем адрес найденного InventoryItem
|
||||
return &it->second;
|
||||
}
|
||||
// Если не нашли – nullptr
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
void PrintInventory()
|
||||
{
|
||||
for (const auto& item : gInventory)
|
||||
std::cout << "Inventory contents:\n";
|
||||
for (auto& [itemName, item] : gInventoryMap)
|
||||
{
|
||||
std::cout << "Item: " << item.name
|
||||
<< ", texture ID = "
|
||||
<< (item.texture ? item.texture->getTexID() : 0)
|
||||
<< std::endl;
|
||||
std::cout << " - " << itemName << "\n";
|
||||
}
|
||||
}
|
||||
|
||||
const std::vector<InventoryItem>& ReturnInventory()
|
||||
const std::unordered_map<std::string, InventoryItem>& ReturnInventory()
|
||||
{
|
||||
return gInventory;
|
||||
return gInventoryMap;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
15
Inventory.h
15
Inventory.h
@ -2,21 +2,20 @@
|
||||
|
||||
#include <string>
|
||||
#include <memory>
|
||||
#include <vector>
|
||||
#include <unordered_map>
|
||||
#include <iostream>
|
||||
#include "TextureManager.h"
|
||||
|
||||
namespace ZL
|
||||
{
|
||||
// Структура, описывающая элемент инвентаря
|
||||
struct InventoryItem
|
||||
{
|
||||
std::string name;
|
||||
std::shared_ptr<Texture> texture;
|
||||
};
|
||||
|
||||
// Глобальный список инвентаря
|
||||
extern std::vector<InventoryItem> gInventory;
|
||||
// Глобальное хранилище предметов
|
||||
extern std::unordered_map<std::string, InventoryItem> gInventory;
|
||||
|
||||
// Добавить предмет в инвентарь
|
||||
void AddItemToInventory(const std::string& name, std::shared_ptr<Texture> tex);
|
||||
@ -24,9 +23,11 @@ namespace ZL
|
||||
// Удалить предмет из инвентаря
|
||||
void RemoveItemFromInventory(const std::string& name);
|
||||
|
||||
// Вывести все предметы в инвентаре
|
||||
// Поиск предмета по имени (возвращает указатель или nullptr)
|
||||
InventoryItem* GetItemByName(const std::string& name);
|
||||
|
||||
// Вывести весь инвентарь в консоль
|
||||
void PrintInventory();
|
||||
|
||||
// Получить список предметов инвентаря
|
||||
const std::vector<InventoryItem>& ReturnInventory();
|
||||
const std::unordered_map<std::string, InventoryItem>& ReturnInventory();
|
||||
}
|
||||
|
||||
@ -107,17 +107,33 @@ void RenderSystem::drawUI(const GameObjectManager& gameObjects) {
|
||||
}
|
||||
}
|
||||
|
||||
// Draw inventory
|
||||
const auto& inventory = ZL::ReturnInventory();
|
||||
for (size_t i = 0; i < inventory.size(); ++i) {
|
||||
renderer.PushMatrix();
|
||||
float xPos = Environment::width - gameObjects.INVENTORY_MARGIN - gameObjects.INVENTORY_ICON_SIZE;
|
||||
float yPos = gameObjects.INVENTORY_MARGIN + i * (gameObjects.INVENTORY_ICON_SIZE + gameObjects.INVENTORY_MARGIN);
|
||||
renderer.TranslateMatrix(Vector3f{xPos, yPos, 0.0f});
|
||||
glBindTexture(GL_TEXTURE_2D, inventory[i].texture->getTexID());
|
||||
renderer.DrawVertexRenderStruct(gameObjects.inventoryIconMeshMutable);
|
||||
renderer.PopMatrix();
|
||||
}
|
||||
const auto& inventoryMap = ZL::ReturnInventory();
|
||||
|
||||
// Заводим счётчик i, чтобы вычислять позицию иконки
|
||||
int i = 0;
|
||||
|
||||
// Итерируемся по всем предметам,
|
||||
for (const auto& [name, item] : inventoryMap) {
|
||||
renderer.PushMatrix();
|
||||
|
||||
float xPos = Environment::width
|
||||
- gameObjects.INVENTORY_MARGIN
|
||||
- gameObjects.INVENTORY_ICON_SIZE;
|
||||
float yPos = gameObjects.INVENTORY_MARGIN
|
||||
+ i * (gameObjects.INVENTORY_ICON_SIZE
|
||||
+ gameObjects.INVENTORY_MARGIN);
|
||||
|
||||
renderer.TranslateMatrix(Vector3f{xPos, yPos, 0.0f});
|
||||
|
||||
// item.texture->getTexID() – сам текстурный ID
|
||||
glBindTexture(GL_TEXTURE_2D, item.texture->getTexID());
|
||||
renderer.DrawVertexRenderStruct(gameObjects.inventoryIconMeshMutable);
|
||||
|
||||
renderer.PopMatrix();
|
||||
|
||||
i++;
|
||||
}
|
||||
|
||||
|
||||
renderer.PopMatrix();
|
||||
renderer.PopProjectionMatrix();
|
||||
|
||||
Loading…
Reference in New Issue
Block a user