From 9dd2e1b82146e36c3235fb1f8cca8a6001564cf7 Mon Sep 17 00:00:00 2001 From: mduval76 <9343789@etu.cegepsth.qc.ca> Date: Tue, 31 Oct 2023 11:11:14 -0400 Subject: [PATCH] Fix pour resize dynamique de la fenetre de jeu (positionnement et scalaires). Fix pour le maudit F10-fullscreen --- SQCSim2021/engine.cpp | 296 ++++++++++---------- SQCSim2021/engine.h | 4 +- SQCSim2021/media/textures/multi_player.png | Bin 3731 -> 1845 bytes SQCSim2021/media/textures/single_player.png | Bin 4081 -> 2176 bytes SQCSim2021/mesh.cpp | 2 +- 5 files changed, 157 insertions(+), 145 deletions(-) diff --git a/SQCSim2021/engine.cpp b/SQCSim2021/engine.cpp index 26cf983..dc1432a 100644 --- a/SQCSim2021/engine.cpp +++ b/SQCSim2021/engine.cpp @@ -429,16 +429,13 @@ void Engine::ProcessNotificationQueue() { //float fPosY = Height() - (Height() * 0.05) * scaleY; m_textureFont.Bind(); - - auto [scaleX, scaleY] = GetScale(); - - float xOffset = (Width() / 1.5f) * scaleX; - float yOffset = (Height() / 1.2f) * scaleY; + float xOffset = Width() * 0.66f; + float yOffset = Height() * 0.83f; for (auto it = notifications.begin(); it != notifications.end(); ) { float timeSinceDisplay = m_time - it->displayStartTime; - float y = yOffset - (20.0f * scaleX * (it - notifications.begin())); + float y = yOffset - (20.0f * (it - notifications.begin())); glDisable(GL_STENCIL_TEST); glDisable(GL_DEPTH_TEST); @@ -511,14 +508,13 @@ void Engine::DisplayPovGun() { glMatrixMode(GL_MODELVIEW); glPushMatrix(); - float scaleX = (Width()) / BASE_WIDTH; - float scaleY = (Height()) / BASE_HEIGHT; - float baseXOffset = 0.4958 * BASE_WIDTH; - float baseWidth = 0.4688 * BASE_WIDTH; - float baseHeight = 0.5787 * BASE_HEIGHT; - float xTranslation = baseXOffset * scaleX; - float quadWidth = baseWidth * scaleX; - float quadHeight = baseHeight * scaleY; + float baseXOffsetPercentage = 0.4958; + float baseWidthPercentage = 0.4688; + float baseHeightPercentage = 0.5787; + + float xTranslation = baseXOffsetPercentage * Width(); + float quadWidth = baseWidthPercentage * Width(); + float quadHeight = baseHeightPercentage * Height(); m_texturePovGun.Bind(); glLoadIdentity(); @@ -543,7 +539,6 @@ void Engine::DisplayPovGun() { glMatrixMode(GL_PROJECTION); glPopMatrix(); - glMatrixMode(GL_MODELVIEW); glPopMatrix(); } @@ -556,46 +551,53 @@ void Engine::DisplayHud(int timer) { glBindTexture(GL_TEXTURE_2D, 0); glLoadIdentity(); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - auto [scaleX, scaleY] = GetScale(); - float fBackPosX = (Width() / 25.0f) * scaleX; - float fBackPosY = (Height() - (Height() * 0.815) * scaleY); - float fBackWidth = (Width() / 4.0f) * scaleX; - float fBackHeight = (Height() / 5.5f) * scaleY; + float itemBackgroundWidthProportion = 0.25f; + float itemBackgroundHeightProportion = 0.175f; + float itemBackgroundWidth = Width() * itemBackgroundWidthProportion; + float itemBackgroundHeight = Height() * itemBackgroundHeightProportion; + float itemBackgroundXOffset = Width() * 0.05f; + float itemBackgroundYOffset = Height() * 0.6f; + float itemBackgroundXPos = itemBackgroundXOffset; + float itemBackgroundYPos = Height() - itemBackgroundHeight - itemBackgroundYOffset; + // Selected item background glColor4f(1.0f, 1.0f, 1.0f, 0.2f); glBegin(GL_QUADS); - glVertex2f(fBackPosX, fBackPosY); - glVertex2f(fBackPosX + fBackWidth, fBackPosY); - glVertex2f(fBackPosX + fBackWidth, fBackPosY + fBackHeight); - glVertex2f(fBackPosX, fBackPosY + fBackHeight); + glVertex2f(itemBackgroundXPos, itemBackgroundYPos); + glVertex2f(itemBackgroundXPos + itemBackgroundWidth, itemBackgroundYPos); + glVertex2f(itemBackgroundXPos + itemBackgroundWidth, itemBackgroundYPos + itemBackgroundHeight); + glVertex2f(itemBackgroundXPos, itemBackgroundYPos + itemBackgroundHeight); glEnd(); // HP Bar - float fBarWidth = (Width() / 4.0f) * scaleX; - float fBarHeight = (Height() / 25.0f) * scaleY; - float fPosX = (Width() / 25.0f) * scaleX; - float fBarPosY = (Height() - (Height() * 0.775) * scaleY); - float playerHp = m_player.GetHP(); float facteurOmbrage = m_displayInfo ? 0.5f : 1.0f; + float hpBarWidthProportion = 0.25f; + float hpBarHeightProportion = 0.045f; + float hpBarWidth = Width() * hpBarWidthProportion; + float hpBarHeight = Height() * hpBarHeightProportion; + float hpBarXOffset = Width() * 0.05f; + float hpBarYOffset = Height() * 0.7f; + float hpBarYPos = Height() - hpBarHeight - hpBarYOffset; + // HP Bar Background glColor3f(1.0f * facteurOmbrage, 1.0f * facteurOmbrage, 1.0f * facteurOmbrage); glBegin(GL_QUADS); - glVertex2f(fPosX, fBarPosY - fBarHeight); - glVertex2f(fPosX + fBarWidth, fBarPosY - fBarHeight); - glVertex2f(fPosX + fBarWidth, fBarPosY); - glVertex2f(fPosX, fBarPosY); + glVertex2f(itemBackgroundXPos, hpBarYPos - hpBarHeight); + glVertex2f(itemBackgroundXPos + itemBackgroundWidth, hpBarYPos - hpBarHeight); + glVertex2f(itemBackgroundXPos + itemBackgroundWidth, hpBarYPos); + glVertex2f(itemBackgroundXPos, hpBarYPos); glEnd(); // Current HP glColor3f(0.0f * facteurOmbrage, 1.0f * facteurOmbrage, 0.0f * facteurOmbrage); glBegin(GL_QUADS); - glVertex2f(fPosX, fBarPosY - fBarHeight); - glVertex2f(fPosX + fBarWidth * playerHp, fBarPosY - fBarHeight); - glVertex2f(fPosX + fBarWidth * playerHp, fBarPosY); - glVertex2f(fPosX, fBarPosY); + glVertex2f(itemBackgroundXPos, hpBarYPos - hpBarHeight); + glVertex2f(itemBackgroundXPos + itemBackgroundWidth * playerHp, hpBarYPos - hpBarHeight); + glVertex2f(itemBackgroundXPos + itemBackgroundWidth * playerHp, hpBarYPos); + glVertex2f(itemBackgroundXPos, hpBarYPos); glEnd(); // Equip Bar @@ -603,22 +605,23 @@ void Engine::DisplayHud(int timer) { glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glColor3f(1.0f * facteurOmbrage, 1.0f * facteurOmbrage, 1.0f * facteurOmbrage); - float fEquipWidth = (Width() * 0.175f) * scaleX; - float fEquipHeight = (fEquipWidth / 2.5) * scaleY; - float fEquipPosY = (Height() - (Height() * 0.765) * scaleY); + float equipWidthProportion = 0.8f; + float equipHeightProportion = 0.7f; + float equipWidth = itemBackgroundWidth * equipWidthProportion; + float equipHeight = itemBackgroundHeight * equipHeightProportion; + float equipXOffset = itemBackgroundXPos + (itemBackgroundWidth - equipWidth) * 0.1f; + float equipYOffset = itemBackgroundYPos + (itemBackgroundHeight - equipHeight) * 0.75f; - glTranslatef(fPosX, fEquipPosY, 0); + glTranslatef(equipXOffset, equipYOffset, 0); m_textureGun.Bind(); glBegin(GL_QUADS); - glTexCoord2f(0, 0); glVertex2i(0, 0); - glTexCoord2f(1, 0); glVertex2i(fEquipWidth, 0); - glTexCoord2f(1, 1); glVertex2i(fEquipWidth, fEquipHeight); - glTexCoord2f(0, 1); glVertex2i(0, fEquipHeight); + glTexCoord2f(0, 0); glVertex2f(0, 0); + glTexCoord2f(1, 0); glVertex2f(equipWidth, 0); + glTexCoord2f(1, 1); glVertex2f(equipWidth, equipHeight); + glTexCoord2f(0, 1); glVertex2f(0, equipHeight); glEnd(); - //glDisable(GL_BLEND); - // Username glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE); @@ -626,30 +629,37 @@ void Engine::DisplayHud(int timer) { m_textureFont.Bind(); std::ostringstream ss; - float fUsernamePosY = fBarPosY - (fBarHeight * 2) * scaleY; + float fUsernamePosY = hpBarYPos - (hpBarHeight * 2); ss.str(""); ss << m_player.GetUsername(); - PrintText(fPosX, fUsernamePosY, ss.str(), 1.5f); + PrintText(itemBackgroundXPos, fUsernamePosY, ss.str(), 1.5f); ss.str(""); ss << m_player.GetHP() * 100 << "%"; - PrintText(fPosX * 6.25, fUsernamePosY, ss.str(), 1.5f); + PrintText(itemBackgroundXPos * 5.25f, fUsernamePosY, ss.str(), 1.5f); + + float countdownXOffset = Width() * 0.2f; + float countdownYOffset = Height() * 0.1f; + float countdownXPos = Width() - countdownXOffset; + float countdownYPos = Height() - countdownYOffset; // Countdown ss.str(""); ss << "Time: " << (int)(timer / 60) << ":" << std::setw(2) << std::setfill('0') << timer % 60; - PrintText(Width() - (Width() * 0.2f) * scaleX, Height() - (Height() * 0.1) * scaleY, ss.str(), 2.0f); + PrintText(countdownXPos, countdownYPos, ss.str(), 2.0f); } void Engine::DisplayInfo(float elapsedTime, BlockType bloc) { m_textureFont.Bind(); std::ostringstream ss; - auto [scaleX, scaleY] = GetScale(); + float marginX = Width() * 0.01; + float marginY = Height() * 0.05; + + float fPosX = marginX; + float fPosY = Height() - marginY; - float fPosX = (Width() / 100.0f) * scaleX; - float fPosY = Height() - (Height() * 0.05) * scaleY; float charSize = 20 + (24 - 20) * (Width() - 1600) / (1920 - 1600); ss << " Fps : " << GetFps(elapsedTime); @@ -667,7 +677,7 @@ void Engine::DisplayInfo(float elapsedTime, BlockType bloc) { ss.str(""); fPosY -= charSize; - float fPosYJump = ((Height() - (Height() * 0.9f)) * scaleY); + float fPosYJump = Height() * 0.09; fPosY = fPosYJump; fPosY -= charSize; @@ -695,6 +705,9 @@ void Engine::DisplayInfo(float elapsedTime, BlockType bloc) { } void Engine::DisplaySingleOrMultiplayerMenu() { + GLint viewport[4]; + glGetIntegerv(GL_VIEWPORT, viewport); + glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glBlendEquation(GL_FUNC_ADD); @@ -711,98 +724,92 @@ void Engine::DisplaySingleOrMultiplayerMenu() { glMatrixMode(GL_MODELVIEW); glPushMatrix(); - auto [scaleX, scaleY] = GetScale(); - float fBackPosX = 0.0f; - float fBackPosY = 0.0f; - float fBackWidth = Width(); - float fBackHeight = Height(); - + // Background m_textureSoloMultiMenu.Bind(); glBegin(GL_QUADS); - glTexCoord2f(0.0f, 0.0f); glVertex2f(fBackPosX, fBackPosY); - glTexCoord2f(1.0f, 0.0f); glVertex2f(fBackWidth, fBackPosY); - glTexCoord2f(1.0f, 1.0f); glVertex2f(fBackWidth, fBackHeight); - glTexCoord2f(0.0f, 1.0f); glVertex2f(fBackPosX, fBackHeight); + glTexCoord2f(0.0f, 0.0f); glVertex2f(0.0f, 0.0f); + glTexCoord2f(1.0f, 0.0f); glVertex2f(Width(), 0.0f); + glTexCoord2f(1.0f, 1.0f); glVertex2f(Width(), Height()); + glTexCoord2f(0.0f, 1.0f); glVertex2f(0.0f, Height()); glEnd(); - float centerX = (Width() / 2.0f); - float centerY = (Height() / 2.0f); - float titleWidth = (centerX * 1.85f) * scaleX; - float titleHeight = (centerY * 1.85f) * scaleY; - // Title - glColor4f(1.0f, 0.33f, 0.66f, 1.0f); + float titleWidthProportion = 0.4f; + float titleHeightProportion = 0.4f; + float titleWidth = titleWidthProportion * Width(); + float titleHeight = titleHeightProportion * Height(); + float offsetTitleXFactor = 0.05f; + float offsetTitleYFactor = 0.05f; + m_titleX = (Width() - titleWidth) - (offsetTitleXFactor * Width()); + m_titleY = (Height() - titleHeight) - (offsetTitleYFactor * Height()); + m_textureTitle.Bind(); + glColor4f(1.0f, 0.5f, 0.0f, 1.0f); glBegin(GL_QUADS); - glTexCoord2f(0.0f, 0.0f); glVertex2f(centerX, centerY); - glTexCoord2f(1.0f, 0.0f); glVertex2f(titleWidth, centerY); - glTexCoord2f(1.0f, 1.0f); glVertex2f(titleWidth, titleHeight); - glTexCoord2f(0.0f, 1.0f); glVertex2f(centerX, titleHeight); + glTexCoord2f(0.0f, 0.0f); glVertex2f(m_titleX, m_titleY); + glTexCoord2f(1.0f, 0.0f); glVertex2f(m_titleX + titleWidth, m_titleY); + glTexCoord2f(1.0f, 1.0f); glVertex2f(m_titleX + titleWidth, m_titleY + titleHeight); + glTexCoord2f(0.0f, 1.0f); glVertex2f(m_titleX, m_titleY + titleHeight); glEnd(); glBindTexture(GL_TEXTURE_2D, 0); - // Solo game indicator - float fPosX = (centerX * 1.1f) * scaleX; - float fPosXWidth = (centerX * 1.75f) * scaleX; - float soloPosY = (centerY * 0.75f) * scaleY; - float soloHeight = (centerY * 0.9f) * scaleY; + // Single Player and Multiplayer button background quads + float buttonWidthProportion = 0.4f; + float buttonHeightProportion = 0.075f; + float buttonWidth = buttonWidthProportion * Width(); + float buttonHeight = buttonHeightProportion * Height(); + float offsetSingleButtonXFactor = 0.075f; + float offsetSingleButtonYFactor = 0.05f; + float buttonPosX = m_titleX; + float buttonSinglePosY = m_titleY - buttonHeight - (offsetSingleButtonYFactor * Height()); + float buttonMultiPosY = (buttonSinglePosY * 0.75); + + // Single Player background glColor4f(1.0f, 1.0f, 1.0f, 0.5f); glBegin(GL_QUADS); - glTexCoord2f(0.0f, 0.0f); glVertex2f(fPosX, soloPosY); - glTexCoord2f(1.0f, 0.0f); glVertex2f(fPosXWidth, soloPosY); - glTexCoord2f(1.0f, 1.0f); glVertex2f(fPosXWidth, soloHeight); - glTexCoord2f(0.0f, 1.0f); glVertex2f(fPosX, soloHeight); + glTexCoord2f(0.0f, 0.0f); glVertex2f(buttonPosX, buttonSinglePosY); + glTexCoord2f(1.0f, 0.0f); glVertex2f(buttonPosX + buttonWidth, buttonSinglePosY); + glTexCoord2f(1.0f, 1.0f); glVertex2f(buttonPosX + buttonWidth, buttonSinglePosY + buttonHeight); + glTexCoord2f(0.0f, 1.0f); glVertex2f(buttonPosX, buttonSinglePosY + buttonHeight); glEnd(); - glBindTexture(GL_TEXTURE_2D, 0); - - float fPosXSoloText = (centerX * 0.75f) * scaleX; - float fPosXWidthSoloText = (centerX * 2.0f) * scaleX; - float soloPosYSoloText = (centerY * 0.35f) * scaleY; - float soloHeightSoloText = (centerY * 1.3) * scaleY; - + // Single Player text m_textureSoloText.Bind(); - glColor4f(0.5f, 0.0f, 0.5f, 1.0f); + glColor4f(0.75f, 0.05f, 0.0f, 1.0f); glBegin(GL_QUADS); - glTexCoord2f(0.0f, 0.0f); glVertex2f(fPosXSoloText, soloPosYSoloText); - glTexCoord2f(1.0f, 0.0f); glVertex2f(fPosXWidthSoloText, soloPosYSoloText); - glTexCoord2f(1.0f, 1.0f); glVertex2f(fPosXWidthSoloText, soloHeightSoloText); - glTexCoord2f(0.0f, 1.0f); glVertex2f(fPosXSoloText, soloHeightSoloText); + glTexCoord2f(0.0f, 0.0f); glVertex2f(buttonPosX, buttonSinglePosY); + glTexCoord2f(1.0f, 0.0f); glVertex2f(buttonPosX + buttonWidth, buttonSinglePosY); + glTexCoord2f(1.0f, 1.0f); glVertex2f(buttonPosX + buttonWidth, buttonSinglePosY + buttonHeight); + glTexCoord2f(0.0f, 1.0f); glVertex2f(buttonPosX, buttonSinglePosY + buttonHeight); glEnd(); glBindTexture(GL_TEXTURE_2D, 0); - - // Multiplayer game indicator - float multiPosY = (centerY * 0.5f) * scaleY; - float multiHeight = (centerY * 0.65f) * scaleY; - + // Multi Player background glColor4f(1.0f, 1.0f, 1.0f, 0.5f); glBegin(GL_QUADS); - glTexCoord2f(0.0f, 0.0f); glVertex2f(fPosX, multiPosY); - glTexCoord2f(1.0f, 0.0f); glVertex2f(fPosXWidth, multiPosY); - glTexCoord2f(1.0f, 1.0f); glVertex2f(fPosXWidth, multiHeight); - glTexCoord2f(0.0f, 1.0f); glVertex2f(fPosX, multiHeight); + glTexCoord2f(0.0f, 0.0f); glVertex2f(buttonPosX, buttonMultiPosY); + glTexCoord2f(1.0f, 0.0f); glVertex2f(buttonPosX + buttonWidth, buttonMultiPosY); + glTexCoord2f(1.0f, 1.0f); glVertex2f(buttonPosX + buttonWidth, buttonMultiPosY + buttonHeight); + glTexCoord2f(0.0f, 1.0f); glVertex2f(buttonPosX, buttonMultiPosY + buttonHeight); glEnd(); - - float fPosXMultiText = (centerX * 0.7f) * scaleX; - float fPosXWidthMultiText = (centerX * 2.0f) * scaleX; - float multiPosYMultiText = (centerY * 0.01f) * scaleY; - float multiHeightMultiText = (centerY * 1.0105) * scaleY; - + // Multi Player text m_textureMultiText.Bind(); - glColor4f(0.5f, 0.0f, 0.5f, 1.0f); + glColor4f(0.75f, 0.05f, 0.0f, 1.0f); glBegin(GL_QUADS); - glTexCoord2f(0.0f, 0.0f); glVertex2f(fPosXMultiText, multiPosYMultiText); - glTexCoord2f(1.0f, 0.0f); glVertex2f(fPosXWidthMultiText, multiPosYMultiText); - glTexCoord2f(1.0f, 1.0f); glVertex2f(fPosXWidthMultiText, multiHeightMultiText); - glTexCoord2f(0.0f, 1.0f); glVertex2f(fPosXMultiText, multiHeightMultiText); + glTexCoord2f(0.0f, 0.0f); glVertex2f(buttonPosX, buttonMultiPosY); + glTexCoord2f(1.0f, 0.0f); glVertex2f(buttonPosX + buttonWidth, buttonMultiPosY); + glTexCoord2f(1.0f, 1.0f); glVertex2f(buttonPosX + buttonWidth, buttonMultiPosY + buttonHeight); + glTexCoord2f(0.0f, 1.0f); glVertex2f(buttonPosX, buttonMultiPosY + buttonHeight); glEnd(); - // TODO: Add SOLO / MULTIPLAYER text with font + glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + // Reset the state + glViewport(viewport[0], viewport[1], viewport[2], viewport[3]); + glEnable(GL_STENCIL_TEST); glEnable(GL_DEPTH_TEST); @@ -812,7 +819,6 @@ void Engine::DisplaySingleOrMultiplayerMenu() { glMatrixMode(GL_MODELVIEW); glPopMatrix(); - ShowCursor(); } @@ -872,10 +878,13 @@ void Engine::DrawHud(float elapsedTime, BlockType bloc) { } void Engine::PrintText(float x, float y, const std::string& t, float charSizeMultiplier) { - auto [scaleX, scaleY] = GetScale(); - float scale = std::min(scaleX, scaleY); + float windowWidth = static_cast(Width()); + float windowHeight = static_cast(Height()); - float baseCharSize = 20 + (24 - 20) * (Width() - 1600) / (1920 - 1600); + float posX = x * windowWidth; + float posY = y * windowHeight; + + float baseCharSize = 20 + (24 - 20) * (windowWidth - 1600) / (1920 - 1600); float charSize = baseCharSize * charSizeMultiplier; glLoadIdentity(); @@ -888,21 +897,15 @@ void Engine::PrintText(float x, float y, const std::string& t, float charSizeMul glBegin(GL_QUADS); glTexCoord2f(left, 1.f - top - .0625f); glVertex2f(0, 0); - glTexCoord2f(left + .0625f, 1.f - top - .0625f); glVertex2f(charSize * scale, 0); - glTexCoord2f(left + .0625f, 1.f - top); glVertex2f(charSize * scale, charSize * scale); - glTexCoord2f(left, 1.f - top); glVertex2f(0, charSize * scale); + glTexCoord2f(left + .0625f, 1.f - top - .0625f); glVertex2f(charSize, 0); + glTexCoord2f(left + .0625f, 1.f - top); glVertex2f(charSize, charSize); + glTexCoord2f(left, 1.f - top); glVertex2f(0, charSize); glEnd(); - glTranslated(0.5555f * charSize * scale, 0, 0); + glTranslated(0.5555f * charSize, 0, 0); } } -std::pair Engine::GetScale() const { - float widthRatio = static_cast(Width()) / BASE_WIDTH; - float heightRatio = static_cast(Height()) / BASE_HEIGHT; - return { widthRatio, heightRatio }; -} - int Engine::GetFps(float elapsedTime) const { return 1 / elapsedTime; } int Engine::GetCountdown(float elapsedTime) { if (m_resetcountdown) @@ -1243,22 +1246,31 @@ void Engine::MousePressEvent(const MOUSE_BUTTON& button, int x, int y) { } else if (m_gamestate == GameState::OPTIONS) { - auto [scaleX, scaleY] = GetScale(); - float soloLx = ((Width() / 2.0f) + 30) * scaleX; - float soloLy = ((Height() / 2.0f) + 20) * scaleY; - float soloRx = ((Width() / 2.0f) + 240) * scaleX; - float soloRy = ((Height() / 2.0f) + 60) * scaleY; + float buttonWidthProportion = 0.4f; + float buttonHeightProportion = 0.075f; + float buttonWidth = buttonWidthProportion * Width(); + float buttonHeight = buttonHeightProportion * Height(); + float offsetSingleButtonXFactor = 0.075f; + float offsetSingleButtonYFactor = 0.05f; - float multiLx = ((Width() / 2.0f) + 30) * scaleX; - float multiLy = ((Height() / 2.0f) + 85) * scaleY; - float multiRx = ((Width() / 2.0f) + 240) * scaleX; - float multiRy = ((Height() / 2.0f) + 120) * scaleY; + float buttonPosX = m_titleX; + float buttonSinglePosY = m_titleY - buttonHeight - (offsetSingleButtonYFactor * Height()); + float buttonMultiPosY = buttonSinglePosY * 0.75; + float adjustedMouseY = Height() - m_mousemy; - if (m_mousemx >= soloLx && m_mousemx <= soloRx && m_mousemy >= soloLy && m_mousemy <= soloRy) { + // Single Player + if (m_mousemx >= buttonPosX && m_mousemx <= (buttonPosX + buttonWidth) && + adjustedMouseY >= buttonSinglePosY && adjustedMouseY <= (buttonSinglePosY + buttonHeight)) + { + std::cout << "Single Player button clicked" << std::endl; m_soloMultiChoiceMade = true; m_gamestate = GameState::PLAY; } - else if (m_mousemx >= multiLx && m_mousemx <= multiRx && m_mousemy >= multiLy && m_mousemy <= multiRy) { + // Multiplayer + else if (m_mousemx >= buttonPosX && m_mousemx <= (buttonPosX + buttonWidth) && + adjustedMouseY >= buttonMultiPosY && adjustedMouseY <= (buttonMultiPosY + buttonHeight)) + { + std::cout << "Multiplayer button clicked" << std::endl; m_soloMultiChoiceMade = true; m_gamestate = GameState::PLAY; } diff --git a/SQCSim2021/engine.h b/SQCSim2021/engine.h index a12ec8a..96b5af6 100644 --- a/SQCSim2021/engine.h +++ b/SQCSim2021/engine.h @@ -38,8 +38,6 @@ public: virtual void MouseReleaseEvent(const MOUSE_BUTTON &button, int x, int y); private: - std::pair GetScale() const; - int GetFps(float elapsedTime) const; int GetCountdown(float elapsedTime); @@ -100,6 +98,8 @@ private: float m_scale; float m_time = 0; float m_time_SplashScreen = 0; + float m_titleX = 0; + float m_titleY = 0; float m_Width = 0; float m_Height = 0; diff --git a/SQCSim2021/media/textures/multi_player.png b/SQCSim2021/media/textures/multi_player.png index b013b441f8be1d3acff72721308c61306a67e8cb..d8db6e033c1b96c6a4ab848446cfd649bbc3c1c6 100644 GIT binary patch delta 1744 zcmbO%yOmF|Gr-TCmrII^fq{Y7)59f*fq}7zfq@~IgN=cKp=oiC-b6){RJK!|E{-7; zac}SL?!OZva{Qx?tfpscM?;ecM`j}vXP3effs2kaOb_4WfJRWj+4b8S}of|J{qjWsA-ma@KNc zS8WaL{C@5gd+o2ds`}N}>JJCJto(fW{gdF@S-eHJpVo+P?*F<_`pLHJpL%JlpHF%# zRsVR|gx}W$zGu!o#rm^--}>9N^Dc2s`SvD4en-8N-1S}E$G7BJSXlfBJN35aC_ zkJ{1CQuim(Y7^jn#h^amwSa$C?$*N#o|mq@msdZvR_@80pgr9B zUK7+;&wbd^W_?#{#wqV8<;sZH0@EV(=Q*BF``)!YI`uxgn^^q`R3k7FT)}aDLmIuVy(O-d5t~s)*;!5C2kRXQ?KQJIV<9A(>(9` z*U#B+!y+#!q?b-?vWcwKy*&3(QvE&_hbeQ~es^8do9B4`%8O4Wt95cGY+jY&c<)ct zvzwY5TDMeHoxGd(qe*0-|{dLac`qSBID~l&wT3PluH)P+Y4z!!G{Pg)i&AY)P1~c|(Weyk*kUe!OCSGka36^!Yd9=NF{Qvsr3)NIc0D zRWCl?$o6xZRYm4MtGNLQ4<*06IjoS*D%dP@K<)LVKh;sXzoxyCzbv*Ted%*E@7R-( zvW|RbnoBeP&Ht3lTYO$;hLHNngbAC4nq+>zxm15~R!Qu>%rYDAUBNS=XZQyMW?a~O zOyT*l`!^OGsrPdJzV`lBF~e#O(zvuktqbDn; zKf8Z5D=~Iez0bYLv23=HCujD*d-d{Ik>ZKQ&5K$qlHz9Rum7#AS^v~qZTA|nzwWC$ z_o%U1es(;%Z?)(%7Rv&yqz?6U8%p>6+v#_F&f=^@zX{CC@AZj2s{gd`yUyAF&a1os z@VySI6!l))}-32-JZ8E|8vma1`Fp2GptV7)>bX$&*MLH zP@;L_y`{f6(q1X}$Fr{0K3ZRQg-fT&WR3S+)BXMBEA5&(FKqqPdreRC&1FNC2Gz=_ z*Af=m*Lz$!icU9H=p^#LnXMgl{6Xxheg`%FPtDEE_m_MrT|dRiJpsj~iRF z9dyZ= zohPaj8f9T5Htp5aGCgi`2)4aDYhiF=-MQ^R@OLk+ zBd<1xai2LldK^kW`3#UAZnx+5y?zQ5i zQ@Qshr^;^#sc%zatIX;w-)hh$E%B_y!s|1SRaDfSd52v$hsaMns3B!g|NPuvez(}C Wc5k<-o?>8NVDNPHb6Mw<&;$SxWpB3t literal 3731 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 m)Y{Py7!3i23%k_k{jgVDQoH_hmdG4XfOxw4xvX