inventory to unordered map

This commit is contained in:
maka70vv 2025-03-02 09:55:56 +06:00
parent d46e5da520
commit 784da51a3f
3 changed files with 65 additions and 36 deletions

View File

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

View File

@ -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();
}

View File

@ -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();