This commit is contained in:
Vladislav Khorev 2025-03-02 15:46:53 +03:00
commit 54d0af8afb
8 changed files with 87 additions and 50 deletions

2
.gitignore vendored
View File

@ -3,6 +3,8 @@
## ##
## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore ## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
.vscode/
# User-specific files # User-specific files
*.rsuser *.rsuser
*.suo *.suo

View File

@ -28,7 +28,7 @@ void GameObjectManager::initialize() {
testObjMeshMutable.data = testObjMesh; testObjMeshMutable.data = testObjMesh;
testObjMeshMutable.RefreshVBO(); testObjMeshMutable.RefreshVBO();
textMesh = ZL::LoadFromTextFile("./textures/mesh_first_room.txt"); // Add ZL:: namespace textMesh = ZL::LoadFromTextFile("./textures/mesh_first_room.txt");
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)));
@ -92,7 +92,7 @@ void GameObjectManager::initialize() {
Room room_2; Room room_2;
room_2.roomTexture = std::make_shared<Texture>(CreateTextureDataFromBmp24("./background.bmp")); room_2.roomTexture = std::make_shared<Texture>(CreateTextureDataFromBmp24("./background.bmp"));
room_2.sound_name = "Symphony No.6 (1st movement).ogg"; room_2.sound_name = "Symphony No.6 (1st movement).ogg";
room_2.roomLogic = createRoom1Logic(); room_2.roomLogic = createRoom2Logic();
rooms.push_back(room_2); rooms.push_back(room_2);
activeObjects = rooms[current_room_index].objects; activeObjects = rooms[current_room_index].objects;
@ -150,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) {
@ -162,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;
} }
@ -254,14 +259,23 @@ void GameObjectManager::handleEvent(const SDL_Event& event) {
case SDLK_1: case SDLK_1:
case SDLK_2: case SDLK_2:
{ case SDLK_3:
int hot_key = (event.key.keysym.sym == SDLK_1) ? 1 : 2; case SDLK_4:
case SDLK_5:
case SDLK_6:
case SDLK_7:
case SDLK_8:
case SDLK_9:
{
UnselectAllItems(); UnselectAllItems();
if (InventoryItem* item = GetItemByHotkey(hot_key)) { if (InventoryItem* item = GetItemByHotkey(event.key.keysym.sym - SDLK_1 + 1)) {
item->isSelected = true; item->isSelected = true;
} }
} }
break; break;
// ...handle other keys... // ...handle other keys...
} }
} }
@ -454,12 +468,14 @@ void GameObjectManager::updateScene(size_t ms) {
} }
bool GameObjectManager::isPointInObject(int screenX, int screenY, int objectScreenX, int objectScreenY) const { bool GameObjectManager::isPointInObject(int screenX, int screenY, int objectScreenX, int objectScreenY) const {
// Простая проверка попадания точки в квадрат 64x64 вокруг центра объекта const int baseObjectSize = 32; // Base half-size
const int objectSize = 32; // Половина размера области выделения const float scale = 1.0f; // Get scale from item if needed
return (screenX >= objectScreenX - objectSize && const int scaledObjectSize = static_cast<int>(baseObjectSize * scale);
screenX <= objectScreenX + objectSize &&
screenY >= objectScreenY - objectSize && return (screenX >= objectScreenX - scaledObjectSize &&
screenY <= objectScreenY + objectSize); screenX <= objectScreenX + scaledObjectSize &&
screenY >= objectScreenY - scaledObjectSize &&
screenY <= objectScreenY + scaledObjectSize);
} }
void GameObjectManager::checkMouseIntersection(int mouseX, int mouseY, const Matrix4f& projectionModelView) { void GameObjectManager::checkMouseIntersection(int mouseX, int mouseY, const Matrix4f& projectionModelView) {

View File

@ -2,18 +2,22 @@
namespace ZL namespace ZL
{ {
// Определяем глобальную переменную
std::unordered_map<std::string, InventoryItem> gInventoryMap; std::unordered_map<std::string, InventoryItem> gInventoryMap;
void AddItemToInventory(const std::string& name, std::shared_ptr<Texture> tex, int hot_key) void AddItemToInventory(const std::string& name, std::shared_ptr<Texture> tex, int slot_index)
{ {
if (slot_index > MAX_INVENTORY_SLOTS || slot_index < 1) {
return;
}
InventoryItem item; InventoryItem item;
item.name = name; item.name = name;
item.texture = tex; item.texture = tex;
item.hot_key = hot_key; item.hot_key = slot_index;
item.scale = 1.0f;
// Вставляем или перезаписываем (operator[] так сделает).
gInventoryMap[name] = item; gInventoryMap[name] = item;
std::cout << "Added item to slot " << slot_index << std::endl;
} }
void RemoveItemFromInventory(const std::string& name) void RemoveItemFromInventory(const std::string& name)
@ -22,7 +26,8 @@ namespace ZL
gInventoryMap.erase(name); gInventoryMap.erase(name);
} }
InventoryItem* GetItemByName(const std::string& name)
InventoryItem* GetItemByName(const std::string name)
{ {
// Пытаемся найти элемент по ключу // Пытаемся найти элемент по ключу
auto it = gInventoryMap.find(name); auto it = gInventoryMap.find(name);
@ -45,6 +50,16 @@ namespace ZL
return nullptr; return nullptr;
} }
InventoryItem* GetItemSelected(bool selected)
{
for (auto& [_, item] : gInventoryMap) {
if (item.isSelected == selected) {
return &item;
}
}
return nullptr;
}
void PrintInventory() void PrintInventory()
{ {
std::cout << "Inventory contents:\n"; std::cout << "Inventory contents:\n";
@ -58,6 +73,7 @@ namespace ZL
{ {
for (auto& [_, item] : gInventoryMap) { for (auto& [_, item] : gInventoryMap) {
item.isSelected = false; item.isSelected = false;
item.scale = 1.0f; // Reset scale when unselected
} }
} }

View File

@ -8,25 +8,31 @@
namespace ZL namespace ZL
{ {
static const int MAX_INVENTORY_SLOTS = 9;
static const float SELECTED_ITEM_SCALE = 1.2f; // Scale factor for selected items
struct InventoryItem struct InventoryItem
{ {
std::string name; std::string name;
std::shared_ptr<Texture> texture; std::shared_ptr<Texture> texture;
bool isSelected = false; bool isSelected = false;
int hot_key; int hot_key;
float scale = 1.0f; // Add scale property
}; };
// Глобальное хранилище предметов // Глобальное хранилище предметов
extern std::unordered_map<std::string, InventoryItem> gInventoryMap; // Changed from gInventory 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 hot_key); void AddItemToInventory(const std::string& name, std::shared_ptr<Texture> tex, int slot_index);
// Удалить предмет из инвентаря // Удалить предмет из инвентаря
void RemoveItemFromInventory(const std::string& name); void RemoveItemFromInventory(int slot_index);
// Поиск предмета по имени (возвращает указатель или nullptr) // Поиск предмета по индексу (возвращает указатель или nullptr)
InventoryItem* GetItemByName(const std::string& name); InventoryItem* GetItemByHotkey(int hot_key);
InventoryItem* GetItemSelected(bool isSelected);
InventoryItem* GetItemByName(std::string name);
// Вывести весь инвентарь в консоль // Вывести весь инвентарь в консоль
void PrintInventory(); void PrintInventory();
@ -35,5 +41,4 @@ namespace ZL
// Add these new functions // Add these new functions
void UnselectAllItems(); void UnselectAllItems();
InventoryItem* GetItemByHotkey(int hotkey);
} }

View File

@ -19,4 +19,13 @@ namespace ZL
}; };
} }
std::function<void(GameObjectManager&, size_t)> createRoom2Logic()
{
return [](GameObjectManager& gom, size_t ms)
// Simple test logic
{
};
}
} }

View File

@ -5,5 +5,6 @@ namespace ZL {
class GameObjectManager; class GameObjectManager;
std::function<void(GameObjectManager&, size_t)> createRoom1Logic(); std::function<void(GameObjectManager&, size_t)> createRoom1Logic();
std::function<void(GameObjectManager&, size_t)> createRoom2Logic();
} }

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();

View File

@ -7,33 +7,7 @@ uniform vec3 targetPos; // Цель камеры
void main() 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; vec4 color;
vec3 dirToCamera = normalize(eyePos - targetPos); vec3 dirToCamera = normalize(eyePos - targetPos);