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