From fec7e08c2b5b0b9e745a0df0bdc6f090f6d9c6be Mon Sep 17 00:00:00 2001 From: Ariari04 Date: Wed, 10 Dec 2025 20:39:09 +0600 Subject: [PATCH] added dragging scroll button for music volume --- Game.cpp | 70 ++++++++++++++++++++++++++++++++++++++++++++++++-------- Game.h | 12 ++++++++++ 2 files changed, 72 insertions(+), 10 deletions(-) diff --git a/Game.cpp b/Game.cpp index d0f3956..33602a0 100755 --- a/Game.cpp +++ b/Game.cpp @@ -233,9 +233,7 @@ void Game::setup() { musicVolumeBarButtonTexture = std::make_unique(CreateTextureDataFromPng("./resources/musicVolumeBarButton.png", CONST_ZIP_FILE)); - float musicVolumeBarButtonButtonCenterX = 1195.0f; float musicVolumeBarButtonButtonCenterY = 350.0f; - float musicVolumeBarButtonButtonRadius = 25.0f; musicVolumeBarButton.data.PositionData.push_back({ musicVolumeBarButtonButtonCenterX - musicVolumeBarButtonButtonRadius, musicVolumeBarButtonButtonCenterY - musicVolumeBarButtonButtonRadius, 0 }); musicVolumeBarButton.data.PositionData.push_back({ musicVolumeBarButtonButtonCenterX - musicVolumeBarButtonButtonRadius, musicVolumeBarButtonButtonCenterY + musicVolumeBarButtonButtonRadius, 0 }); @@ -366,7 +364,37 @@ void Game::drawBoxes() renderer.shaderManager.PopShader(); CheckGlError(); } +void Game::UpdateVolumeKnob() { + float musicVolumeBarButtonButtonCenterY = volumeBarMinY + musicVolume * (volumeBarMaxY - volumeBarMinY); + auto& pos = musicVolumeBarButton.data.PositionData; + + pos[0] = { musicVolumeBarButtonButtonCenterX - musicVolumeBarButtonButtonRadius, musicVolumeBarButtonButtonCenterY - musicVolumeBarButtonButtonRadius, 0 }; + pos[1] = { musicVolumeBarButtonButtonCenterX - musicVolumeBarButtonButtonRadius, musicVolumeBarButtonButtonCenterY + musicVolumeBarButtonButtonRadius, 0 }; + pos[2] = { musicVolumeBarButtonButtonCenterX + musicVolumeBarButtonButtonRadius, musicVolumeBarButtonButtonCenterY + musicVolumeBarButtonButtonRadius, 0 }; + pos[3] = { musicVolumeBarButtonButtonCenterX - musicVolumeBarButtonButtonRadius, musicVolumeBarButtonButtonCenterY - musicVolumeBarButtonButtonRadius, 0 }; + pos[4] = { musicVolumeBarButtonButtonCenterX + musicVolumeBarButtonButtonRadius, musicVolumeBarButtonButtonCenterY + musicVolumeBarButtonButtonRadius, 0 }; + pos[5] = { musicVolumeBarButtonButtonCenterX + musicVolumeBarButtonButtonRadius, musicVolumeBarButtonButtonCenterY - musicVolumeBarButtonButtonRadius, 0 }; + + musicVolumeBarButton.RefreshVBO(); + +} + +void Game::UpdateVolumeFromMouse(int mouseX, int mouseY) { + + int uiX = mouseX; + int uiY = Environment::height - mouseY; + if (uiY < volumeBarMinY || uiY > volumeBarMaxY) + { + return; + } + + float t = (uiY - volumeBarMinY) / (volumeBarMaxY - volumeBarMinY); + if (t < 0.0f) t = 0.0f; + if (t > 1.0f) t = 1.0f; + musicVolume = t; + UpdateVolumeKnob(); +} void Game::drawUI() { static const std::string defaultShaderName = "default"; @@ -510,21 +538,43 @@ void Game::update() { } else if (event.type == SDL_MOUSEBUTTONDOWN) { // 1. Обработка нажатия кнопки мыши - std::cout << event.button.x << " " << event.button.y << '\n'; - Environment::tapDownHold = true; - // Координаты начального нажатия - Environment::tapDownStartPos.v[0] = event.button.x; - Environment::tapDownStartPos.v[1] = event.button.y; - // Начальная позиция также становится текущей - Environment::tapDownCurrentPos.v[0] = event.button.x; - Environment::tapDownCurrentPos.v[1] = event.button.y; + + int mx = event.button.x; + int my = event.button.y; + + std::cout << mx << " " << my << '\n'; + int uiX = mx; + int uiY = Environment::height - my; + if (uiX >= volumeBarMinX && uiX <= volumeBarMaxX && + uiY >= volumeBarMinY && uiY <= volumeBarMaxY) { + isDraggingVolume = true; + UpdateVolumeFromMouse(mx, my); + } + else { + Environment::tapDownHold = true; + // Координаты начального нажатия + Environment::tapDownStartPos.v[0] = event.button.x; + Environment::tapDownStartPos.v[1] = event.button.y; + // Начальная позиция также становится текущей + Environment::tapDownCurrentPos.v[0] = event.button.x; + Environment::tapDownCurrentPos.v[1] = event.button.y; + } + } else if (event.type == SDL_MOUSEBUTTONUP) { // 2. Обработка отпускания кнопки мыши + isDraggingVolume = false; Environment::tapDownHold = false; } else if (event.type == SDL_MOUSEMOTION) { // 3. Обработка перемещения мыши + int mx = event.motion.x; + int my = event.motion.y; + + if (isDraggingVolume) { + // Двигаем мышь по слайдеру — меняем громкость и позицию кружка + UpdateVolumeFromMouse(mx, my); + } if (Environment::tapDownHold) { // Обновление текущей позиции, если кнопка удерживается Environment::tapDownCurrentPos.v[0] = event.motion.x; diff --git a/Game.h b/Game.h index 852df0c..34b608a 100755 --- a/Game.h +++ b/Game.h @@ -66,6 +66,18 @@ private: std::shared_ptr musicVolumeBarButtonTexture; VertexRenderStruct musicVolumeBarButton; + + + bool isDraggingVolume = false; + float musicVolume = 1.0f; + float volumeBarMinX = 1190.0f; + float volumeBarMaxX = 1200.0f; + float volumeBarMinY = 100.0f; + float volumeBarMaxY = 600.0f; + float musicVolumeBarButtonButtonCenterX = 1195.0f; + float musicVolumeBarButtonButtonRadius = 25.0f; + void UpdateVolumeFromMouse(int mouseX, int mouseY); + void UpdateVolumeKnob(); }; } // namespace ZL \ No newline at end of file