////////////////////////////////////////////////////////////////////////
// GameMenuState.cpp: implementation of the CGameMenuState class.
//
////////////////////////////////////////////////////////////////////////
#include "GameMenuState.h"
#include "GameStateLoad01.h"
#include "GameCreditsState.h"
#include "GameControlsMenuState.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
// Statica variable instanstiation
// singleton
CGameMenuState CGameMenuState::m_MenuState;
//! Default constructor
CGameMenuState::CGameMenuState() {}
//! Default destructor
CGameMenuState::~CGameMenuState() {}
//! Keyboard event handler passed down by CGameManager
void CGameMenuState::KeyboardEvent(CGameManager* pManager)
{
// key presses
if (pManager->getKey(irr::KEY_ESCAPE))
pManager->getDevice()->closeDevice(); // should call pManager clear()
}
//! Mouse event handler passed down by CGameManager
void CGameMenuState::MouseEvent(CGameManager* pManager)
{
// mouse clicks
if (pManager->getMouse() == EMIE_LMOUSE_LEFT_UP && m_iDebounce > 0)
{
m_iDebounce = 0;
MouseClicked(pManager);
}
if (pManager->getMouse() == EMIE_RMOUSE_PRESSED_DOWN || pManager->getMouse() == EMIE_LMOUSE_PRESSED_DOWN )
m_iDebounce++;
}
CGameMenuState* CGameMenuState::Instance()
{
return ( &m_MenuState );
}
//! Init resources needed for the CMenuState state, menu buttons etc
// Enter state function
void CGameMenuState::Init(CGameManager * pManager)
{
// initialize from parent
CGameState::Init(pManager);
LoadMouseCursor(pManager);
m_iDebounce = 0;
// load background image
m_pIntroImage = pManager->getGUIEnvironment()->addImage(irr::core::rect< irr::s32 >(256, 50, 790, 330));
m_pIntroImage->setImage(pManager->getDriver()->getTexture("media/menu_image.jpg"));
// Play button(s)
m_pPlayButtonHighImage = pManager->getGUIEnvironment()->
addImage(irr::core::rect< irr::s32>(256,448,256+139,448+27));
m_pPlayButtonHighImage->setImage(pManager->getDriver()->getTexture("media/buttons/play_on.png"));
m_pPlayButtonImage = pManager->getGUIEnvironment()->
addImage(irr::core::rect< irr::s32 >(256,448,256+139,448+27));
m_pPlayButtonImage->setImage(pManager->getDriver()->getTexture("media/buttons/play.png"));
m_pPlayButtonImage->setUseAlphaChannel(true);
// Options button
m_pOptionsButtonHighImage = pManager->getGUIEnvironment()->
addImage(irr::core::rect< irr::s32 >(256,475,256+139,475+27));
m_pOptionsButtonHighImage->setImage(pManager->getDriver()->getTexture("media/buttons/controls_on.png"));
m_pOptionsButtonImage = pManager->getGUIEnvironment()->
addImage(irr::core::rect< irr::s32 >(256,475,256+139,475+27));
m_pOptionsButtonImage->setImage(pManager->getDriver()->getTexture("media/buttons/controls.png"));
m_pOptionsButtonImage->setUseAlphaChannel(true);
// Credits button
m_pCreditsButtonHighImage = pManager->getGUIEnvironment()->
addImage(irr::core::rect< irr::s32 >(256,502,256+139,502+27));
m_pCreditsButtonHighImage->setImage(pManager->getDriver()->getTexture("media/buttons/credits_on.png"));
m_pCreditsButtonImage = pManager->getGUIEnvironment()->
addImage(irr::core::rect< irr::s32 >(256,502,256+139,502+27));
m_pCreditsButtonImage->setImage(pManager->getDriver()->getTexture("media/buttons/credits.png"));
m_pCreditsButtonImage->setUseAlphaChannel(true);
// Exit button
m_pExitButtonHighImage = pManager->getGUIEnvironment()->
addImage(irr::core::rect< irr::s32 >(256,529,256+139,529+27));
m_pExitButtonHighImage->setImage(pManager->getDriver()->getTexture("media/buttons/exit_on.png"));
m_pExitButtonImage = pManager->getGUIEnvironment()->
addImage(irr::core::rect< irr::s32 >(256,529,256+139,529+27));
m_pExitButtonImage->setImage(pManager->getDriver()->getTexture("media/buttons/exit.png"));
m_pExitButtonImage->setUseAlphaChannel(true);
CGameState::FadeInOut(pManager);
}
//! Update, game loop for intro state
// Update state function
void CGameMenuState::Update(CGameManager * pManager)
{
pManager->getDriver()->beginScene(true, true, video::SColor(0,0,0,0));
pManager->getGUIEnvironment()->drawAll();
MouseOver(pManager);
DisplayMouse(pManager);
pManager->getDriver()->endScene();
}
// Exit state function
void CGameMenuState::Clear(CGameManager * pManager)
{
// tidy up code here
if (m_pIntroImage)
m_pIntroImage->remove();
if (m_pPlayButtonImage)
m_pPlayButtonImage->remove();
if (m_pPlayButtonHighImage)
m_pPlayButtonHighImage->remove();
if (m_pOptionsButtonImage)
m_pOptionsButtonImage->remove();
if (m_pOptionsButtonHighImage)
m_pOptionsButtonHighImage->remove();
if (m_pCreditsButtonImage)
m_pCreditsButtonImage->remove();
if (m_pCreditsButtonHighImage)
m_pCreditsButtonHighImage->remove();
if (m_pExitButtonImage)
m_pExitButtonImage->remove();
if (m_pExitButtonHighImage)
m_pExitButtonHighImage->remove();
}
//! Mouse clicked, check to see if over button
void CGameMenuState::MouseClicked(CGameManager * pManager)
{
// get mouse position2d<s32>
m_MousePos = pManager->getDevice()->getCursorControl()->getPosition();
// check if over Exit button
if (m_pExitButtonImage->getRelativePosition().isPointInside(m_MousePos))
pManager->getDevice()->closeDevice(); // should call pManager clear()
else if (m_pOptionsButtonImage->getRelativePosition().isPointInside(m_MousePos))
ChangeState(pManager, CGameControlsMenuState::Instance());
// check if over Credits button
else if (m_pCreditsButtonImage->getRelativePosition().isPointInside(m_MousePos))
ChangeState(pManager, CGameCreditsState::Instance());
// check if over Play button
else if (m_pPlayButtonImage->getRelativePosition().isPointInside(m_MousePos))
ChangeState(pManager, CGameStateLoad01::Instance());
}
//! Mouse over, check to see if over button to highlight
bool CGameMenuState::MouseOver(CGameManager * pManager)
{
ResetButtons(pManager);
// get mouse position2d<s32>
m_MousePos = pManager->getDevice()->getCursorControl()->getPosition();
// check if over Play button
if (m_pPlayButtonImage->getRelativePosition().isPointInside(m_MousePos))
{
m_pPlayButtonHighImage->setVisible(true);
m_pPlayButtonImage->setVisible(false);
return true;
}
// check if over Options button
if (m_pOptionsButtonImage->getRelativePosition().isPointInside(m_MousePos))
{
m_pOptionsButtonHighImage->setVisible(true);
m_pOptionsButtonImage->setVisible(false);
return true;
}
// check if over Credits button
if (m_pCreditsButtonImage->getRelativePosition().isPointInside(m_MousePos))
{
m_pCreditsButtonHighImage->setVisible(true);
m_pCreditsButtonImage->setVisible(false);
return true;
}
// check if over Exit button
if (m_pExitButtonImage->getRelativePosition().isPointInside(m_MousePos))
{
m_pExitButtonHighImage->setVisible(true);
m_pExitButtonImage->setVisible(false);
return true;
}
return false;
}
//! reset buttons state
void CGameMenuState::ResetButtons(CGameManager * pManager)
{
// set highlighted button to off
m_pPlayButtonHighImage->setVisible(false);
m_pOptionsButtonHighImage->setVisible(false);
m_pCreditsButtonHighImage->setVisible(false);
m_pExitButtonHighImage->setVisible(false);
// set normal buttons on
m_pPlayButtonImage->setVisible(true);
m_pOptionsButtonImage->setVisible(true);
m_pCreditsButtonImage->setVisible(true);
m_pExitButtonImage->setVisible(true);
}
//! Display mouse cursor in center of screen
void CGameMenuState::DisplayMouse(CGameManager* pManager)
{
if(!m_bMouseMode)
{
m_MousePos = pManager->getDevice()->getCursorControl()->getPosition();
pManager->getDriver()->draw2DImage(m_pMouseCursor, core::position2d<s32>(m_MousePos.X,
m_MousePos.Y), core::rect<s32>(0,0,m_pMouseCursor->getSize().Height,
m_pMouseCursor- >getSize().Width), 0, video::SColor(255,255,255,255), true);
}
}
//! Load mouse cursor
void CGameMenuState::LoadMouseCursor(CGameManager* pManager)
{
m_pMouseCursor = pManager->getDriver()->getTexture("media/crosshair2.png");
pManager->getDriver()->makeColorKeyTexture(m_pMouseCursor,core::position2d<s32>(0,0));
pManager->getDevice()->getCursorControl()->setVisible(false);
}