// ---------------------------------------------------------------------------
// 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