Merge pull request #22 from mephi1984/pavel

Pavel
This commit is contained in:
Pavel Makarov 2025-03-02 18:38:08 +06:00 committed by GitHub
commit a568d3d0da
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 66 additions and 50 deletions

View File

@ -29,7 +29,6 @@ void GameObjectManager::initialize() {
testObjMeshMutable.RefreshVBO(); testObjMeshMutable.RefreshVBO();
textMesh = ZL::LoadFromTextFile("./textures/mesh_first_room.txt"); textMesh = ZL::LoadFromTextFile("./textures/mesh_first_room.txt");
textMesh.NormalData // Add ZL:: namespace
textMesh.Scale(10); textMesh.Scale(10);
textMesh.SwapZandY(); textMesh.SwapZandY();
textMesh.RotateByMatrix(QuatToMatrix(QuatFromRotateAroundX(M_PI * 0.5))); textMesh.RotateByMatrix(QuatToMatrix(QuatFromRotateAroundX(M_PI * 0.5)));
@ -115,23 +114,11 @@ void GameObjectManager::initialize() {
roomTexturePtr = rooms[current_room_index].roomTexture; roomTexturePtr = rooms[current_room_index].roomTexture;
// Добавляем тестовые предметы с правильными hot_key AddItemToInventory("book1", std::make_shared<Texture>(CreateTextureDataFromBmp24("./Kitchen_ceramics.bmp")), objects_in_inventory+1);
if (objects_in_inventory < MAX_INVENTORY_SLOTS) { objects_in_inventory++;
AddItemToInventory("book1", std::make_shared<Texture>(CreateTextureDataFromBmp24("./Kitchen_ceramics.bmp")), 1); AddItemToInventory("book2", std::make_shared<Texture>(CreateTextureDataFromBmp24("./Kitchen_ceramics.bmp")), objects_in_inventory+1);
objects_in_inventory++; objects_in_inventory++;
std::cout << "Added item with hotkey 1" << std::endl;
}
if (objects_in_inventory < MAX_INVENTORY_SLOTS) {
AddItemToInventory("book2", std::make_shared<Texture>(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<Texture>(CreateTextureDataFromBmp24("./Kitchen_ceramics.bmp")), 1);
AddItemToInventory("book2", std::make_shared<Texture>(CreateTextureDataFromBmp24("./Kitchen_ceramics.bmp")), 2);
objects_in_inventory = 2;
//SDL_ShowCursor(SDL_DISABLE); //SDL_ShowCursor(SDL_DISABLE);
SDL_SetRelativeMouseMode(SDL_TRUE); SDL_SetRelativeMouseMode(SDL_TRUE);
@ -163,6 +150,10 @@ void GameObjectManager::handleEvent(const SDL_Event& event) {
switch_room(1); switch_room(1);
} }
else if (event.type == SDL_MOUSEBUTTONDOWN) { else if (event.type == SDL_MOUSEBUTTONDOWN) {
if (InventoryItem* item = GetItemSelected(true)) {
}
else {
const auto highlightedObjects = aoMgr.findByHighlighted(true); const auto highlightedObjects = aoMgr.findByHighlighted(true);
for (auto* ao : highlightedObjects) { for (auto* ao : highlightedObjects) {
@ -175,6 +166,7 @@ void GameObjectManager::handleEvent(const SDL_Event& event) {
aoMgr.removeByName(ao->name); aoMgr.removeByName(ao->name);
} }
}
// bx.Interpolate(animationCounter); // bx.Interpolate(animationCounter);
// animationCounter += 2; // animationCounter += 2;
} }
@ -274,26 +266,14 @@ void GameObjectManager::handleEvent(const SDL_Event& event) {
case SDLK_7: case SDLK_7:
case SDLK_8: case SDLK_8:
case SDLK_9: case SDLK_9:
{ {
int slot_index = event.key.keysym.sym - SDLK_1 + 1;
std::cout << "Selected slot: " << slot_index << std::endl;
UnselectAllItems(); UnselectAllItems();
if (InventoryItem* item = GetItemByHotkey(event.key.keysym.sym - SDLK_1 + 1)) {
if (auto* item = GetItemByIndex(slot_index)) {
std::cout << "Found item in slot " << slot_index << std::endl;
item->isSelected = true; 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; break;
// ...handle other keys... // ...handle other keys...
@ -491,10 +471,10 @@ bool GameObjectManager::isPointInObject(int screenX, int screenY, int objectScre
const int baseObjectSize = 32; // Base half-size const int baseObjectSize = 32; // Base half-size
const float scale = 1.0f; // Get scale from item if needed const float scale = 1.0f; // Get scale from item if needed
const int scaledObjectSize = static_cast<int>(baseObjectSize * scale); const int scaledObjectSize = static_cast<int>(baseObjectSize * scale);
return (screenX >= objectScreenX - scaledObjectSize && return (screenX >= objectScreenX - scaledObjectSize &&
screenX <= objectScreenX + scaledObjectSize && screenX <= objectScreenX + scaledObjectSize &&
screenY >= objectScreenY - scaledObjectSize && screenY >= objectScreenY - scaledObjectSize &&
screenY <= objectScreenY + scaledObjectSize); screenY <= objectScreenY + scaledObjectSize);
} }

View File

@ -2,7 +2,7 @@
namespace ZL namespace ZL
{ {
std::unordered_map<int, InventoryItem> gInventoryMap; std::unordered_map<std::string, InventoryItem> gInventoryMap;
void AddItemToInventory(const std::string& name, std::shared_ptr<Texture> tex, int slot_index) void AddItemToInventory(const std::string& name, std::shared_ptr<Texture> tex, int slot_index)
{ {
@ -16,27 +16,48 @@ namespace ZL
item.hot_key = slot_index; item.hot_key = slot_index;
item.scale = 1.0f; item.scale = 1.0f;
gInventoryMap[slot_index] = item; gInventoryMap[name] = item;
std::cout << "Added item to slot " << slot_index << std::endl; 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; return &it->second;
} }
// Если не нашли nullptr
return nullptr; return nullptr;
} }
InventoryItem* GetItemByHotkey(int hotkey) 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() void PrintInventory()
@ -56,7 +77,7 @@ namespace ZL
} }
} }
const std::unordered_map<int, InventoryItem>& ReturnInventory() const std::unordered_map<std::string, InventoryItem>& ReturnInventory()
{ {
return gInventoryMap; return gInventoryMap;
} }

View File

@ -21,7 +21,7 @@ namespace ZL
}; };
// Глобальное хранилище предметов // Глобальное хранилище предметов
extern std::unordered_map<int, InventoryItem> gInventoryMap; // Changed key type from string to int extern std::unordered_map<std::string, InventoryItem> gInventoryMap; // Changed key type from string to int
// Добавить предмет в инвентарь // Добавить предмет в инвентарь
void AddItemToInventory(const std::string& name, std::shared_ptr<Texture> tex, int slot_index); void AddItemToInventory(const std::string& name, std::shared_ptr<Texture> tex, int slot_index);
@ -30,14 +30,15 @@ namespace ZL
void RemoveItemFromInventory(int slot_index); void RemoveItemFromInventory(int slot_index);
// Поиск предмета по индексу (возвращает указатель или nullptr) // Поиск предмета по индексу (возвращает указатель или nullptr)
InventoryItem* GetItemByIndex(int slot_index); InventoryItem* GetItemByHotkey(int hot_key);
InventoryItem* GetItemSelected(bool isSelected);
InventoryItem* GetItemByName(std::string name);
// Вывести весь инвентарь в консоль // Вывести весь инвентарь в консоль
void PrintInventory(); void PrintInventory();
const std::unordered_map<int, InventoryItem>& ReturnInventory(); const std::unordered_map<std::string, InventoryItem>& ReturnInventory();
// Add these new functions // Add these new functions
void UnselectAllItems(); void UnselectAllItems();
InventoryItem* GetItemByHotkey(int hotkey);
} }

