From 4ff416757f8394e1084d48bf5b3d6ff5967ee882 Mon Sep 17 00:00:00 2001 From: maka70vv <25.makarovv@gmail.com> Date: Sun, 2 Mar 2025 17:16:22 +0600 Subject: [PATCH 1/7] getting selected inventory items --- GameObjectManager.cpp | 6 ++++++ Inventory.cpp | 10 ++++++++++ Inventory.h | 1 + 3 files changed, 17 insertions(+) diff --git a/GameObjectManager.cpp b/GameObjectManager.cpp index b6d8120..1887ea1 100644 --- a/GameObjectManager.cpp +++ b/GameObjectManager.cpp @@ -150,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) { @@ -162,6 +166,7 @@ void GameObjectManager::handleEvent(const SDL_Event& event) { aoMgr.removeByName(ao->name); } + } // bx.Interpolate(animationCounter); // animationCounter += 2; } @@ -255,6 +260,7 @@ void GameObjectManager::handleEvent(const SDL_Event& event) { UnselectAllItems(); if (InventoryItem* item = GetItemByHotkey(hot_key)) { item->isSelected = true; + std:: cout << item->name << std::endl; } } break; diff --git a/Inventory.cpp b/Inventory.cpp index 292cfb0..4bb7a39 100644 --- a/Inventory.cpp +++ b/Inventory.cpp @@ -45,6 +45,16 @@ namespace ZL return nullptr; } + InventoryItem* GetItemSelected(bool selected) + { + for (auto& [_, item] : gInventoryMap) { + if (item.isSelected == selected) { + return &item; + } + } + return nullptr; + } + void PrintInventory() { std::cout << "Inventory contents:\n"; diff --git a/Inventory.h b/Inventory.h index 655bcc7..ad5daf3 100644 --- a/Inventory.h +++ b/Inventory.h @@ -36,4 +36,5 @@ namespace ZL // Add these new functions void UnselectAllItems(); InventoryItem* GetItemByHotkey(int hotkey); + InventoryItem* GetItemSelected(bool isSelected); } From a6a275a93450afb8e5dd0618dcf1d708d6a5077c Mon Sep 17 00:00:00 2001 From: maka70vv <25.makarovv@gmail.com> Date: Sun, 2 Mar 2025 17:30:55 +0600 Subject: [PATCH 2/7] moving active inventory object --- RenderSystem.cpp | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/RenderSystem.cpp b/RenderSystem.cpp index 0c67204..4ca7cfb 100644 --- a/RenderSystem.cpp +++ b/RenderSystem.cpp @@ -214,15 +214,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(); From 1ac4c51a5de5984a25de6e00988d002e6dfa6244 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D1=8C=D0=B1=D0=B5=D1=80=D1=82=20=D0=93=D0=B0?= =?UTF-8?q?=D0=B4=D0=B8=D0=B5=D0=B2?= Date: Sun, 2 Mar 2025 17:33:30 +0600 Subject: [PATCH 3/7] hotkesy for items --- .gitignore | 2 ++ GameObjectManager.cpp | 62 ++++++++++++++++++++++++++++++++++--------- Inventory.cpp | 41 +++++++++++++--------------- Inventory.h | 16 ++++++----- 4 files changed, 79 insertions(+), 42 deletions(-) diff --git a/.gitignore b/.gitignore index 11cb6fc..d0e92d4 100755 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,8 @@ ## ## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore +.vscode/ + # User-specific files *.rsuser *.suo diff --git a/GameObjectManager.cpp b/GameObjectManager.cpp index b6d8120..bb9a239 100644 --- a/GameObjectManager.cpp +++ b/GameObjectManager.cpp @@ -28,7 +28,8 @@ void GameObjectManager::initialize() { testObjMeshMutable.data = testObjMesh; testObjMeshMutable.RefreshVBO(); - textMesh = ZL::LoadFromTextFile("./textures/mesh_first_room.txt"); // Add ZL:: namespace + 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))); @@ -114,11 +115,23 @@ void GameObjectManager::initialize() { roomTexturePtr = rooms[current_room_index].roomTexture; - 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++; + // Добавляем тестовые предметы с правильными 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; + } + // 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); @@ -250,14 +263,35 @@ void GameObjectManager::handleEvent(const SDL_Event& event) { case SDLK_1: case SDLK_2: + case SDLK_3: + case SDLK_4: + case SDLK_5: + case SDLK_6: + case SDLK_7: + case SDLK_8: + case SDLK_9: { - int hot_key = (event.key.keysym.sym == SDLK_1) ? 1 : 2; + int slot_index = event.key.keysym.sym - SDLK_1 + 1; + std::cout << "Selected slot: " << slot_index << std::endl; + UnselectAllItems(); - if (InventoryItem* item = GetItemByHotkey(hot_key)) { + + if (auto* item = GetItemByIndex(slot_index)) { + std::cout << "Found item in slot " << slot_index << std::endl; 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... } } @@ -438,12 +472,14 @@ void GameObjectManager::updateScene(size_t ms) { } bool GameObjectManager::isPointInObject(int screenX, int screenY, int objectScreenX, int objectScreenY) const { - // Простая проверка попадания точки в квадрат 64x64 вокруг центра объекта - const int objectSize = 32; // Половина размера области выделения - return (screenX >= objectScreenX - objectSize && - screenX <= objectScreenX + objectSize && - screenY >= objectScreenY - objectSize && - screenY <= objectScreenY + objectSize); + 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 && + screenX <= objectScreenX + scaledObjectSize && + screenY >= objectScreenY - scaledObjectSize && + screenY <= objectScreenY + scaledObjectSize); } void GameObjectManager::checkMouseIntersection(int mouseX, int mouseY, const Matrix4f& projectionModelView) { diff --git a/Inventory.cpp b/Inventory.cpp index 292cfb0..f984b88 100644 --- a/Inventory.cpp +++ b/Inventory.cpp @@ -2,47 +2,41 @@ namespace ZL { - // Определяем глобальную переменную - std::unordered_map gInventoryMap; + std::unordered_map gInventoryMap; - void AddItemToInventory(const std::string& name, std::shared_ptr tex, int hot_key) + void AddItemToInventory(const std::string& name, std::shared_ptr tex, int slot_index) { + if (slot_index > MAX_INVENTORY_SLOTS || slot_index < 1) { + return; + } + InventoryItem item; item.name = name; item.texture = tex; - item.hot_key = hot_key; + item.hot_key = slot_index; + item.scale = 1.0f; - // Вставляем или перезаписываем (operator[] так сделает). - gInventoryMap[name] = item; + gInventoryMap[slot_index] = item; + std::cout << "Added item to slot " << slot_index << std::endl; } - void RemoveItemFromInventory(const std::string& name) + void RemoveItemFromInventory(int slot_index) { - // erase вернёт количество удалённых элементов, если нужно проверить - gInventoryMap.erase(name); + gInventoryMap.erase(slot_index); } - InventoryItem* GetItemByName(const std::string& name) + InventoryItem* GetItemByIndex(int slot_index) { - // Пытаемся найти элемент по ключу - auto it = gInventoryMap.find(name); - if (it != gInventoryMap.end()) - { - // Возвращаем адрес найденного InventoryItem + auto it = gInventoryMap.find(slot_index); + if (it != gInventoryMap.end()) { return &it->second; } - // Если не нашли – nullptr return nullptr; } InventoryItem* GetItemByHotkey(int hotkey) { - for (auto& [_, item] : gInventoryMap) { - if (item.hot_key == hotkey) { - return &item; - } - } - return nullptr; + return GetItemByIndex(hotkey); // Now we can just use the index directly } void PrintInventory() @@ -58,10 +52,11 @@ namespace ZL { for (auto& [_, item] : gInventoryMap) { item.isSelected = false; + item.scale = 1.0f; // Reset scale when unselected } } - const std::unordered_map& ReturnInventory() + const std::unordered_map& ReturnInventory() { return gInventoryMap; } diff --git a/Inventory.h b/Inventory.h index 655bcc7..5a59a16 100644 --- a/Inventory.h +++ b/Inventory.h @@ -8,30 +8,34 @@ namespace ZL { + static const int MAX_INVENTORY_SLOTS = 9; + static const float SELECTED_ITEM_SCALE = 1.2f; // Scale factor for selected items + struct InventoryItem { std::string name; std::shared_ptr texture; bool isSelected = false; int hot_key; + float scale = 1.0f; // Add scale property }; // Глобальное хранилище предметов - extern std::unordered_map gInventoryMap; // Changed from gInventory + extern std::unordered_map gInventoryMap; // Changed key type from string to int // Добавить предмет в инвентарь - void AddItemToInventory(const std::string& name, std::shared_ptr tex, int hot_key); + void AddItemToInventory(const std::string& name, std::shared_ptr tex, int slot_index); // Удалить предмет из инвентаря - void RemoveItemFromInventory(const std::string& name); + void RemoveItemFromInventory(int slot_index); - // Поиск предмета по имени (возвращает указатель или nullptr) - InventoryItem* GetItemByName(const std::string& name); + // Поиск предмета по индексу (возвращает указатель или nullptr) + InventoryItem* GetItemByIndex(int slot_index); // Вывести весь инвентарь в консоль void PrintInventory(); - const std::unordered_map& ReturnInventory(); + const std::unordered_map& ReturnInventory(); // Add these new functions void UnselectAllItems(); From 103c43eba1b274871b7962398d2e356c8198fc8e Mon Sep 17 00:00:00 2001 From: maka70vv <25.makarovv@gmail.com> Date: Sun, 2 Mar 2025 18:19:25 +0600 Subject: [PATCH 4/7] select inventory 1-9 --- GameObjectManager.cpp | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/GameObjectManager.cpp b/GameObjectManager.cpp index c9efcd5..54e2f3e 100644 --- a/GameObjectManager.cpp +++ b/GameObjectManager.cpp @@ -259,14 +259,22 @@ void GameObjectManager::handleEvent(const SDL_Event& event) { 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; std:: cout << item->name << std::endl; } } + break; // ...handle other keys... } From f8b25e581b714c5382e2efeb3f15bf2c9ef517ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D1=8C=D0=B1=D0=B5=D1=80=D1=82=20=D0=93=D0=B0?= =?UTF-8?q?=D0=B4=D0=B8=D0=B5=D0=B2?= Date: Sun, 2 Mar 2025 18:21:50 +0600 Subject: [PATCH 5/7] linux shadres --- defaultHideCam.fragment | 33 +++------------------------------ 1 file changed, 3 insertions(+), 30 deletions(-) diff --git a/defaultHideCam.fragment b/defaultHideCam.fragment index cd91b15..89c7026 100644 --- a/defaultHideCam.fragment +++ b/defaultHideCam.fragment @@ -7,33 +7,7 @@ uniform vec3 targetPos; // Цель камеры void main() { -/* - float maxDistance = 2000; - float alpha = 0.0; - vec4 color = texture2D(Texture, texCoord); - - vec3 dir = targetPos - eyePos; - float dirLengthSq = dot(dir, dir); - - if (dirLengthSq > 0.0) - { - vec3 objToEye = vWorldPos - eyePos; - float t = dot(objToEye, dir) / dirLengthSq; - - if (t >= 0.0 && t <= 1.0) - { - vec3 projection = eyePos + t * dir; - vec3 delta = vWorldPos - projection; - float distSq = dot(delta, delta); - - if (distSq < maxDistance * maxDistance) - { - //color.a *= alpha; // Применяем прозрачность - color.rgb = vec3(1,0,0); - } - } - } - */ + vec4 color; vec3 dirToCamera = normalize(eyePos - targetPos); @@ -46,7 +20,7 @@ void main() //float distanceToCamera = length(vWorldPos - targetPos); - if (/*(distanceX > 250 || distanceZ > 250) && */(dotProduct > 0.1) && vWorldPos.y > 30) + if ((dotProduct > 0.1) && vWorldPos.y > 30.0) { //color.rgba = vec4(1,0,0,1); discard; @@ -54,8 +28,7 @@ void main() else { color.rgb = texture2D(Texture, texCoord).rgb; - //color.rgb = vec3(clamp(vWorldPos.z/500, 0, 1), 0, 0); - color.a = 1; + color.a = 1.0; } gl_FragColor = color; } \ No newline at end of file From cfc96f645ee13689d232d86dd7d96cacef4ba356 Mon Sep 17 00:00:00 2001 From: maka70vv <25.makarovv@gmail.com> Date: Sun, 2 Mar 2025 18:37:37 +0600 Subject: [PATCH 6/7] fixed inventory choosing --- GameObjectManager.cpp | 2 +- Inventory.cpp | 29 ++++++++++++++++++++--------- Inventory.h | 10 +++++----- 3 files changed, 26 insertions(+), 15 deletions(-) diff --git a/GameObjectManager.cpp b/GameObjectManager.cpp index 2310599..3a089c6 100644 --- a/GameObjectManager.cpp +++ b/GameObjectManager.cpp @@ -269,7 +269,7 @@ void GameObjectManager::handleEvent(const SDL_Event& event) { { UnselectAllItems(); - if (InventoryItem* item = GetItemByHotkey(hot_key)) { + if (InventoryItem* item = GetItemByHotkey(event.key.keysym.sym - SDLK_1 + 1)) { item->isSelected = true; } } diff --git a/Inventory.cpp b/Inventory.cpp index ba86887..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,38 @@ 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) @@ -66,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 77d73cf..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,15 +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); - InventoryItem* GetItemSelected(bool isSelected); } From 383b34f5d627f4ce967d16d2c7a9ab4b9574a0b9 Mon Sep 17 00:00:00 2001 From: maka70vv <25.makarovv@gmail.com> Date: Sun, 2 Mar 2025 18:42:31 +0600 Subject: [PATCH 7/7] fixed freezing in second scene --- GameObjectManager.cpp | 2 +- QuestScripts.cpp | 9 +++++++++ QuestScripts.h | 1 + 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/GameObjectManager.cpp b/GameObjectManager.cpp index 3a089c6..81e5914 100644 --- a/GameObjectManager.cpp +++ b/GameObjectManager.cpp @@ -92,7 +92,7 @@ void GameObjectManager::initialize() { 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(); + room_2.roomLogic = createRoom2Logic(); rooms.push_back(room_2); activeObjects = rooms[current_room_index].objects; diff --git a/QuestScripts.cpp b/QuestScripts.cpp index 321a6ff..7f9a009 100644 --- a/QuestScripts.cpp +++ b/QuestScripts.cpp @@ -19,4 +19,13 @@ namespace ZL }; } + std::function createRoom2Logic() + { + return [](GameObjectManager& gom, size_t ms) +// Simple test logic + { + + }; + } + } diff --git a/QuestScripts.h b/QuestScripts.h index bf7205b..dcdd1d0 100644 --- a/QuestScripts.h +++ b/QuestScripts.h @@ -5,5 +5,6 @@ namespace ZL { class GameObjectManager; std::function createRoom1Logic(); + std::function createRoom2Logic(); }