diff --git a/ActiveObject.h b/ActiveObject.h index 6385748..47725eb 100644 --- a/ActiveObject.h +++ b/ActiveObject.h @@ -18,4 +18,38 @@ struct ActiveObject { bool highlighted = false; }; -} \ No newline at end of file +class ActiveObjectManager { + public: + // Добавить или обновить объект в контейнере + void addActiveObject(const ActiveObject& object) { + activeObjects[object.name] = object; + } + + // Найти объект по имени (возвращает указатель, nullptr — если не найден) + ActiveObject* findByName(const std::string& name) { + auto it = activeObjects.find(name); + if (it != activeObjects.end()) { + return &it->second; + } + return nullptr; + } + + // Найти все объекты с нужным значением highlighted + // (возвращает список указателей на найденные объекты) + std::vector findByHighlighted(bool highlighted) { + std::vector result; + result.reserve(activeObjects.size()); + for (auto& [key, object] : activeObjects) { + if (object.highlighted == highlighted) { + result.push_back(&object); + } + } + return result; + } + + private: + // Хранение объектов по ключу name + std::unordered_map activeObjects; + }; + +} diff --git a/GameObjectManager.cpp b/GameObjectManager.cpp index 424cd99..76a32a9 100644 --- a/GameObjectManager.cpp +++ b/GameObjectManager.cpp @@ -2,6 +2,7 @@ #include "Environment.h" #include "ObjLoader.h" #include "Inventory.h" +#include "QuestScripts.h" #include "TextModel.h" // Add this include for LoadFromTextFile namespace ZL { @@ -13,12 +14,8 @@ void GameObjectManager::initialize() { current_room_index = 0; - std::cout << "Hello x1" << std::endl; - coneTexturePtr = std::make_shared(CreateTextureDataFromBmp24("./conus.bmp")); - std::cout << "Hello x2" << std::endl; - // Load models colorCubeMesh = CreateCube3D(5.0); colorCubeMeshMutable.data = CreateCube3D(5.0); @@ -30,23 +27,15 @@ void GameObjectManager::initialize() { testObjMeshMutable.data = testObjMesh; testObjMeshMutable.RefreshVBO(); - std::cout << "Hello x2" << std::endl; - textMesh = ZL::LoadFromTextFile("./mesh001.txt"); // Add ZL:: namespace coneMesh = ZL::LoadFromTextFile("./cone001.txt"); // Add ZL:: namespace coneMesh.Scale(200); - std::cout << "Hello x3" << std::endl; - - textMeshMutable.AssignFrom(textMesh); textMeshMutable.RefreshVBO(); coneMeshMutable.AssignFrom(coneMesh); coneMeshMutable.RefreshVBO(); - std::cout << "Hello x4" << std::endl; - - // Load bone animations //bx.LoadFromFile("./violetta001.txt"); violaIdleModel.LoadFromFile("./idleviola001.txt"); @@ -88,13 +77,14 @@ void GameObjectManager::initialize() { Room room_1; room_1.roomTexture = std::make_shared(CreateTextureDataFromBmp24("./Kitchen_ceramics.bmp")); room_1.objects.push_back(ao1); - //room_1.objects.push_back(ao2); - room_1.sound_name = "file_example_OOG_5MG.ogg"; + room_1.sound_name = "Symphony No.6 (1st movement).ogg"; + room_1.roomLogic = createRoom1Logic(); rooms.push_back(room_1); Room room_2; room_2.roomTexture = std::make_shared(CreateTextureDataFromBmp24("./background.bmp")); room_2.sound_name = "Symphony No.6 (1st movement).ogg"; + room_2.roomLogic = createRoom1Logic(); rooms.push_back(room_2); activeObjects = rooms[current_room_index].objects; @@ -138,6 +128,7 @@ void GameObjectManager::switch_room(int index){ void GameObjectManager::handleEvent(const SDL_Event& event) { +// debug room switching if (event.type == SDL_MOUSEBUTTONDOWN && event.button.button == SDL_BUTTON_RIGHT) { switch_room(1); } @@ -309,6 +300,10 @@ void GameObjectManager::updateScene(size_t ms) { } + if (rooms[current_room_index].roomLogic) { + rooms[current_room_index].roomLogic(*this, ms); + } + if (Environment::violaCurrentAnimation == 0) { 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/QuestScripts.cpp b/QuestScripts.cpp new file mode 100644 index 0000000..321a6ff --- /dev/null +++ b/QuestScripts.cpp @@ -0,0 +1,22 @@ +#include "QuestScripts.h" +#include "GameObjectManager.h" +#include "Inventory.h" +#include + +namespace ZL +{ + + std::function createRoom1Logic() + { + return [](GameObjectManager& gom, size_t ms) +// Simple test logic + { + if (GetItemByName("book")) { + std::cout << "[Room 1] Игрок поднял книгу!\n"; + + gom.switch_room(1); + } + }; + } + +} diff --git a/QuestScripts.h b/QuestScripts.h new file mode 100644 index 0000000..bf7205b --- /dev/null +++ b/QuestScripts.h @@ -0,0 +1,9 @@ +#pragma once +#include + +namespace ZL { + class GameObjectManager; + + std::function createRoom1Logic(); + +} diff --git a/RenderSystem.cpp b/RenderSystem.cpp index e56fd23..b4a7eb4 100644 --- a/RenderSystem.cpp +++ b/RenderSystem.cpp @@ -188,17 +188,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(); diff --git a/Room.h b/Room.h index e3db5b2..9ce5939 100644 --- a/Room.h +++ b/Room.h @@ -4,11 +4,16 @@ #include "Math.h" #include #include "ActiveObject.h" +#include + namespace ZL { struct Room{ std::shared_ptr roomTexture; std::vector objects; std::string sound_name; + + std::function roomLogic; + }; } diff --git a/start.sh b/start.sh index 9147ca9..a292265 100755 --- a/start.sh +++ b/start.sh @@ -1,7 +1,7 @@ g++ Game.cpp main.cpp Math.cpp OpenGlExtensions.cpp Physics.cpp Renderer.cpp \ ShaderManager.cpp TextureManager.cpp Utils.cpp BoneAnimatedModel.cpp \ ObjLoader.cpp cmakeaudioplayer/src/AudioPlayer.cpp TextModel.cpp \ - Inventory.cpp Environment.cpp GameObjectManager.cpp RenderSystem.cpp \ + Inventory.cpp Environment.cpp GameObjectManager.cpp RenderSystem.cpp QuestScripts.cpp \ -o sdl_app -O2 -std=c++17 \ -I cmakeaudioplayer/include \ $(pkg-config --cflags --libs sdl2 gl) \