From 784da51a3ffd6f11250a1c4241ae427002d8fb09 Mon Sep 17 00:00:00 2001 From: maka70vv <25.makarovv@gmail.com> Date: Sun, 2 Mar 2025 09:55:56 +0600 Subject: [PATCH] inventory to unordered map --- Inventory.cpp | 48 ++++++++++++++++++++++++++++++------------------ Inventory.h | 15 ++++++++------- RenderSystem.cpp | 38 +++++++++++++++++++++++++++----------- 3 files changed, 65 insertions(+), 36 deletions(-) diff --git a/Inventory.cpp b/Inventory.cpp index bf12ad3..7bd79fd 100644 --- a/Inventory.cpp +++ b/Inventory.cpp @@ -1,39 +1,51 @@ #include "Inventory.h" -#include // Для std::remove_if namespace ZL { - // Определяем глобальный инвентарь - std::vector gInventory; + // Определяем глобальную переменную + std::unordered_map gInventoryMap; void AddItemToInventory(const std::string& name, std::shared_ptr 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& ReturnInventory() + const std::unordered_map& ReturnInventory() { - return gInventory; + return gInventoryMap; } + } diff --git a/Inventory.h b/Inventory.h index 8f771fd..1935fdb 100644 --- a/Inventory.h +++ b/Inventory.h @@ -2,21 +2,20 @@ #include #include -#include +#include #include #include "TextureManager.h" namespace ZL { - // Структура, описывающая элемент инвентаря struct InventoryItem { std::string name; std::shared_ptr texture; }; - // Глобальный список инвентаря - extern std::vector gInventory; + // Глобальное хранилище предметов + extern std::unordered_map gInventory; // Добавить предмет в инвентарь void AddItemToInventory(const std::string& name, std::shared_ptr 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& ReturnInventory(); + const std::unordered_map& ReturnInventory(); } diff --git a/RenderSystem.cpp b/RenderSystem.cpp index 3df87f7..f92bcd5 100644 --- a/RenderSystem.cpp +++ b/RenderSystem.cpp @@ -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();