📄 lvtetrismenu.cpp
字号:
#include <avkon.hrh>
#include <eikenv.h>
#include <gdi.h>
#include <aknutils.h>
#include "LvtetrisMenu.h"
#include <lvtetris.mbg>
#include <lvtetris.rsg>
// Construct and destruct
// NewL()
CLvtetrisMenu* CLvtetrisMenu::NewL(CFbsBitGc* aFbsBitGc)
{
CLvtetrisMenu* self = new (ELeave) CLvtetrisMenu(aFbsBitGc);
CleanupStack::PushL(self);
self->ConstructL();
CleanupStack::Pop();
return self;
}
// ~
CLvtetrisMenu::~CLvtetrisMenu()
{
delete iMenubackgroud;
// delete iOptionsbackgroud;
// delete iHighScoresbackgroud;
// delete iHelpbackgroud;
iMenubackgroud = NULL;
// iOptionsbackgroud = NULL;
// iHighScoresbackgroud = NULL;
// iHelpbackgroud = NULL;
iOptionsLevelTxt.DeleteAll();
iOptionsLevelTxt.Reset();
iMenuItemTxt.DeleteAll();
iMenuItemTxt.Reset();
iOptionsRotateTxt.DeleteAll();
iOptionsRotateTxt.Reset();
iMenuHelpTxt.DeleteAll();
iMenuHelpTxt.Reset();
}
// CLvtetrisMenu
CLvtetrisMenu::CLvtetrisMenu(CFbsBitGc* aFbsBitGc) : iGc(aFbsBitGc)
{
iLevel = EOptionsItem_Level1;
iRotateDir = EOptionsItem_RotateDir1;
iOptionsLevelItem = iLevel;
iOptionsRotateItem = iRotateDir;
// iPrevOptionsItemLevel = iLevel;
/// iPrevOptionsItemRotateDir = iRotateDir;
iMenuItem = EMenuItem_Start;
iMenuState = EMenuState_Main;
iOptionsState = EOptionsState_Level;
iMenubackgroud = NULL;
// iOptionsbackgroud = NULL;
// iHighScoresbackgroud = NULL;
// iHelpbackgroud = NULL;
}
// ConsturctL
void CLvtetrisMenu::ConstructL()
{
_LIT(KPathName, "\\System\\Apps\\LvTetris\\Lvtetris.mbm");
iMenubackgroud = CEikonEnv::Static()->CreateBitmapL(KPathName, EMbmLvtetrisMenubackground);
// iOptionsbackgroud = CEikonEnv::Static()->CreateBitmapL(KPathName, EMbmLvtetrisOptionsbackground);
// iHighScoresbackgroud = CEikonEnv::Static()->CreateBitmapL(KPathName, EMbmLvtetrisHelpbackground);
// iHelpbackgroud = CEikonEnv::Static()->CreateBitmapL(KPathName, EMbmLvtetrisHighScoresbackground);
LoadResL(); // Load menu resouce and position
ResetPos();
}
void CLvtetrisMenu::LoadResL()
{
CEikonEnv* eikonEnv = CEikonEnv::Static();
iMenuItemTxt[EMenuItem_Start] = eikonEnv->AllocReadResourceL(R_MENUITEM_START);
iMenuItemTxt[EMenuItem_Options] = eikonEnv->AllocReadResourceL(R_MENUITEM_OPTIONS);
iMenuItemTxt[EMenuItem_HighScores] = eikonEnv->AllocReadResourceL(R_MENUITEM_HIGHSCORES);
iMenuItemTxt[EMenuItem_Help] = eikonEnv->AllocReadResourceL(R_MENUITEM_HELP);
iMenuItemTxt[EMenuItem_Quit] = eikonEnv->AllocReadResourceL(R_MENUITEM_QUIT);
iOptionsLevelTxt[EOptionsItem_Level1] = eikonEnv->AllocReadResourceL(R_OPTIONSITEM_LEVEL1);
iOptionsLevelTxt[EOptionsItem_Level2] = eikonEnv->AllocReadResourceL(R_OPTIONSITEM_LEVEL2);
iOptionsLevelTxt[EOptionsItem_Level3] = eikonEnv->AllocReadResourceL(R_OPTIONSITEM_LEVEL3);
iOptionsRotateTxt[EOptionsItem_RotateDir1] = eikonEnv->AllocReadResourceL(R_OPTIONSITEM_ROTATE1);
iOptionsRotateTxt[EOptionsItem_RotateDir2] = eikonEnv->AllocReadResourceL(R_OPTIONSITEM_ROTATE2);
iMenuHelpTxt[0] = eikonEnv->AllocReadResourceL(R_HELP_UPARROW);
iMenuHelpTxt[1] = eikonEnv->AllocReadResourceL(R_HELP_DOWNARROW);
iMenuHelpTxt[2] = eikonEnv->AllocReadResourceL(R_HELP_LEFTARROW);
iMenuHelpTxt[3] = eikonEnv->AllocReadResourceL(R_HELP_RIGHTARROW);
iMenuHelpTxt[4] = eikonEnv->AllocReadResourceL(R_HELP_NUMKEY0);
iMenuHelpTxt[5] = eikonEnv->AllocReadResourceL(R_HELP_RIGHTSOFTKEY);
iMenuItemPos[EMenuItem_Start] = TPoint(6, 25);
iMenuItemPos[EMenuItem_Options] = TPoint(10, 53);
iMenuItemPos[EMenuItem_HighScores] = TPoint(13, 120);
iMenuItemPos[EMenuItem_Help] = TPoint(88, 151);
iMenuItemPos[EMenuItem_Quit] = TPoint(118, 172);
iOptionsLevelPos[EOptionsItem_Level1] = TPoint(3, 55);
iOptionsLevelPos[EOptionsItem_Level2] = TPoint(3, 55);
iOptionsLevelPos[EOptionsItem_Level3] = TPoint(3, 55);
iOptionsRotatePos[EOptionsItem_RotateDir1] = TPoint(3, 85);
iOptionsRotatePos[EOptionsItem_RotateDir2] = TPoint(3, 85);
iMenuHelpPos[0] = TPoint(3, 40);
iMenuHelpPos[1] = TPoint(3, 60);
iMenuHelpPos[2] = TPoint(3, 80);
iMenuHelpPos[3] = TPoint(3, 100);
iMenuHelpPos[4] = TPoint(3, 120);
iMenuHelpPos[5] = TPoint(3, 140);
}
void CLvtetrisMenu::ResetPos()
{
}
TGameStatus CLvtetrisMenu::Command(TInt aCommand)
{
if (iMenuState == EMenuState_Main)
{
switch (aCommand)
{
case EKeyUpArrow : // up
if (iMenuItem > 0)
{
iMenuItem--;
}
else
iMenuItem = EMenuItem_Quit;
break;
case EKeyDownArrow : // down
if (iMenuItem < EMenuItem_Quit)
{
iMenuItem++;
}
else
iMenuItem = EMenuItem_Start;
break;
case EKeyDevice3: //ok
if (iMenuItem == EMenuItem_Start)
{
return GAMERUNNING;
}
else if (iMenuItem == EMenuItem_Options)
{
iMenuState = EMenuState_Options;
iOptionsLevelItem = iLevel;
iOptionsRotateItem = iRotateDir;
}
else if (iMenuItem == EMenuItem_HighScores)
{
iMenuState = EMenuState_HighScores;
}
else if (iMenuItem == EMenuItem_Help)
{
iMenuState = EMenuState_Help;
}
else if (iMenuItem == EMenuItem_Quit)
{
return GAMEQUITING;
}
break;
default:
break;
}
}
else if (iMenuState == EMenuState_Options)
{
switch (aCommand)
{
case EKeyUpArrow : // up
if (iOptionsState == EOptionsState_Level)
{
// iOptionsRotateItem = iPrevOptionsItemRotateDir;
iOptionsState = EOptionsState_RotateDir;
}
else if (iOptionsState == EOptionsState_RotateDir)
{
// iOptionsLevelItem = iPrevOptionsItemLevel;
iOptionsState = EOptionsState_Level;
}
break;
case EKeyDownArrow : // down
if (iOptionsState == EOptionsState_Level)
{
// iOptionsRotateItem = iPrevOptionsItemRotateDir;
iOptionsState = EOptionsState_RotateDir;
}
else if (iOptionsState == EOptionsState_RotateDir)
{
// iOptionsLevelItem = iPrevOptionsItemLevel;
iOptionsState = EOptionsState_Level;
}
break;
case EKeyLeftArrow : //left
if (iOptionsState == EOptionsState_Level)
{
if(iOptionsLevelItem == EOptionsItem_Level1)
{
iOptionsLevelItem = EOptionsItem_Level3;
}
else if(iOptionsLevelItem == EOptionsItem_Level2)
{
iOptionsLevelItem = EOptionsItem_Level1;
}
else if(iOptionsLevelItem == EOptionsItem_Level3)
{
iOptionsLevelItem = EOptionsItem_Level2;
}
// iPrevOptionsItemLevel = iOptionsLevelItem;
}
else if (iOptionsState == EOptionsState_RotateDir)
{
if(iOptionsRotateItem == EOptionsItem_RotateDir1)
{
iOptionsRotateItem = EOptionsItem_RotateDir2;
}
else if(iOptionsRotateItem == EOptionsItem_RotateDir2)
{
iOptionsRotateItem = EOptionsItem_RotateDir1;
}
// iPrevOptionsItemRotateDir = iOptionsItem;
}
break;
case EKeyRightArrow : //Rright
if (iOptionsState == EOptionsState_Level)
{
if(iOptionsLevelItem == EOptionsItem_Level1)
{
iOptionsLevelItem = EOptionsItem_Level2;
}
else if(iOptionsLevelItem == EOptionsItem_Level2)
{
iOptionsLevelItem = EOptionsItem_Level3;
}
else if(iOptionsLevelItem == EOptionsItem_Level3)
{
iOptionsLevelItem = EOptionsItem_Level1;
}
// iPrevOptionsItemLevel = iOptionsItem;
}
else if (iOptionsState == EOptionsState_RotateDir)
{
if(iOptionsRotateItem == EOptionsItem_RotateDir1)
{
iOptionsRotateItem = EOptionsItem_RotateDir2;
}
else if(iOptionsRotateItem == EOptionsItem_RotateDir2)
{
iOptionsRotateItem = EOptionsItem_RotateDir1;
}
// iPrevOptionsItemRotateDir = iOptionsItem;
}
break;
case EKeyDevice3: //ok and quit options menu
iMenuState = EMenuState_Main;
iLevel = iOptionsLevelItem;
iRotateDir = iOptionsRotateItem;
break;
case EKeyDevice1: //back
iMenuState = EMenuState_Main;
break;
default:
break;
}
}
else if (iMenuState == EMenuState_HighScores)
{
switch (aCommand)
{
case EKeyDevice1:
case EKeyDevice3: //ok and quit options menu
iMenuState = EMenuState_Main;
default:
break;
}
}
else if (iMenuState == EMenuState_Help)
{
switch (aCommand)
{
case EKeyDevice1:
case EKeyDevice3: //ok and quit options menu
iMenuState = EMenuState_Main;
default:
break;
}
}
else if (iMenuState == EMenuState_Quit)
{
return GAMEQUITING;
}
return GAMEMENUING;
}
void CLvtetrisMenu::DrawMenu()
{
iGc->Clear();
switch (iMenuState)
{
case EMenuState_Main:
iGc->BitBlt(TPoint(0, 0), iMenubackgroud);//draw menu background
_LIT(KMenuFontName,"Roman");
CFont* menuFont;
TFontSpec menuFontSpec(KMenuFontName, 25);
menuFontSpec.iFontStyle.SetStrokeWeight(EStrokeWeightBold);
CBitmapDevice* MenuscreenDevice=CEikonEnv::Static()->ScreenDevice();
MenuscreenDevice->GetNearestFontInPixels(menuFont,menuFontSpec);
iGc->UseFont(menuFont);
for (int i=0; i < EMenuItem_None; i++)
{
iGc->SetPenColor(TRgb(20, 20, 120));
iGc->DrawText(*iMenuItemTxt.At(i), iMenuItemPos[i]);
}
iGc->SetPenColor(KRgbWhite);
iGc->DrawText(*iMenuItemTxt.At(iMenuItem), iMenuItemPos[iMenuItem]);
// delete created Font
iGc->DiscardFont();
MenuscreenDevice->ReleaseFont(menuFont);
break;
case EMenuState_Options:
iGc->SetBrushStyle(CFbsBitGc::ESolidBrush);
iGc->SetBrushColor(TRgb(60, 60, 123));
// iGc->BitBlt(TPoint(0, 0), iOptionsbackgroud);//draw options background
_LIT(KOptionsFontName,"Roman");
CFont* optionstitleFont;
CFont* optionsFont;
TFontSpec optionsFontSpec(KOptionsFontName, 25);
optionsFontSpec.iFontStyle.SetStrokeWeight(EStrokeWeightBold);
CBitmapDevice* OptionsscreenDevice=CEikonEnv::Static()->ScreenDevice();
OptionsscreenDevice->GetNearestFontInPixels(optionstitleFont,optionsFontSpec);
iGc->UseFont(optionstitleFont);
iGc->SetPenColor(TRgb(90, 60, 255));
iGc->DrawText(*iMenuItemTxt.At(EMenuItem_Options),TPoint((176 - optionstitleFont->TextWidthInPixels(*iMenuItemTxt.At(EMenuItem_Options)))/2, 15));
iGc->DiscardFont();
optionsFontSpec.iHeight = 6;
optionsFontSpec.iFontStyle.SetStrokeWeight(EStrokeWeightNormal);
OptionsscreenDevice->GetNearestFontInPixels(optionsFont,optionsFontSpec);
iGc->UseFont(optionsFont);
if (iOptionsState == EOptionsState_Level)
{
iGc->SetPenColor(TRgb(20, 20, 120));
iGc->DrawText(*iOptionsRotateTxt.At(iOptionsRotateItem), iOptionsRotatePos[iOptionsRotateItem]);
iGc->SetPenColor(KRgbWhite);
iGc->DrawText(*iOptionsLevelTxt.At(iOptionsLevelItem), iOptionsLevelPos[iOptionsLevelItem]);
}
else if (iOptionsState == EOptionsState_RotateDir )
{
iGc->SetPenColor(TRgb(20, 20, 120));
iGc->DrawText(*iOptionsLevelTxt.At(iOptionsLevelItem), iOptionsLevelPos[iOptionsLevelItem]);
iGc->SetPenColor(KRgbWhite);
iGc->DrawText(*iOptionsRotateTxt.At(iOptionsRotateItem), iOptionsRotatePos[iOptionsRotateItem]);
}
// delete created Font
iGc->DiscardFont();
OptionsscreenDevice->ReleaseFont(optionsFont);
break;
case EMenuState_HighScores:
iGc->SetBrushStyle(CFbsBitGc::ESolidBrush);
iGc->SetBrushColor(TRgb(90, 90, 255));
// iGc->BitBlt(TPoint(0, 0), iHighScoresbackgroud);//draw options background
#if 1
_LIT(KHighScoresFontName,"Roman");
CFont* highscoresFont;
TFontSpec highscoresFontSpec(KHighScoresFontName, 25);
highscoresFontSpec.iFontStyle.SetStrokeWeight(EStrokeWeightNormal);
CBitmapDevice* highscoresscreenDevice=CEikonEnv::Static()->ScreenDevice();
highscoresscreenDevice->GetNearestFontInPixels(highscoresFont,highscoresFontSpec);
iGc->UseFont(highscoresFont);
iGc->SetPenColor(TRgb(60, 60, 123));
iGc->DrawText(*iMenuItemTxt.At(EMenuItem_HighScores),TPoint((176 - highscoresFont->TextWidthInPixels(*iMenuItemTxt.At(EMenuItem_HighScores)))/2, 15));
// delete created Font
iGc->DiscardFont();
highscoresscreenDevice->ReleaseFont(highscoresFont);
#endif
break;
case EMenuState_Help:
// iGc->BitBlt(TPoint(0, 0), iHelpbackgroud);//draw highscores background
iGc->SetBrushStyle(CFbsBitGc::ESolidBrush);
iGc->SetBrushColor(TRgb(100, 100, 234));
_LIT(KhelpFontName,"Roman");
CFont* helpFont;
CFont* helptitleFont;
TFontSpec helpFontSpec(KhelpFontName, 25);
helpFontSpec.iFontStyle.SetStrokeWeight(EStrokeWeightBold);
CBitmapDevice* helpscreenDevice=CEikonEnv::Static()->ScreenDevice();
helpscreenDevice->GetNearestFontInPixels(helptitleFont,helpFontSpec);
iGc->UseFont(helptitleFont);
iGc->SetPenColor(TRgb(60, 60, 123));
iGc->DrawText(*iMenuItemTxt.At(EMenuItem_Help),TPoint((176 - helptitleFont->TextWidthInPixels(*iMenuItemTxt.At(EMenuItem_Help)))/2, 15));
iGc->DiscardFont();
helpFontSpec.iHeight = 8;
helpFontSpec.iFontStyle.SetStrokeWeight(EStrokeWeightNormal);
helpscreenDevice->GetNearestFontInPixels(helpFont,helpFontSpec);
iGc->UseFont(helpFont);
iGc->SetPenColor(TRgb(20, 20, 120));
for(int i=0; i<6; i++)
{
iGc->DrawText(*iMenuHelpTxt.At(i), iMenuHelpPos[i]);
}
// delete created Font
iGc->DiscardFont();
helpscreenDevice->ReleaseFont(helpFont);
break;
default:
break;
}
}
TInt8 CLvtetrisMenu::Level()
{
return iLevel;
}
TInt8 CLvtetrisMenu::RotateDir()
{
return iRotateDir;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -