commit
a568d3d0da
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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);
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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();
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user