// --------------------------------------------------------------------------- // 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); }
Preview:
downloadDownload PNG
downloadDownload JPEG
downloadDownload SVG
Tip: You can change the style, width & colours of the snippet with the inspect tool before clicking Download!
Click to optimize width for Twitter