View File

@ -234,15 +234,29 @@ void RenderSystem::drawUI(const GameObjectManager& gameObjects) {
for (const auto& [name, item] : inventoryMap) { for (const auto& [name, item] : inventoryMap) {
renderer.PushMatrix(); 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 float xPos = Environment::width
- gameObjects.INVENTORY_MARGIN - gameObjects.INVENTORY_MARGIN
- gameObjects.INVENTORY_ICON_SIZE; - gameObjects.INVENTORY_ICON_SIZE;
float yPos = gameObjects.INVENTORY_MARGIN float yPos = gameObjects.INVENTORY_MARGIN
+ i * (gameObjects.INVENTORY_ICON_SIZE + i * (gameObjects.INVENTORY_ICON_SIZE
+ gameObjects.INVENTORY_MARGIN); + gameObjects.INVENTORY_MARGIN);
renderer.TranslateMatrix(Vector3f{xPos, yPos, 0.0f}); renderer.TranslateMatrix(Vector3f{xPos, yPos, 0.0f});
glBindTexture(GL_TEXTURE_2D, item.texture->getTexID()); glBindTexture(GL_TEXTURE_2D, item.texture->getTexID());
}
renderer.DrawVertexRenderStruct(gameObjects.inventoryIconMeshMutable); renderer.DrawVertexRenderStruct(gameObjects.inventoryIconMeshMutable);
renderer.PopMatrix(); renderer.PopMatrix();