diff --git a/GameObjectManager.cpp b/GameObjectManager.cpp index be987f9..dafc931 100644 --- a/GameObjectManager.cpp +++ b/GameObjectManager.cpp @@ -7,8 +7,11 @@ namespace ZL { -const float GameObjectManager::INVENTORY_ICON_SIZE = 64.0f; -const float GameObjectManager::INVENTORY_MARGIN = 10.0f; +const float GameObjectManager::INVENTORY_ICON_SIZE = 44.0f; +const float GameObjectManager::INVENTORY_MARGIN = 44.0f; + +const float GameObjectManager::SELECTED_CUBE_ICON_SIZE = 244.0f; +const float GameObjectManager::SELECTED_CUBE_MARGIN = 50.0f; void GameObjectManager::initializeLoadingScreen() { @@ -26,12 +29,15 @@ void GameObjectManager::initializeLoadingScreen() void GameObjectManager::initialize() { initializeLoadingScreen(); - + std::function loadingFunction1 = [this]() { current_room_index = 0; objects_in_inventory = 0; + bearName = ""; + current_room_index = 0; + objects_in_inventory = 0; //coneTexturePtr = std::make_shared(CreateTextureDataFromBmp24("./conus.bmp")); @@ -152,16 +158,18 @@ void GameObjectManager::initialize() { //roomTexturePtr = rooms[current_room_index].roomTexture; - AddItemToInventory("book1", std::make_shared(CreateTextureDataFromBmp24("./Kitchen_ceramics.bmp")), objects_in_inventory + 1); + AddItemToInventory("cube_T", 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); + AddItemToInventory("cube_O", std::make_shared(CreateTextureDataFromBmp24("./Kitchen_ceramics.bmp")), objects_in_inventory + 1); + objects_in_inventory++; + AddItemToInventory("cube_M", std::make_shared(CreateTextureDataFromBmp24("./Kitchen_ceramics.bmp")), objects_in_inventory + 1); objects_in_inventory++; //SDL_ShowCursor(SDL_DISABLE); SDL_SetRelativeMouseMode(SDL_TRUE); - + return true; }; @@ -200,6 +208,40 @@ void GameObjectManager::handleEvent(const SDL_Event& event) { } else if (event.type == SDL_MOUSEBUTTONDOWN) { const auto highlightedObjects = aoMgr.findByHighlighted(true); + if (InventoryItem* item = GetItemSelected(true)) { + std::cout << item->name << std::endl; + + if (current_room_index==0) { + + if (bearName.length() <= 3) { + if (item->name == "cube_T"){ + bearName += "T"; + selectedCubes.push_back(*item); + gInventoryMap.erase(item->name); + } + else if (item->name == "cube_O"){ + bearName += "O"; + selectedCubes.push_back(*item); + gInventoryMap.erase(item->name); + } + else if (item->name == "cube_M"){ + bearName += "M"; + selectedCubes.push_back(*item); + gInventoryMap.erase(item->name); + + } + } + else if (bearName.length() >= 3 && !(bearName.compare("TOM") == 0)) { + bearName = ""; + for (const auto& cube : selectedCubes) { + gInventoryMap[cube.name] = cube; + } + selectedCubes.clear(); + } + } + } + else { + const auto highlightedObjects = aoMgr.findByHighlighted(true); for (auto* ao : highlightedObjects) { if (!ao) { @@ -213,7 +255,9 @@ void GameObjectManager::handleEvent(const SDL_Event& event) { } // bx.Interpolate(animationCounter); // animationCounter += 2; + } } + else if (event.type == SDL_MOUSEWHEEL) { static const float zoomstep = 1.0f; if (event.wheel.y > 0) { @@ -291,10 +335,17 @@ void GameObjectManager::handleEvent(const SDL_Event& event) { break; case SDLK_1: case SDLK_2: - { - int hot_key = (event.key.keysym.sym == SDLK_1) ? 1 : 2; + case SDLK_3: + case SDLK_4: + case SDLK_5: + case SDLK_6: + case SDLK_7: + case SDLK_8: + case SDLK_9: + { + UnselectAllItems(); - if (InventoryItem* item = GetItemByHotkey(hot_key)) { + if (InventoryItem* item = GetItemByHotkey(event.key.keysym.sym - SDLK_1 + 1)) { item->isSelected = true; } } @@ -423,7 +474,7 @@ void GameObjectManager::updateScene(size_t ms) { newPosition.v[0] += directionVector.v[1] * ms; } - + Vector3f characterNewPos{-newPosition.v[0], -newPosition.v[1], -newPosition.v[2]}; std::cout << "Player position: x=" << characterNewPos.v[0] diff --git a/GameObjectManager.h b/GameObjectManager.h index d32b067..3f9bbc7 100644 --- a/GameObjectManager.h +++ b/GameObjectManager.h @@ -4,14 +4,18 @@ #include "AudioPlayerAsync.h" #include #include -#include #include "ActiveObject.h" #include "Room.h" +#include "Inventory.h" #ifdef __linux__ #include #endif #include "OpenGlExtensions.h" #include +#include + +#include "BoundaryBox.h" // Добавляем новый include + namespace ZL { @@ -50,7 +54,10 @@ public: std::vector activeObjects; std::vector rooms; - + std::vector selectedCubes; + + std::string bearName; + AudioPlayerAsync audioPlayerAsync; ZL::VertexDataStruct inventoryIconMesh; @@ -58,6 +65,8 @@ public: static const float INVENTORY_ICON_SIZE; static const float INVENTORY_MARGIN; + static const float SELECTED_CUBE_ICON_SIZE; + static const float SELECTED_CUBE_MARGIN; ActiveObjectManager aoMgr; int objects_in_inventory; @@ -73,11 +82,10 @@ public: int current_room_index; private: - //int animationCounter = 0; int lastMouseX = 0; // Добавляем переменные для хранения позиции мыши int lastMouseY = 0; - + bool isPointInObject(int screenX, int screenY, int objectScreenX, int objectScreenY) const; void worldToScreenCoordinates(Vector3f objectPos, // Добавляем метод Matrix4f projectionModelView, diff --git a/QuestScripts.cpp b/QuestScripts.cpp index 7f9a009..f67a23a 100644 --- a/QuestScripts.cpp +++ b/QuestScripts.cpp @@ -2,6 +2,9 @@ #include "GameObjectManager.h" #include "Inventory.h" #include +#include +#include + namespace ZL { @@ -9,16 +12,16 @@ 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); + if (gom.bearName.compare("TOM") == 0) { + gInventoryMap.clear(); +// std::this_thread::sleep_for(std::chrono::seconds(1)); + gom.switch_room(1); } }; } + std::function createRoom2Logic() { return [](GameObjectManager& gom, size_t ms) diff --git a/RenderSystem.cpp b/RenderSystem.cpp index 4317e52..2136935 100644 --- a/RenderSystem.cpp +++ b/RenderSystem.cpp @@ -235,11 +235,12 @@ void RenderSystem::drawUI(const GameObjectManager& gameObjects) { if (item.isSelected) { float xPos = Environment::width - gameObjects.INVENTORY_MARGIN - - gameObjects.INVENTORY_ICON_SIZE+25; + - gameObjects.INVENTORY_ICON_SIZE; float yPos = gameObjects.INVENTORY_MARGIN - + i * (gameObjects.INVENTORY_ICON_SIZE+25 + + i * (gameObjects.INVENTORY_ICON_SIZE + gameObjects.INVENTORY_MARGIN); renderer.TranslateMatrix(Vector3f{xPos, yPos, 0.0f}); + renderer.ScaleMatrix(Vector3f{1.5f, 1.5f, 1.0f}); glBindTexture(GL_TEXTURE_2D, item.texture->getTexID()); } else { @@ -261,6 +262,29 @@ void RenderSystem::drawUI(const GameObjectManager& gameObjects) { i++; } + // Отрисовка кубиков + if (gameObjects.current_room_index == 0){ + for (const auto& cube : gameObjects.selectedCubes) { + renderer.PushMatrix(); + + // Смещаем по оси x: начиная с левой стороны и двигаясь вправо + float xPos = gameObjects.SELECTED_CUBE_MARGIN + + i * (gameObjects.SELECTED_CUBE_ICON_SIZE + gameObjects.SELECTED_CUBE_MARGIN) + 300.0f; + // Оставляем y константным + float yPos = 500.0f; + + renderer.TranslateMatrix(Vector3f{xPos, yPos, 0.0f}); + renderer.ScaleMatrix(Vector3f{2.8f, 2.8f, 1.0f}); + glBindTexture(GL_TEXTURE_2D, cube.texture->getTexID()); + + renderer.DrawVertexRenderStruct(gameObjects.inventoryIconMeshMutable); + + renderer.PopMatrix(); + i++; + } +} + + renderer.PopMatrix(); renderer.PopProjectionMatrix(); diff --git a/RenderSystem.h b/RenderSystem.h index 979cf07..86fd9bf 100644 --- a/RenderSystem.h +++ b/RenderSystem.h @@ -9,6 +9,7 @@ namespace ZL { class RenderSystem { public: RenderSystem() = default; + Renderer renderer; void initialize(); void drawScene(GameObjectManager& gameObjects); Renderer& getRenderer() { return renderer; } @@ -26,7 +27,6 @@ private: void drawLoadingScreen(const GameObjectManager& gameObjects); - Renderer renderer; ShaderManager shaderManager; Matrix4f currentProjectionModelView; // Добавлено для хранения матрицы между drawWorld и drawUI int lastMouseX = 0;