⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lvtetrismenu.cpp

📁 俄罗斯方块
💻 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 + -