diff --git a/GameObjectManager.cpp b/GameObjectManager.cpp index 60c52c5..3a089c6 100644 --- a/GameObjectManager.cpp +++ b/GameObjectManager.cpp @@ -29,7 +29,6 @@ void GameObjectManager::initialize() { testObjMeshMutable.RefreshVBO(); textMesh = ZL::LoadFromTextFile("./textures/mesh_first_room.txt"); - textMesh.NormalData // Add ZL:: namespace textMesh.Scale(10); textMesh.SwapZandY(); textMesh.RotateByMatrix(QuatToMatrix(QuatFromRotateAroundX(M_PI * 0.5))); @@ -115,23 +114,11 @@ void GameObjectManager::initialize() { roomTexturePtr = rooms[current_room_index].roomTexture; - // Добавляем тестовые предметы с правильными hot_key - if (objects_in_inventory < MAX_INVENTORY_SLOTS) { - AddItemToInventory("book1", std::make_shared(CreateTextureDataFromBmp24("./Kitchen_ceramics.bmp")), 1); - objects_in_inventory++; - std::cout << "Added item with hotkey 1" << std::endl; - } - - if (objects_in_inventory < MAX_INVENTORY_SLOTS) { - AddItemToInventory("book2", std::make_shared(CreateTextureDataFromBmp24("./Kitchen_ceramics.bmp")), 2); - objects_in_inventory++; - std::cout << "Added item with hotkey 2" << std::endl; - } + AddItemToInventory("book1", std::make_shared(CreateTextureDataFromBmp24("./Kitchen_ceramics.bmp")), objects_in_inventory+1); + objects_in_inventory++; + AddItemToInventory("book2", std::make_shared(CreateTextureDataFromBmp24("./Kitchen_ceramics.bmp")), objects_in_inventory+1); + objects_in_inventory++; - // Test inventory items - AddItemToInventory("book1", std::make_shared(CreateTextureDataFromBmp24("./Kitchen_ceramics.bmp")), 1); - AddItemToInventory("book2", std::make_shared(CreateTextureDataFromBmp24("./Kitchen_ceramics.bmp")), 2); - objects_in_inventory = 2; //SDL_ShowCursor(SDL_DISABLE); SDL_SetRelativeMouseMode(SDL_TRUE); @@ -163,6 +150,10 @@ void GameObjectManager::handleEvent(const SDL_Event& event) { switch_room(1); } else if (event.type == SDL_MOUSEBUTTONDOWN) { + if (InventoryItem* item = GetItemSelected(true)) { + + } + else { const auto highlightedObjects = aoMgr.findByHighlighted(true); for (auto* ao : highlightedObjects) { @@ -175,6 +166,7 @@ void GameObjectManager::handleEvent(const SDL_Event& event) { aoMgr.removeByName(ao->name); } + } // bx.Interpolate(animationCounter); // animationCounter += 2; } @@ -274,26 +266,14 @@ void GameObjectManager::handleEvent(const SDL_Event& event) { case SDLK_7: case SDLK_8: case SDLK_9: - { - int slot_index = event.key.keysym.sym - SDLK_1 + 1; - std::cout << "Selected slot: " << slot_index << std::endl; - + { + UnselectAllItems(); - - if (auto* item = GetItemByIndex(slot_index)) { - std::cout << "Found item in slot " << slot_index << std::endl; + if (InventoryItem* item = GetItemByHotkey(event.key.keysym.sym - SDLK_1 + 1)) { item->isSelected = true; - item->scale = SELECTED_ITEM_SCALE; - - inventoryIconMesh = CreateRect2D( - {0.0f, 40.0f}, - {INVENTORY_ICON_SIZE/2 * item->scale, INVENTORY_ICON_SIZE/2 * item->scale}, - 0.5f - ); - inventoryIconMeshMutable.AssignFrom(inventoryIconMesh); - inventoryIconMeshMutable.RefreshVBO(); } } + break; // ...handle other keys... @@ -491,10 +471,10 @@ bool GameObjectManager::isPointInObject(int screenX, int screenY, int objectScre const int baseObjectSize = 32; // Base half-size const float scale = 1.0f; // Get scale from item if needed const int scaledObjectSize = static_cast(baseObjectSize * scale); - - return (screenX >= objectScreenX - scaledObjectSize && + + return (screenX >= objectScreenX - scaledObjectSize && screenX <= objectScreenX + scaledObjectSize && - screenY >= objectScreenY - scaledObjectSize && + screenY >= objectScreenY - scaledObjectSize && screenY <= objectScreenY + scaledObjectSize); } diff --git a/Inventory.cpp b/Inventory.cpp index f984b88..71af814 100644 --- a/Inventory.cpp +++ b/Inventory.cpp @@ -2,7 +2,7 @@ namespace ZL { - std::unordered_map gInventoryMap; + std::unordered_map gInventoryMap; void AddItemToInventory(const std::string& name, std::shared_ptr tex, int slot_index) { @@ -16,27 +16,48 @@ namespace ZL item.hot_key = slot_index; item.scale = 1.0f; - gInventoryMap[slot_index] = item; + gInventoryMap[name] = item; std::cout << "Added item to slot " << slot_index << std::endl; } - void RemoveItemFromInventory(int slot_index) + void RemoveItemFromInventory(const std::string& name) { - gInventoryMap.erase(slot_index); + // erase вернёт количество удалённых элементов, если нужно проверить + gInventoryMap.erase(name); } - InventoryItem* GetItemByIndex(int slot_index) + + InventoryItem* GetItemByName(const std::string name) { - auto it = gInventoryMap.find(slot_index); - if (it != gInventoryMap.end()) { + // Пытаемся найти элемент по ключу + auto it = gInventoryMap.find(name); + if (it != gInventoryMap.end()) + { + // Возвращаем адрес найденного InventoryItem return &it->second; } + // Если не нашли – nullptr return nullptr; } InventoryItem* GetItemByHotkey(int hotkey) { - return GetItemByIndex(hotkey); // Now we can just use the index directly + for (auto& [_, item] : gInventoryMap) { + if (item.hot_key == hotkey) { + return &item; + } + } + return nullptr; + } + + InventoryItem* GetItemSelected(bool selected) + { + for (auto& [_, item] : gInventoryMap) { + if (item.isSelected == selected) { + return &item; + } + } + return nullptr; } void PrintInventory() @@ -56,7 +77,7 @@ namespace ZL } } - const std::unordered_map& ReturnInventory() + const std::unordered_map& ReturnInventory() { return gInventoryMap; } diff --git a/Inventory.h b/Inventory.h index 5a59a16..adea97e 100644 --- a/Inventory.h +++ b/Inventory.h @@ -21,7 +21,7 @@ namespace ZL }; // Глобальное хранилище предметов - extern std::unordered_map gInventoryMap; // Changed key type from string to int + extern std::unordered_map gInventoryMap; // Changed key type from string to int // Добавить предмет в инвентарь void AddItemToInventory(const std::string& name, std::shared_ptr tex, int slot_index); @@ -30,14 +30,15 @@ namespace ZL void RemoveItemFromInventory(int slot_index); // Поиск предмета по индексу (возвращает указатель или nullptr) - InventoryItem* GetItemByIndex(int slot_index); + InventoryItem* GetItemByHotkey(int hot_key); + InventoryItem* GetItemSelected(bool isSelected); + InventoryItem* GetItemByName(std::string name); // Вывести весь инвентарь в консоль void PrintInventory(); - const std::unordered_map& ReturnInventory(); + const std::unordered_map& ReturnInventory(); // Add these new functions void UnselectAllItems(); - InventoryItem* GetItemByHotkey(int hotkey); } diff --git a/RenderSystem.cpp b/RenderSystem.cpp index cc3c633..d53e6eb 100644 --- a/RenderSystem.cpp +++ b/RenderSystem.cpp @@ -234,15 +234,29 @@ void RenderSystem::drawUI(const GameObjectManager& gameObjects) { for (const auto& [name, item] : inventoryMap) { renderer.PushMatrix(); + if (item.isSelected) { + float xPos = Environment::width + - gameObjects.INVENTORY_MARGIN + - gameObjects.INVENTORY_ICON_SIZE+25; + float yPos = gameObjects.INVENTORY_MARGIN + + i * (gameObjects.INVENTORY_ICON_SIZE+25 + + gameObjects.INVENTORY_MARGIN); + renderer.TranslateMatrix(Vector3f{xPos, yPos, 0.0f}); + glBindTexture(GL_TEXTURE_2D, item.texture->getTexID()); + } + else { + 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, item.texture->getTexID()); + } + + renderer.DrawVertexRenderStruct(gameObjects.inventoryIconMeshMutable); renderer.PopMatrix();