// --------------------------------------------------------------------------- // Project Name : Nook // File Name : LevelSelect.c // Author : Mary Khuu // Creation Date : 19 Mar 2021 // Purpose : Level Select // // All content © 2021 DigiPen (USA) Corporation, all rights reserved. // --------------------------------------------------------------------------- #include "framework.h" #include "AEEngine.h" #include "Audio.h" #include "GameStateManager.h" #include "Sprite.h" #include "object_data.h" #include "LevelSelect.h" //------------------------------------------------------------------------------ // Private Constants: //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ // Private Structures: //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ // Public Variables: //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ // Private Variables: //------------------------------------------------------------------------------ static vec2 backgroundSize = { 1670.0f, 564.0f }; static vec2 buttonSize = { 100.0f, 30.0f }; static vec2 textSize = { 150.0f, 50.0f }; static vec2 iconSize = { 30.0f, 30.0f }; static vec2 menuPos = { 0.0f, 200.0f }; static vec2 tutorialPos = { 0.0f, 100.0f }; static vec2 level1Pos = { 0.0f, 0.0f }; static vec2 level2Pos = { 0.0f, -100.0f }; static vec2 level3Pos = { 0.0f, -200.0f }; static signed long mouseX, mouseY; static float mouseInWorldX, mouseInWorldY; static AEGfxVertexList* bgMesh; static AEGfxVertexList* buttonMesh; static AEGfxVertexList* fontMesh; static AEGfxVertexList* iconMesh; static AEGfxVertexList* numMesh; static AEGfxTexture* bgTexture; static AEGfxTexture* buttonTexture; static AEGfxTexture* fontTexture; static AEGfxTexture* iconTexture; static AEGfxTexture* numTexture; static TextureOffset numOffsets[10]; static TextureOffset fontOffsets[30]; static int* currentfontOffset = 0; static int currfontFrame = 0; static float* fontTime; //------------------------------------------------------------------------------ // Private Function Declarations: //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ // Public Functions: //------------------------------------------------------------------------------ void LevelSelectLoad() { /*mesh for bg*/ AEGfxMeshStart(); AEGfxTriAdd( -backgroundSize.x, -backgroundSize.y, 0xFF00FF00, 0.0f, 1.0f, backgroundSize.x, -backgroundSize.y, 0xFF00FF00, 1.0f, 1.0f, -backgroundSize.x, backgroundSize.y, 0xFF00FF00, 0.0f, 0.0f); AEGfxTriAdd( backgroundSize.x, -backgroundSize.y, 0xFF00FF00, 1.0f, 1.0f, backgroundSize.x, backgroundSize.y, 0xFF00FF00, 1.0f, 0.0f, -backgroundSize.x, backgroundSize.y, 0xFF00FF00, 0.0f, 0.0f); bgMesh = AEGfxMeshEnd(); AE_ASSERT_MESG(bgMesh, "Failed to create button!"); bgTexture = AEGfxTextureLoad("Assets/CityscapeGrey.png"); AE_ASSERT_MESG(bgTexture, "Failed to create pTex!!"); /*mesh for buttons: green*/ AEGfxMeshStart(); AEGfxTriAdd( -buttonSize.x, -buttonSize.y, 0xFF00FF00, 0.0f, 1.0f, buttonSize.x, -buttonSize.y, 0xFF00FF00, 1.0f, 1.0f, -buttonSize.x, buttonSize.y, 0xFF00FF00, 0.0f, 0.0f); AEGfxTriAdd( buttonSize.x, -buttonSize.y, 0xFF00FF00, 1.0f, 1.0f, buttonSize.x, buttonSize.y, 0xFF00FF00, 1.0f, 0.0f, -buttonSize.x, buttonSize.y, 0xFF00FF00, 0.0f, 0.0f); buttonMesh = AEGfxMeshEnd(); AE_ASSERT_MESG(buttonMesh, "Failed to create button!"); buttonTexture = AEGfxTextureLoad("Assets/NookButtonBright.png"); AE_ASSERT_MESG(buttonTexture, "Failed to create texture!"); /*mesh for hover icon*/ iconMesh = createQuadMesh(iconSize.x, iconSize.y, 1.0f, 1.0f, "yarn"); iconTexture = AEGfxTextureLoad("Assets/TempHover.png"); AE_ASSERT_MESG(iconTexture, "Failed to create texture!"); /*mesh for text*/ fontMesh = createQuadMesh(15.0f, 15.0f, 1.0 / 5, 1.0f / 6, "alphabets"); fontTexture = AEGfxTextureLoad("Assets/NookFontSheet_alphabet.png"); AE_ASSERT_MESG(fontTexture, "Failed to create texture!"); fontOffsets[0].mX = 0.0f; fontOffsets[0].mY = 0.0f / 6; //A fontOffsets[1].mX = 1.0f / 5; fontOffsets[1].mY = 0.0f / 6; //B fontOffsets[2].mX = 2.0f / 5; fontOffsets[2].mY = 0.0f / 6; //C fontOffsets[3].mX = 3.0f / 5; fontOffsets[3].mY = 0.0f / 6; //D fontOffsets[4].mX = 4.0f / 5; fontOffsets[4].mY = 0.0f / 6; //E fontOffsets[5].mX = 0.0f; fontOffsets[5].mY = 1.0f / 6; //F fontOffsets[6].mX = 1.0f / 5; fontOffsets[6].mY = 1.0f / 6; //G fontOffsets[7].mX = 2.0f / 5; fontOffsets[7].mY = 1.0f / 6; //H fontOffsets[8].mX = 3.0f / 5; fontOffsets[8].mY = 1.0f / 6; //I fontOffsets[9].mX = 4.0f / 5; fontOffsets[9].mY = 1.0f / 6; //J fontOffsets[10].mX = 0.0f; fontOffsets[10].mY = 2.0f / 6; //K fontOffsets[11].mX = 1.0f / 5; fontOffsets[11].mY = 2.0f / 6; //L fontOffsets[12].mX = 2.0f / 5; fontOffsets[12].mY = 2.0f / 6; //M fontOffsets[13].mX = 3.0f / 5; fontOffsets[13].mY = 2.0f / 6; //N fontOffsets[14].mX = 4.0f / 5; fontOffsets[14].mY = 2.0f / 6; //O fontOffsets[15].mX = 0.0f; fontOffsets[15].mY = 3.0f / 6; //P fontOffsets[16].mX = 1.0f / 5; fontOffsets[16].mY = 3.0f / 6; //Q fontOffsets[17].mX = 2.0f / 5; fontOffsets[17].mY = 3.0f / 6; //R fontOffsets[18].mX = 3.0f / 5; fontOffsets[18].mY = 3.0f / 6; //S fontOffsets[19].mX = 4.0f / 5; fontOffsets[19].mY = 3.0f / 6; //T fontOffsets[20].mX = 0.0f; fontOffsets[20].mY = 4.0f / 6; //U fontOffsets[21].mX = 1.0f / 5; fontOffsets[21].mY = 4.0f / 6; //V fontOffsets[22].mX = 2.0f / 5; fontOffsets[22].mY = 4.0f / 6; //W fontOffsets[23].mX = 3.0f / 5; fontOffsets[23].mY = 4.0f / 6; //X fontOffsets[24].mX = 4.0f / 5; fontOffsets[24].mY = 4.0f / 6; //Y fontOffsets[25].mX = 0.0f; fontOffsets[25].mY = 5.0f / 6; //Z fontOffsets[26].mX = 1.0f / 5; fontOffsets[26].mY = 5.0f / 6; //blank (1) fontOffsets[27].mX = 2.0f / 5; fontOffsets[27].mY = 5.0f / 6; //blank (2) fontOffsets[28].mX = 3.0f / 5; fontOffsets[28].mY = 5.0f / 6; //blank (3) fontOffsets[29].mX = 4.0f / 5; fontOffsets[29].mY = 5.0f / 6; //blank (4) /*mesh for numbers*/ numMesh = createQuadMesh(15.0f, 15.0f, 1.0 / 3, 1.0f / 4, "numbers"); numTexture = AEGfxTextureLoad("Assets/NookFontSheet_numbers.png"); AE_ASSERT_MESG(numTexture, "Failed to create texture!"); numOffsets[0].mX = 0.0f; numOffsets[0].mY = 0.0f / 4; //0 numOffsets[1].mX = 1.0f / 3; numOffsets[1].mY = 0.0f / 4; //1 numOffsets[2].mX = 2.0f / 3; numOffsets[2].mY = 0.0f / 4; //2 numOffsets[3].mX = 0.0f; numOffsets[3].mY = 1.0f / 4; //3 numOffsets[4].mX = 1.0f / 3; numOffsets[4].mY = 1.0f / 4; //4 numOffsets[5].mX = 2.0f / 3; numOffsets[5].mY = 1.0f / 4; //5 numOffsets[6].mX = 0.0f; numOffsets[6].mY = 2.0f / 4; //6 numOffsets[7].mX = 1.0f / 3; numOffsets[7].mY = 2.0f / 4; //7 numOffsets[8].mX = 2.0f / 3; numOffsets[8].mY = 2.0f / 4; //8 numOffsets[9].mX = 0.0f / 3; numOffsets[9].mY = 3.0f / 4; //9 } void LevelSelectInit() { AEGfxSetBackgroundColor(1.0f, 1.0f, 1.0f); AEGfxSetBlendMode(AE_GFX_BM_BLEND); } void LevelSelectUpdate(float dt) { /* Tell the compiler that the 'dt' variable is unused. */ UNREFERENCED_PARAMETER(dt); /*draw background*/ AEGfxSetRenderMode(AE_GFX_RM_TEXTURE); AEGfxTextureSet(bgTexture, 0, 0); AEGfxSetTransparency(1.0f); AEGfxSetPosition(-250.0f, 0.0f); AEGfxMeshDraw(bgMesh, AE_GFX_MDM_TRIANGLES); //draw menu button AEGfxSetPosition(menuPos.x, menuPos.y); AEGfxTextureSet(buttonTexture, 0, 0); // no texture AEGfxMeshDraw(buttonMesh, AE_GFX_MDM_TRIANGLES); //draw tutorial button AEGfxSetPosition(tutorialPos.x, tutorialPos.y); AEGfxTextureSet(buttonTexture, 0, 0); // no texture AEGfxMeshDraw(buttonMesh, AE_GFX_MDM_TRIANGLES); //draw level1 button AEGfxSetPosition(level1Pos.x, level1Pos.y); AEGfxTextureSet(buttonTexture, 0, 0); // no texture AEGfxMeshDraw(buttonMesh, AE_GFX_MDM_TRIANGLES); //draw level2 button AEGfxSetPosition(level2Pos.x, level2Pos.y); AEGfxTextureSet(buttonTexture, 0, 0); // no texture AEGfxMeshDraw(buttonMesh, AE_GFX_MDM_TRIANGLES); //draw level3 button AEGfxSetPosition(level3Pos.x, level3Pos.y); AEGfxTextureSet(buttonTexture, 0, 0); // no texture AEGfxMeshDraw(buttonMesh, AE_GFX_MDM_TRIANGLES); /*MENU*/ AEGfxSetPosition(menuPos.x - 45.0f, menuPos.y); AEGfxTextureSet(fontTexture, fontOffsets[12].mX, fontOffsets[12].mY, 0.0f); AEGfxMeshDraw(fontMesh, AE_GFX_MDM_TRIANGLES); AEGfxSetPosition(menuPos.x - 13.0f, menuPos.y); AEGfxTextureSet(fontTexture, fontOffsets[4].mX, fontOffsets[4].mY, 0.0f); AEGfxMeshDraw(fontMesh, AE_GFX_MDM_TRIANGLES); AEGfxSetPosition(menuPos.x + 15.0f, menuPos.y); AEGfxTextureSet(fontTexture, fontOffsets[13].mX, fontOffsets[13].mY, 0.0f); AEGfxMeshDraw(fontMesh, AE_GFX_MDM_TRIANGLES); AEGfxSetPosition(menuPos.x + 45.0f, menuPos.y); AEGfxTextureSet(fontTexture, fontOffsets[20].mX, fontOffsets[20].mY, 0.0f); AEGfxMeshDraw(fontMesh, AE_GFX_MDM_TRIANGLES); /*MENU - end*/ /*TUTORIAL*/ AEGfxSetPosition(tutorialPos.x - 86.0f, tutorialPos.y); AEGfxTextureSet(fontTexture, fontOffsets[19].mX, fontOffsets[19].mY, 0.0f); AEGfxMeshDraw(fontMesh, AE_GFX_MDM_TRIANGLES); AEGfxSetPosition(tutorialPos.x - 58.0f, tutorialPos.y); AEGfxTextureSet(fontTexture, fontOffsets[20].mX, fontOffsets[20].mY, 0.0f); AEGfxMeshDraw(fontMesh, AE_GFX_MDM_TRIANGLES); AEGfxSetPosition(tutorialPos.x - 30.0f, tutorialPos.y); AEGfxTextureSet(fontTexture, fontOffsets[19].mX, fontOffsets[19].mY, 0.0f); AEGfxMeshDraw(fontMesh, AE_GFX_MDM_TRIANGLES); AEGfxSetPosition(tutorialPos.x, tutorialPos.y); AEGfxTextureSet(fontTexture, fontOffsets[14].mX, fontOffsets[14].mY, 0.0f); AEGfxMeshDraw(fontMesh, AE_GFX_MDM_TRIANGLES); AEGfxSetPosition(tutorialPos.x + 30.0f, tutorialPos.y); AEGfxTextureSet(fontTexture, fontOffsets[17].mX, fontOffsets[17].mY, 0.0f); AEGfxMeshDraw(fontMesh, AE_GFX_MDM_TRIANGLES); AEGfxSetPosition(tutorialPos.x + 46.0f, tutorialPos.y); AEGfxTextureSet(fontTexture, fontOffsets[8].mX, fontOffsets[8].mY, 0.0f); AEGfxMeshDraw(fontMesh, AE_GFX_MDM_TRIANGLES); AEGfxSetPosition(tutorialPos.x + 65.0f, tutorialPos.y); AEGfxTextureSet(fontTexture, fontOffsets[0].mX, fontOffsets[0].mY, 0.0f); AEGfxMeshDraw(fontMesh, AE_GFX_MDM_TRIANGLES); AEGfxSetPosition(tutorialPos.x + 90.0f, tutorialPos.y); AEGfxTextureSet(fontTexture, fontOffsets[11].mX, fontOffsets[11].mY, 0.0f); AEGfxMeshDraw(fontMesh, AE_GFX_MDM_TRIANGLES); /*TUTORIAL - end*/ /*LEVEL 1*/ AEGfxSetPosition(level1Pos.x - 85.0f, level1Pos.y); AEGfxTextureSet(fontTexture, fontOffsets[11].mX, fontOffsets[11].mY, 0.0f); AEGfxMeshDraw(fontMesh, AE_GFX_MDM_TRIANGLES); AEGfxSetPosition(level1Pos.x - 60.0f, level1Pos.y); AEGfxTextureSet(fontTexture, fontOffsets[4].mX, fontOffsets[4].mY, 0.0f); AEGfxMeshDraw(fontMesh, AE_GFX_MDM_TRIANGLES); AEGfxSetPosition(level1Pos.x - 34.0f, level1Pos.y); AEGfxTextureSet(fontTexture, fontOffsets[21].mX, fontOffsets[21].mY, 0.0f); AEGfxMeshDraw(fontMesh, AE_GFX_MDM_TRIANGLES); AEGfxSetPosition(level1Pos.x - 5.0f, level1Pos.y); AEGfxTextureSet(fontTexture, fontOffsets[4].mX, fontOffsets[4].mY, 0.0f); AEGfxMeshDraw(fontMesh, AE_GFX_MDM_TRIANGLES); AEGfxSetPosition(level1Pos.x + 17.5f, level1Pos.y); AEGfxTextureSet(fontTexture, fontOffsets[11].mX, fontOffsets[11].mY, 0.0f); AEGfxMeshDraw(fontMesh, AE_GFX_MDM_TRIANGLES); AEGfxSetPosition(level1Pos.x + 85.0f, level1Pos.y); AEGfxTextureSet(numTexture, numOffsets[1].mX, numOffsets[1].mY, 0.0f); // 1 AEGfxMeshDraw(numMesh, AE_GFX_MDM_TRIANGLES); /*LEVEL 1 - end*/ /*LEVEL 2*/ AEGfxSetPosition(level2Pos.x - 85.0f, level2Pos.y); AEGfxTextureSet(fontTexture, fontOffsets[11].mX, fontOffsets[11].mY, 0.0f); AEGfxMeshDraw(fontMesh, AE_GFX_MDM_TRIANGLES); AEGfxSetPosition(level2Pos.x - 60.0f, level2Pos.y); AEGfxTextureSet(fontTexture, fontOffsets[4].mX, fontOffsets[4].mY, 0.0f); AEGfxMeshDraw(fontMesh, AE_GFX_MDM_TRIANGLES); AEGfxSetPosition(level2Pos.x - 34.0f, level2Pos.y); AEGfxTextureSet(fontTexture, fontOffsets[21].mX, fontOffsets[21].mY, 0.0f); AEGfxMeshDraw(fontMesh, AE_GFX_MDM_TRIANGLES); AEGfxSetPosition(level2Pos.x - 5.0f, level2Pos.y); AEGfxTextureSet(fontTexture, fontOffsets[4].mX, fontOffsets[4].mY, 0.0f); AEGfxMeshDraw(fontMesh, AE_GFX_MDM_TRIANGLES); AEGfxSetPosition(level2Pos.x + 17.5f, level2Pos.y); AEGfxTextureSet(fontTexture, fontOffsets[11].mX, fontOffsets[11].mY, 0.0f); AEGfxMeshDraw(fontMesh, AE_GFX_MDM_TRIANGLES); AEGfxSetPosition(level2Pos.x + 85.0f, level2Pos.y); AEGfxTextureSet(numTexture, numOffsets[2].mX, numOffsets[2].mY, 0.0f); // 2 AEGfxMeshDraw(numMesh, AE_GFX_MDM_TRIANGLES); /*LEVEL 2 - end*/ /*LEVEL 3*/ AEGfxSetPosition(level3Pos.x - 85.0f, level3Pos.y); AEGfxTextureSet(fontTexture, fontOffsets[11].mX, fontOffsets[11].mY, 0.0f); AEGfxMeshDraw(fontMesh, AE_GFX_MDM_TRIANGLES); AEGfxSetPosition(level3Pos.x - 60.0f, level3Pos.y); AEGfxTextureSet(fontTexture, fontOffsets[4].mX, fontOffsets[4].mY, 0.0f); AEGfxMeshDraw(fontMesh, AE_GFX_MDM_TRIANGLES); AEGfxSetPosition(level3Pos.x - 34.0f, level3Pos.y); AEGfxTextureSet(fontTexture, fontOffsets[21].mX, fontOffsets[21].mY, 0.0f); AEGfxMeshDraw(fontMesh, AE_GFX_MDM_TRIANGLES); AEGfxSetPosition(level3Pos.x - 5.0f, level3Pos.y); AEGfxTextureSet(fontTexture, fontOffsets[4].mX, fontOffsets[4].mY, 0.0f); AEGfxMeshDraw(fontMesh, AE_GFX_MDM_TRIANGLES); AEGfxSetPosition(level3Pos.x + 17.5f, level3Pos.y); AEGfxTextureSet(fontTexture, fontOffsets[11].mX, fontOffsets[11].mY, 0.0f); AEGfxMeshDraw(fontMesh, AE_GFX_MDM_TRIANGLES); AEGfxSetPosition(level3Pos.x + 85.0f, level3Pos.y); AEGfxTextureSet(numTexture, numOffsets[3].mX, numOffsets[3].mY, 0.0f); // 3 AEGfxMeshDraw(numMesh, AE_GFX_MDM_TRIANGLES); /*LEVEL 3 - end*/ /*get the mouse position*/ AEInputGetCursorPosition(&mouseX, &mouseY); AEGfxConvertScreenCoordinatesToWorld(mouseX, mouseY, &mouseInWorldX, &mouseInWorldY); /*if menu is hovered*/ if ((mouseInWorldX > (menuPos.x - buttonSize.x) && mouseInWorldX < (menuPos.x + buttonSize.x)) && (mouseInWorldY > (menuPos.y - buttonSize.y) && mouseInWorldY < (menuPos.y + buttonSize.y))) { // Hover texture AEGfxSetRenderMode(AE_GFX_RM_TEXTURE); AEGfxSetPosition(menuPos.x - 140.0f, menuPos.y); AEGfxTextureSet(iconTexture, 0.0f, 0.0f); AEGfxMeshDraw(iconMesh, AE_GFX_MDM_TRIANGLES); if (AEInputCheckTriggered(RI_MOUSE_LEFT_BUTTON_DOWN)) { GameStateManagerSetNextState(Menu); } } /*if tutorial is hovered*/ if ((mouseInWorldX > (tutorialPos.x - buttonSize.x) && mouseInWorldX < (tutorialPos.x + buttonSize.x)) && (mouseInWorldY > (tutorialPos.y - buttonSize.y) && mouseInWorldY < (tutorialPos.y + buttonSize.y))) { // Hover texture AEGfxSetRenderMode(AE_GFX_RM_TEXTURE); AEGfxSetPosition(tutorialPos.x - 140.0f, tutorialPos.y); AEGfxTextureSet(iconTexture, 0.0f, 0.0f); AEGfxMeshDraw(iconMesh, AE_GFX_MDM_TRIANGLES); if (AEInputCheckTriggered(RI_MOUSE_LEFT_BUTTON_DOWN)) { GameStateManagerSetNextState(Tutorial); } } /*if level1 is hovered*/ if ((mouseInWorldX > (level1Pos.x - buttonSize.x) && mouseInWorldX < (level1Pos.x + buttonSize.x)) && (mouseInWorldY > (level1Pos.y - buttonSize.y) && mouseInWorldY < (level1Pos.y + buttonSize.y))) { // Hover texture AEGfxSetRenderMode(AE_GFX_RM_TEXTURE); AEGfxSetPosition(level1Pos.x - 140.0f, level1Pos.y); AEGfxTextureSet(iconTexture, 0.0f, 0.0f); AEGfxMeshDraw(iconMesh, AE_GFX_MDM_TRIANGLES); if (AEInputCheckTriggered(RI_MOUSE_LEFT_BUTTON_DOWN)) { GameStateManagerSetNextState(Demo); } } /*if level2 is hovered*/ if ((mouseInWorldX > (level2Pos.x - buttonSize.x) && mouseInWorldX < (level2Pos.x + buttonSize.x)) && (mouseInWorldY > (level2Pos.y - buttonSize.y) && mouseInWorldY < (level2Pos.y + buttonSize.y))) { // Hover texture AEGfxSetRenderMode(AE_GFX_RM_TEXTURE); AEGfxSetPosition(level2Pos.x - 140.0f, level2Pos.y); AEGfxTextureSet(iconTexture, 0.0f, 0.0f); AEGfxMeshDraw(iconMesh, AE_GFX_MDM_TRIANGLES); if (AEInputCheckTriggered(RI_MOUSE_LEFT_BUTTON_DOWN)) { GameStateManagerSetNextState(Level2); } } /*if level3 is hovered*/ if ((mouseInWorldX > (level3Pos.x - buttonSize.x) && mouseInWorldX < (level3Pos.x + buttonSize.x)) && (mouseInWorldY > (level3Pos.y - buttonSize.y) && mouseInWorldY < (level3Pos.y + buttonSize.y))) { // Hover texture AEGfxSetRenderMode(AE_GFX_RM_TEXTURE); AEGfxSetPosition(level3Pos.x - 140.0f, level3Pos.y); AEGfxTextureSet(iconTexture, 0.0f, 0.0f); AEGfxMeshDraw(iconMesh, AE_GFX_MDM_TRIANGLES); if (AEInputCheckTriggered(RI_MOUSE_LEFT_BUTTON_DOWN)) { GameStateManagerSetNextState(Level3); } } } void LevelSelectShutdown() { AudioCleanup(); } void LevelSelectUnload() { // Unload all textures. AEGfxTextureUnload(buttonTexture); AEGfxTextureUnload(fontTexture); AEGfxTextureUnload(bgTexture); AEGfxTextureUnload(iconTexture); AEGfxTextureUnload(numTexture); // Free all meshes. AEGfxMeshFree(buttonMesh); AEGfxMeshFree(fontMesh); AEGfxMeshFree(bgMesh); AEGfxMeshFree(iconMesh); AEGfxMeshFree(numMesh); } //------------------------------------------------------------------------------ // Private Functions: //------------------------------------------------------------------------------
// --------------------------------------------------------------------------- // Project Name : Nook // File Name : Menu.c // Author : Rey Rosario, Mary Khuu // Creation Date : 25 Jan 2021 // Purpose : Main Menu // // All content © 2021 DigiPen (USA) Corporation, all rights reserved. // --------------------------------------------------------------------------- #include "framework.h" #include "AEEngine.h" #include "Audio.h" #include "GameStateManager.h" #include "object_data.h" #include "Sprite.h" #include "Menu.h" //------------------------------------------------------------------------------ // Private Constants: //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ // Private Structures: //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ // Public Variables: //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ // Private Variables: //------------------------------------------------------------------------------ static vec2 backgroundSize = { 1670.0f, 564.0f }; static vec2 buttonSize = { 100.0f, 30.0f }; static vec2 titleSize = { 150.0f, 50.0f }; static vec2 iconSize = { 30.0f, 30.0f }; static vec2 levelPos = { 0.0f, 0.0f }; static vec2 creditsPos = { 0.0f, -100.0f }; static vec2 exitPos = { 0.0f, -200.0f }; static vec2 titlePos = { 0.0f, 150.0f }; static signed long mouseX, mouseY; static float mouseInWorldX, mouseInWorldY; static AEGfxVertexList* buttonMesh; static AEGfxVertexList* titleMesh; static AEGfxVertexList* bgMesh; static AEGfxVertexList* fontMesh; static AEGfxVertexList* iconMesh; static AEGfxTexture* bgTexture; static AEGfxTexture* buttonTexture; static AEGfxTexture* titleTexture; static AEGfxTexture* fontTexture; static AEGfxTexture* iconTexture; TextureOffset titleOffsets[6]; int* currentTitleOffset = 0; int currTitleFrame = 0; float* titleTime; static TextureOffset fontOffsets[30]; static int* currentfontOffset = 0; static int currfontFrame = 0; static float* fontTime; static float bgMusicTimer; //------------------------------------------------------------------------------ // Private Function Declarations: //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ // Public Functions: //------------------------------------------------------------------------------ void MenuLoad() { /*mesh for bg*/ AEGfxMeshStart(); AEGfxTriAdd( -backgroundSize.x, -backgroundSize.y, 0xFF00FF00, 0.0f, 1.0f, backgroundSize.x, -backgroundSize.y, 0xFF00FF00, 1.0f, 1.0f, -backgroundSize.x, backgroundSize.y, 0xFF00FF00, 0.0f, 0.0f); AEGfxTriAdd( backgroundSize.x, -backgroundSize.y, 0xFF00FF00, 1.0f, 1.0f, backgroundSize.x, backgroundSize.y, 0xFF00FF00, 1.0f, 0.0f, -backgroundSize.x, backgroundSize.y, 0xFF00FF00, 0.0f, 0.0f); bgMesh = AEGfxMeshEnd(); AE_ASSERT_MESG(bgMesh, "Failed to create button!"); bgTexture = AEGfxTextureLoad("Assets/CityscapeGrey.png"); AE_ASSERT_MESG(bgTexture, "Failed to create pTex!!"); /*mesh for buttons: green*/ AEGfxMeshStart(); AEGfxTriAdd( -buttonSize.x, -buttonSize.y, 0xFF00FF00, 0.0f, 1.0f, buttonSize.x, -buttonSize.y, 0xFF00FF00, 1.0f, 1.0f, -buttonSize.x, buttonSize.y, 0xFF00FF00, 0.0f, 0.0f); AEGfxTriAdd( buttonSize.x, -buttonSize.y, 0xFF00FF00, 1.0f, 1.0f, buttonSize.x, buttonSize.y, 0xFF00FF00, 1.0f, 0.0f, -buttonSize.x, buttonSize.y, 0xFF00FF00, 0.0f, 0.0f); buttonMesh = AEGfxMeshEnd(); AE_ASSERT_MESG(buttonMesh, "Failed to create button!"); buttonTexture = AEGfxTextureLoad("Assets/NookButtonBright.png"); AE_ASSERT_MESG(buttonTexture, "Failed to create texture!"); /*mesh for text*/ AEGfxMeshStart(); AEGfxTriAdd( -titleSize.x, -titleSize.y, 0xFF00FF00, 0.0f, 1.0f / 6, titleSize.x, -titleSize.y, 0xFF00FF00, 1.0f, 1.0f / 6, -titleSize.x, titleSize.y, 0xFF00FF00, 0.0f, 0.0f); AEGfxTriAdd( titleSize.x, -titleSize.y, 0xFF00FF00, 1.0f, 1.0f / 6, titleSize.x, titleSize.y, 0xFF00FF00, 1.0f, 0.0f, -titleSize.x, titleSize.y, 0xFF00FF00, 0.0f, 0.0f); titleMesh = AEGfxMeshEnd(); AE_ASSERT_MESG(titleMesh, "Failed to create button!"); titleTexture = AEGfxTextureLoad("Assets/NookLogo.png"); AE_ASSERT_MESG(titleTexture, "Failed to create texture!"); titleOffsets[0].mX = 0.0f; titleOffsets[0].mY = 0.0f; titleOffsets[1].mX = 0.0f; titleOffsets[1].mY = 1.0f / 6; titleOffsets[2].mX = 0.0f; titleOffsets[2].mY = 2.0f / 6; titleOffsets[3].mX = 0.0f; titleOffsets[3].mY = 3.0f / 6; titleOffsets[4].mX = 0.0f; titleOffsets[4].mY = 4.0f / 6; titleOffsets[5].mX = 0.0f; titleOffsets[5].mY = 5.0f / 6; /*mesh for hover icon*/ iconMesh = createQuadMesh(iconSize.x, iconSize.y, 1.0f, 1.0f, "yarn"); iconTexture = AEGfxTextureLoad("Assets/TempHover.png"); AE_ASSERT_MESG(iconTexture, "Failed to create texture!"); /*mesh for text*/ fontMesh = createQuadMesh(15.0f, 15.0f, 1.0 / 5, 1.0f / 6, "alphabets"); fontTexture = AEGfxTextureLoad("Assets/NookFontSheet_alphabet.png"); AE_ASSERT_MESG(fontTexture, "Failed to create texture!"); fontOffsets[0].mX = 0.0f; fontOffsets[0].mY = 0.0f / 6; //A fontOffsets[1].mX = 1.0f / 5; fontOffsets[1].mY = 0.0f / 6; //B fontOffsets[2].mX = 2.0f / 5; fontOffsets[2].mY = 0.0f / 6; //C fontOffsets[3].mX = 3.0f / 5; fontOffsets[3].mY = 0.0f / 6; //D fontOffsets[4].mX = 4.0f / 5; fontOffsets[4].mY = 0.0f / 6; //E fontOffsets[5].mX = 0.0f; fontOffsets[5].mY = 1.0f / 6; //F fontOffsets[6].mX = 1.0f / 5; fontOffsets[6].mY = 1.0f / 6; //G fontOffsets[7].mX = 2.0f / 5; fontOffsets[7].mY = 1.0f / 6; //H fontOffsets[8].mX = 3.0f / 5; fontOffsets[8].mY = 1.0f / 6; //I fontOffsets[9].mX = 4.0f / 5; fontOffsets[9].mY = 1.0f / 6; //J fontOffsets[10].mX = 0.0f; fontOffsets[10].mY = 2.0f / 6; //K fontOffsets[11].mX = 1.0f / 5; fontOffsets[11].mY = 2.0f / 6; //L fontOffsets[12].mX = 2.0f / 5; fontOffsets[12].mY = 2.0f / 6; //M fontOffsets[13].mX = 3.0f / 5; fontOffsets[13].mY = 2.0f / 6; //N fontOffsets[14].mX = 4.0f / 5; fontOffsets[14].mY = 2.0f / 6; //O fontOffsets[15].mX = 0.0f; fontOffsets[15].mY = 3.0f / 6; //P fontOffsets[16].mX = 1.0f / 5; fontOffsets[16].mY = 3.0f / 6; //Q fontOffsets[17].mX = 2.0f / 5; fontOffsets[17].mY = 3.0f / 6; //R fontOffsets[18].mX = 3.0f / 5; fontOffsets[18].mY = 3.0f / 6; //S fontOffsets[19].mX = 4.0f / 5; fontOffsets[19].mY = 3.0f / 6; //T fontOffsets[20].mX = 0.0f; fontOffsets[20].mY = 4.0f / 6; //U fontOffsets[21].mX = 1.0f / 5; fontOffsets[21].mY = 4.0f / 6; //V fontOffsets[22].mX = 2.0f / 5; fontOffsets[22].mY = 4.0f / 6; //W fontOffsets[23].mX = 3.0f / 5; fontOffsets[23].mY = 4.0f / 6; //X fontOffsets[24].mX = 4.0f / 5; fontOffsets[24].mY = 4.0f / 6; //Y fontOffsets[25].mX = 0.0f; fontOffsets[25].mY = 5.0f / 6; //Z fontOffsets[26].mX = 1.0f / 5; fontOffsets[26].mY = 5.0f / 6; //blank fontOffsets[27].mX = 2.0f / 5; fontOffsets[27].mY = 5.0f / 6; //blank fontOffsets[28].mX = 3.0f / 5; fontOffsets[28].mY = 5.0f / 6; //blank fontOffsets[29].mX = 4.0f / 5; fontOffsets[29].mY = 5.0f / 6; //blank } void MenuInit() { AEGfxSetBackgroundColor(0.0f, 0.0f, 0.0f); AEGfxSetBlendMode(AE_GFX_BM_BLEND); AudioInit(); bgMusicTimer = 1638.0f; // Roughly 27 seconds } void MenuUpdate(float dt) { /* Tell the compiler that the 'dt' variable is unused. */ UNREFERENCED_PARAMETER(dt); /*play bg music*/ if (bgMusicTimer == 1638.0f) { playSoundAdvanced("Assets/Sounds/Level2Track.mp3", 0.1f); } /*reset time for bg music loop*/ if (bgMusicTimer == 0.0f) { bgMusicTimer = 1638.0f; } else { bgMusicTimer--; } /*draw background*/ AEGfxSetRenderMode(AE_GFX_RM_TEXTURE); AEGfxTextureSet(bgTexture, 0, 0); AEGfxSetTransparency(1.0f); AEGfxSetPosition(-250.0f, 0.0f); AEGfxMeshDraw(bgMesh, AE_GFX_MDM_TRIANGLES); //draw menu button AEGfxSetPosition(levelPos.x, levelPos.y); AEGfxTextureSet(buttonTexture, 0, 0); // no texture AEGfxSetTransparency(1.0f); AEGfxSetBlendColor(0.0f, 0.0f, 0.0, 0.0f); AEGfxMeshDraw(buttonMesh, AE_GFX_MDM_TRIANGLES); //draw replay button AEGfxSetPosition(creditsPos.x, creditsPos.y); AEGfxTextureSet(buttonTexture, 0, 0); // no texture AEGfxMeshDraw(buttonMesh, AE_GFX_MDM_TRIANGLES); //draw exit button AEGfxSetPosition(exitPos.x, exitPos.y); AEGfxTextureSet(buttonTexture, 0, 0); // no texture AEGfxMeshDraw(buttonMesh, AE_GFX_MDM_TRIANGLES); /*PLAY*/ AEGfxSetPosition(levelPos.x - 40.0f, levelPos.y); AEGfxTextureSet(fontTexture, fontOffsets[15].mX, fontOffsets[15].mY, 0.0f); AEGfxMeshDraw(fontMesh, AE_GFX_MDM_TRIANGLES); AEGfxSetPosition(levelPos.x - 15.0f, levelPos.y); AEGfxTextureSet(fontTexture, fontOffsets[11].mX, fontOffsets[11].mY, 0.0f); AEGfxMeshDraw(fontMesh, AE_GFX_MDM_TRIANGLES); AEGfxSetPosition(levelPos.x + 10.0f, levelPos.y); AEGfxTextureSet(fontTexture, fontOffsets[0].mX, fontOffsets[0].mY, 0.0f); AEGfxMeshDraw(fontMesh, AE_GFX_MDM_TRIANGLES); AEGfxSetPosition(levelPos.x + 35.0f, levelPos.y); AEGfxTextureSet(fontTexture, fontOffsets[24].mX, fontOffsets[24].mY, 0.0f); AEGfxMeshDraw(fontMesh, AE_GFX_MDM_TRIANGLES); /*PLAY - end*/ /*CREDITS*/ AEGfxSetPosition(creditsPos.x - 75.0f, creditsPos.y); AEGfxTextureSet(fontTexture, fontOffsets[2].mX, fontOffsets[2].mY, 0.0f); AEGfxMeshDraw(fontMesh, AE_GFX_MDM_TRIANGLES); AEGfxSetPosition(creditsPos.x - 45.0f, creditsPos.y); AEGfxTextureSet(fontTexture, fontOffsets[17].mX, fontOffsets[17].mY, 0.0f); AEGfxMeshDraw(fontMesh, AE_GFX_MDM_TRIANGLES); AEGfxSetPosition(creditsPos.x - 20.0f, creditsPos.y); AEGfxTextureSet(fontTexture, fontOffsets[4].mX, fontOffsets[4].mY, 0.0f); AEGfxMeshDraw(fontMesh, AE_GFX_MDM_TRIANGLES); AEGfxSetPosition(creditsPos.x + 5.0f, creditsPos.y); AEGfxTextureSet(fontTexture, fontOffsets[3].mX, fontOffsets[3].mY, 0.0f); AEGfxMeshDraw(fontMesh, AE_GFX_MDM_TRIANGLES); AEGfxSetPosition(creditsPos.x + 25.0f, creditsPos.y); AEGfxTextureSet(fontTexture, fontOffsets[8].mX, fontOffsets[8].mY, 0.0f); AEGfxMeshDraw(fontMesh, AE_GFX_MDM_TRIANGLES); AEGfxSetPosition(creditsPos.x + 47.0f, creditsPos.y); AEGfxTextureSet(fontTexture, fontOffsets[19].mX, fontOffsets[19].mY, 0.0f); AEGfxMeshDraw(fontMesh, AE_GFX_MDM_TRIANGLES); AEGfxSetPosition(creditsPos.x + 75.0f, creditsPos.y); AEGfxTextureSet(fontTexture, fontOffsets[18].mX, fontOffsets[18].mY, 0.0f); AEGfxMeshDraw(fontMesh, AE_GFX_MDM_TRIANGLES); /*CREDITS - end*/ /*QUIT*/ AEGfxSetPosition(exitPos.x - 40.0f, exitPos.y); AEGfxTextureSet(fontTexture, fontOffsets[16].mX, fontOffsets[16].mY, 0.0f); AEGfxMeshDraw(fontMesh, AE_GFX_MDM_TRIANGLES); AEGfxSetPosition(exitPos.x - 7.5f, exitPos.y); AEGfxTextureSet(fontTexture, fontOffsets[20].mX, fontOffsets[20].mY, 0.0f); AEGfxMeshDraw(fontMesh, AE_GFX_MDM_TRIANGLES); AEGfxSetPosition(exitPos.x + 17.5f, exitPos.y); AEGfxTextureSet(fontTexture, fontOffsets[8].mX, fontOffsets[8].mY, 0.0f); AEGfxMeshDraw(fontMesh, AE_GFX_MDM_TRIANGLES); AEGfxSetPosition(exitPos.x + 40.0f, exitPos.y); AEGfxTextureSet(fontTexture, fontOffsets[19].mX, fontOffsets[19].mY, 0.0f); AEGfxMeshDraw(fontMesh, AE_GFX_MDM_TRIANGLES); /*QUIT - end*/ animateFrames(¤tTitleOffset, &titleTime, 0.25f, dt); checkEndFrames(¤tTitleOffset, 6); currTitleFrame = currentTitleOffset; /*draw player*/ AEGfxSetRenderMode(AE_GFX_RM_TEXTURE); AEGfxSetPosition(titlePos.x, titlePos.y); AEGfxTextureSet(titleTexture, titleOffsets[currTitleFrame].mX, titleOffsets[currTitleFrame].mY); AEGfxSetTransparency(1.0f); AEGfxMeshDraw(titleMesh, AE_GFX_MDM_TRIANGLES); /*get the mouse position*/ AEInputGetCursorPosition(&mouseX, &mouseY); AEGfxConvertScreenCoordinatesToWorld(mouseX, mouseY, &mouseInWorldX, &mouseInWorldY); /*if demo level is hovered*/ if ((mouseInWorldX > (levelPos.x - buttonSize.x) && mouseInWorldX < (levelPos.x + buttonSize.x)) && (mouseInWorldY > (levelPos.y - buttonSize.y) && mouseInWorldY < (levelPos.y + buttonSize.y))) { // Hover texture AEGfxSetRenderMode(AE_GFX_RM_TEXTURE); AEGfxSetPosition(levelPos.x - 140.0f, levelPos.y); AEGfxTextureSet(iconTexture, 0.0f, 0.0f); AEGfxMeshDraw(iconMesh, AE_GFX_MDM_TRIANGLES); if (AEInputCheckTriggered(RI_MOUSE_LEFT_BUTTON_DOWN)) { GameStateManagerSetNextState(LevelSelect); } } /*if credits is hovered*/ if ((mouseInWorldX > (creditsPos.x - buttonSize.x) && mouseInWorldX < (creditsPos.x + buttonSize.x)) && (mouseInWorldY > (creditsPos.y - buttonSize.y) && mouseInWorldY < (creditsPos.y + buttonSize.y))) { // Hover texture AEGfxSetRenderMode(AE_GFX_RM_TEXTURE); AEGfxSetPosition(creditsPos.x - 140.0f, creditsPos.y); AEGfxTextureSet(iconTexture, 0.0f, 0.0f); AEGfxMeshDraw(iconMesh, AE_GFX_MDM_TRIANGLES); if (AEInputCheckTriggered(RI_MOUSE_LEFT_BUTTON_DOWN)) { GameStateManagerSetNextState(Credits); } } /*if exit is hovered*/ if ((mouseInWorldX > (exitPos.x - buttonSize.x) && mouseInWorldX < (exitPos.x + buttonSize.x)) && (mouseInWorldY > (exitPos.y - buttonSize.y) && mouseInWorldY < (exitPos.y + buttonSize.y))) { // Hover texture AEGfxSetRenderMode(AE_GFX_RM_TEXTURE); AEGfxSetPosition(exitPos.x - 140.0f, exitPos.y); AEGfxTextureSet(iconTexture, 0.0f, 0.0f); AEGfxMeshDraw(iconMesh, AE_GFX_MDM_TRIANGLES); if (AEInputCheckTriggered(RI_MOUSE_LEFT_BUTTON_DOWN)) { GameStateManagerSetNextState(GsQuit); } } } void MenuShutdown() { // Do not cleanup audio so music continues into credits and level select } void MenuUnload() { // Unload all textures. AEGfxTextureUnload(buttonTexture); AEGfxTextureUnload(titleTexture); AEGfxTextureUnload(bgTexture); AEGfxTextureUnload(fontTexture); AEGfxTextureUnload(iconTexture); // Free all meshes. AEGfxMeshFree(buttonMesh); AEGfxMeshFree(titleMesh); AEGfxMeshFree(bgMesh); AEGfxMeshFree(fontMesh); AEGfxMeshFree(iconMesh); }
@IBAction func loginPressed(_ sender: Any) { let email = emailTextField.text ?? "" let password = passwordTextField.text ?? "" var message = "" if email == "" { message = AppDelegate.selectedLanguage == "en" ? "Please enter email" : "الرجاء ادخال البريد الإلكتروني" } else if password == "" { message = AppDelegate.selectedLanguage == "en" ? "Please enter password" : "الرجاء ادخال كلمتك السريه" } else if !isValidEmail(email) { message = AppDelegate.selectedLanguage == "en" ? "please_enter_a_valid_email" : "الرجاء ادخال بريد إلكتروني صالح" } if message != "" { self.showToast(message: message) return } Auth.auth().signIn(withEmail: emailTextField.text ?? "", password: passwordTextField.text ?? "") { [weak self] authResult, error in if error != nil { let message = AppDelegate.selectedLanguage == "en" ? "Entered email or password is not correct" : "البريد الإلكتروني أو كلمة المرور المدخلة غير صحيحة" self?.showToast(message: message) return } self?.getUserData() } }
override func viewDidLoad() { super.viewDidLoad() setSwipeGesture() } func setSwipeGesture() { let swipeRightGesture = UISwipeGestureRecognizer(target: self, action: #selector(handleSwipe(_:))) if AppDelegate.selectedLanguage == "en" { swipeRightGesture.direction = .right } else { swipeRightGesture.direction = .left } view.addGestureRecognizer(swipeRightGesture) } @objc func handleSwipe(_ gesture: UISwipeGestureRecognizer) { if gesture.direction == .right && isOpen == false && AppDelegate.selectedLanguage == "en" { toggleSideMenu() } else if gesture.direction == .left && isOpen == false && AppDelegate.selectedLanguage == "ar" { toggleSideMenu() } } override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { if isOpen && AppDelegate.selectedLanguage == "en" { if let touch = touches.first { let location = touch.location(in: view) if location.x < 50 { // Adjust the threshold as needed toggleSideMenu() } } else if isOpen && AppDelegate.selectedLanguage == "ar" { if let touch = touches.first { let location = touch.location(in: view) if location.x > view.frame.size.width - 50 { // Adjust the threshold as needed toggleSideMenu() } } } } } func toggleSideMenu() { if AppDelegate.selectedLanguage == "en" { UIView.animate(withDuration: 0.15) { if self.isOpen { self.sideMenuView.frame.origin.x = -self.sideMenuView.frame.size.width self.isOpen = false } else { self.sideMenuView.frame.origin.x = 0 self.isOpen = true } } } else { UIView.animate(withDuration: 0.15) { if self.isOpen { self.sideMenuView.frame.origin.x = self.view.frame.size.width // Slide it to the right side self.isOpen = false } else { self.sideMenuView.frame.origin.x = self.view.frame.size.width - self.sideMenuView.frame.size.width // Slide it to the left side self.isOpen = true } } } } func shareLinkOnSocialMedia(link: URL, viewController: UIViewController) { let activityViewController = UIActivityViewController(activityItems: [link], applicationActivities: nil) activityViewController.popoverPresentationController?.sourceView = viewController.view viewController.present(activityViewController, animated: true, completion: nil) } @IBAction func menuPressed(_ sender: Any) { toggleSideMenu() } @IBAction func backMenuButton1Pressed(_ sender: Any) { toggleSideMenu() }
star
photo_camera
Mon Oct 09 2023 10:47:40 GMT+0000 (Coordinated Universal Time)
#ios #swift #menu #slide #slidemenu #slider #slideview
star
photo_camera
Mon Oct 09 2023 07:52:02 GMT+0000 (Coordinated Universal Time)
#ios #swift #menu #slide #slidemenu #slider #slideview