diff --git a/SQCSim2021/engine.cpp b/SQCSim2021/engine.cpp index fa08d80..074a7fd 100644 --- a/SQCSim2021/engine.cpp +++ b/SQCSim2021/engine.cpp @@ -72,6 +72,8 @@ void Engine::DrawSplachScreen() glPopMatrix(); glMatrixMode(GL_MODELVIEW); glPopMatrix(); + + m_gamestate = GameState::OPTIONS; } @@ -99,11 +101,11 @@ void Engine::DrawMenu() glTexCoord2f(0, 0); glVertex2i(0, 0); glTexCoord2f(1, 0); - glVertex2i(800, 0); + glVertex2i(Width(), 0); // glTexCoord2f(1, 1); - glVertex2i(800, 600); + glVertex2i(Width(), Height()); glTexCoord2f(0, 1); - glVertex2i(0, 600); + glVertex2i(0, Height()); glEnd(); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); @@ -125,25 +127,28 @@ void Engine::DrawMenu() glVertex2i(0, 300); glEnd(); + + MenuStartTexture.Bind(); glTranslated(80, -225, 0); glBegin(GL_QUADS); glTexCoord2f(0, 0); glVertex2i(0, 100); glTexCoord2f(1, 0); - glVertex2i(sButton, 100); + glVertex2i(sButton , 100); glTexCoord2f(1, 1); glVertex2i(sButton, 200); glTexCoord2f(0, 1); glVertex2i(0, 200); glEnd(); + /*MenuResumeTexture.Bind(); glTranslated(0, -100, 0); glBegin(GL_QUADS); glTexCoord2f(0, 0); glVertex2i(0, 125); - glTexCoord2f(1, 0); + //glTexCoord2f(1, 0); glVertex2i(sButton, 125); glTexCoord2f(1, 1); glVertex2i(sButton, 200); @@ -379,10 +384,13 @@ void Engine::LoadResource() { LoadTexture(m_textureGun, TEXTURE_PATH "gun01.png", false); LoadTexture(m_texturePovGun, TEXTURE_PATH "GUN.png", false); LoadTexture(m_textureSoloMultiMenu, TEXTURE_PATH "single_multi.png", false); + LoadTexture(m_textureSoloText, TEXTURE_PATH "single_player.png", false); + LoadTexture(m_textureMultiText, TEXTURE_PATH "multi_player.png", false); + LoadTexture(m_textureSoloMultiMenu, TEXTURE_PATH "single_multi.png", false); LoadTexture(m_textureTitle, TEXTURE_PATH "title.png", false); - LoadTexture(MenuTitleTexture, MENU_ITEM_PATH "test.png"); - LoadTexture(MenuBGTexture, MENU_ITEM_PATH "test.png"); + LoadTexture(MenuTitleTexture, TEXTURE_PATH "BrouillonbackgroundMenu.png"); + LoadTexture(MenuBGTexture, TEXTURE_PATH "BrouillonbackgroundMenu.png"); LoadTexture(SplachScreenTexture, TEXTURE_PATH "sc2.png"); LoadTexture(MenuQuitTexture, MENU_ITEM_PATH "BasicQuit.png"); LoadTexture(MenuOptionsTexture, MENU_ITEM_PATH "test.png"); @@ -462,16 +470,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); @@ -544,14 +549,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(); @@ -576,7 +580,6 @@ void Engine::DisplayPovGun() { glMatrixMode(GL_PROJECTION); glPopMatrix(); - glMatrixMode(GL_MODELVIEW); glPopMatrix(); } @@ -589,37 +592,44 @@ 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(); //TODO: Associer avec mechanique de vie du joueur @@ -627,10 +637,10 @@ void Engine::DisplayHud(int timer) { // Barre 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 @@ -638,22 +648,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); @@ -661,30 +672,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); @@ -702,7 +720,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; @@ -730,6 +748,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); @@ -746,64 +767,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 + 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()); - // Solo game indicator 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(); - // Multiplayer game indicator - float multiPosY = (centerY * 0.5f) * scaleY; - float multiHeight = (centerY * 0.65f) * scaleY; - + // Single Player text + m_textureSoloText.Bind(); + glColor4f(0.75f, 0.05f, 0.0f, 1.0f); 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, 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); + // Multi Player background + glColor4f(1.0f, 1.0f, 1.0f, 0.5f); + glBegin(GL_QUADS); + 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(); + + // Multi Player text + m_textureMultiText.Bind(); + glColor4f(0.75f, 0.05f, 0.0f, 1.0f); + glBegin(GL_QUADS); + 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,6 +861,8 @@ void Engine::DisplaySingleOrMultiplayerMenu() { glMatrixMode(GL_MODELVIEW); glPopMatrix(); + + ShowCursor(); } void Engine::DrawHud(float elapsedTime, BlockType bloc) { @@ -870,10 +921,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(); @@ -886,21 +940,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) { @@ -920,8 +968,9 @@ void Engine::Render(float elapsedTime) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); m_time_SplashScreen += elapsedTime; - if (m_time_SplashScreen < 2) + if (m_time_SplashScreen < 2) { DrawSplachScreen(); + } else if (m_gamestate == GameState::PLAY) { HideCursor(); @@ -1077,7 +1126,12 @@ void Engine::Render(float elapsedTime) { } else if (m_gamestate == GameState::MAIN_MENU || m_gamestate == GameState::OPTIONS) { - DrawMenu(); + if (!m_soloMultiChoiceMade) { + DisplaySingleOrMultiplayerMenu(); + } + else { + DrawMenu(); + } } else if (m_gamestate == GameState::QUIT) Stop(); @@ -1273,6 +1327,37 @@ void Engine::MousePressEvent(const MOUSE_BUTTON& button, int x, int y) { if ((m_mousemx >= 305 && m_mousemx <= 450) && (m_mousemy >= 300 && m_mousemy <= 400)) m_gamestate = GameState::QUIT; } + else if (m_gamestate == GameState::OPTIONS) + { + 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; + float adjustedMouseY = Height() - m_mousemy; + + // 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; + } + // 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; + } + } } void Engine::MouseReleaseEvent(const MOUSE_BUTTON& button, int x, int y) { diff --git a/SQCSim2021/engine.h b/SQCSim2021/engine.h index 928a102..d51d064 100644 --- a/SQCSim2021/engine.h +++ b/SQCSim2021/engine.h @@ -39,8 +39,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); @@ -74,6 +72,8 @@ private: Texture m_texturePovGun; Texture m_textureSkybox; Texture m_textureSoloMultiMenu; + Texture m_textureSoloText; + Texture m_textureMultiText; Texture m_textureTitle; Skybox m_skybox; @@ -102,6 +102,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; @@ -118,7 +120,7 @@ private: bool m_displayHud = true; bool m_displayInfo = false; bool m_resetcountdown = false; - bool m_soloMultiChoiceMade = true; + bool m_soloMultiChoiceMade = false; bool m_stopcountdown = false; bool m_keyK = false; diff --git a/SQCSim2021/media/textures/multi_player.png b/SQCSim2021/media/textures/multi_player.png new file mode 100644 index 0000000..d8db6e0 Binary files /dev/null and b/SQCSim2021/media/textures/multi_player.png differ diff --git a/SQCSim2021/media/textures/single_player.png b/SQCSim2021/media/textures/single_player.png new file mode 100644 index 0000000..f553d08 Binary files /dev/null and b/SQCSim2021/media/textures/single_player.png differ diff --git a/SQCSim2021/mesh.cpp b/SQCSim2021/mesh.cpp index c6f6b9b..04294af 100644 --- a/SQCSim2021/mesh.cpp +++ b/SQCSim2021/mesh.cpp @@ -9,7 +9,7 @@ Mesh::~Mesh() { void Mesh::FlushMeshToVBO() { m_vertexBuffer.SetMeshData(m_vd, m_vcount); m_vcount = 0; - delete[] m_vd; + //delete[] m_vd; } void Mesh::FlushVBO() {