www.pudn.com > Tetris.rar > CMenu.cpp


#include  
#include  
#include  
#include  
 
#include "CMenu.h" 
#include  
#include  
 
 
// Construct and destruct 
 
// NewL() 
CMenu* CMenu::NewL(CFbsBitGc* aFbsBitGc) 
{ 
	CMenu* self = new (ELeave) CMenu(aFbsBitGc); 
	CleanupStack::PushL(self); 
 
	self->ConstructL(); 
 
	CleanupStack::Pop(); 
 
	return self; 
} 
 
// ~ 
CMenu::~CMenu() 
{ 
	delete iBitmap; 
 
	iSettingStr.DeleteAll(); 
//	iSettingStr.Reset(); 
	 
	// cannot delete twice 
	iMenuItemTxt.At(EOptions_RotateDir) = NULL; 
	iMenuItemTxt.At(ESound_Sounds)	= NULL; 
	iMenuItemTxt.At(ESound_Music)	= NULL; 
	iMenuItemTxt.At(ESound_Volume)	= NULL; 
	iMenuItemTxt.At(EDifficulty_StartLines)	= NULL; 
	iMenuItemTxt.At(EDifficulty_AddBrick)	= NULL; 
	iMenuItemTxt.At(EDifficulty_Done)		= NULL; 
	iMenuItemTxt.At(EPause_Sound)	= NULL; 
	 
 
	iMenuItemTxt.DeleteAll(); 
	//iMenuItemTxt.Reset(); 
} 
 
 
// CMenu 
CMenu::CMenu(CFbsBitGc* aFbsBitGc) : iGc(aFbsBitGc) 
{} 
 
// ConsturctL 
void CMenu::ConstructL() 
{ 
	//iLabel = new (ELeave) CEikLabel; 
	//iLabel->SetTextL(_L("ahhadkjdjfkldsajfkijoewijfioewjf")); 
	_LIT(KPathName, "\\System\\Apps\\Tetris\\images.mbm"); 
	iBitmap = CEikonEnv::Static()->CreateBitmapL(KPathName, EMbmImagesLogo); 
 
	LoadResL();		// Load menu resouce and position 
 
	ResetPos(); 
} 
 
/////////////////////////////////////////////////////////////////////////////// 
// Other Method 
 
// Draw 
void CMenu::Draw() 
{ 
	// draw background 
	DrawBg(); 
 
	if(iMenuState == ECreditPage) 
	{	 
		//iLabel->DrawNow(); 
		const CFont* font; 
		font = CEikonEnv::Static()->TitleFont(); 
		iGc->UseFont(font); 
		 
		iGc->DrawText(_L("Tetris v1.2"), TPoint(60, 30)); 
		iGc->DrawText(_L("It's my #1 Symbian game, so"), TPoint(20, 60)); 
		iGc->DrawText(_L("it's written 100% from scratch!"), TPoint(10, 80)); 
		iGc->DrawText(_L("Suggestions, comments, or bug"), TPoint(10, 100)); 
		iGc->DrawText(_L("reports are welcome!"), TPoint(10, 120)); 
		iGc->DrawText(_L("My email : cofd.eric@163.com"), TPoint(10, 140)); 
		iGc->DrawText(_L("Thank you for playing!"), TPoint(10, 160)); 
		iGc->DrawText(_L("CArt Studio 2005"), TPoint(45, 200)); 
 
		iGc->DiscardFont(); 
		return; 
	} 
	if(iMenuState == EHighScorePage) 
		return;			// don't draw here 
 
	// use default 
	if(iMenuState == ENonePage) 
	{ 
		iMenuState = EMainPage; 
		iMenuItem  = EStart; 
		return; 
	} 
 
	// Get an alternative font 
	_LIT(KMyFontName,"Roman"); 
	CFont* myFont; 
	TFontSpec myFontSpec(KMyFontName, 1); 
 
	myFontSpec.iFontStyle.SetStrokeWeight(EStrokeWeightBold); 
 
	CBitmapDevice* screenDevice=CEikonEnv::Static()->ScreenDevice(); 
	screenDevice->GetNearestFontInTwips(myFont,myFontSpec); 
	iGc->UseFont(myFont); 
	 
	// draw menu page 
	DrawPage(iMenuPagePos[iMenuState].iX, iMenuPagePos[iMenuState].iY); 
 
	// Draw the Blink frame and white selected txt 
	iGc->SetPenColor(TRgb(250, 250, 250)); 
	 
	iBlink++; 
	 
	if((iBlink >= 2 && iBlink <= 5) || (iBlink >= 18 && iBlink <= 21))  
		iGc->SetPenColor(TRgb(220, 220, 220));  
	else if((iBlink >= 6 && iBlink <= 9) || (iBlink >= 14 && iBlink <= 17)) 
		iGc->SetPenColor(TRgb(180, 180, 180));  
	else if(iBlink >= 10 && iBlink <= 13) 
		iGc->SetPenColor(TRgb(120, 120, 120));	 
	else if(iBlink == 22) 
		iBlink = 0; 
 
	 
	// dont't modify Frame's positon 
	SetFrame(iMenuItem); 
	if(iSelect) 
	{ 
		iGc->SetBrushColor(TRgb(90, 90, 255)); 
		iGc->DrawPolygon(iPointList, 12, CGraphicsContext::EAlternate); 
		iSelect = 0; 
	} 
	iGc->DrawPolyLineNoEndPoint(iPointList, 12); 
	 
	// highlight the text 
	iGc->SetPenColor(KRgbWhite); 
	iGc->DrawText(*iMenuItemTxt.At(iMenuItem), TRect(iPointList[2]+TPoint(1,1), iPointList[8]-TPoint(1,1)), 15, CGraphicsContext::ECenter, 0); 
	 
	// delete created Font 
	iGc->DiscardFont(); 
	screenDevice->ReleaseFont(myFont); 
} 
 
// DrawBg() 
void CMenu::DrawBg() 
{ 
	iGc->SetBrushStyle(CFbsBitGc::ESolidBrush); 
	 
	iGc->SetFadingParameters(80, 255); 
	iGc->SetFaded(1); 
	 
	iGc->SetBrushColor(KRgbBlack); 
	iGc->Clear(); 
 
	iGc->BitBlt(iPos + TPoint(0, 69), iBitmap); 
	iGc->BitBlt(iPos + TPoint(0, 208), iBitmap); 
 
	iGc->BitBlt(iPos + TPoint(185, 69), iBitmap); 
	iGc->BitBlt(iPos + TPoint(185, 208), iBitmap); 
 
	iPos -= TPoint(4, 3); 
	if(iPos.iY <= -139) 
		iPos = TPoint(0, 0); 
	 
	iGc->SetFaded(0); 
} 
 
// DrawPage() 
void CMenu::DrawPage(TInt aItemFrom, TInt aItemTo) 
{ 
	if(aItemFrom == ENoneItem) 
		return; 
	TInt i; 
	// draw the frame 
	iGc->SetBrushColor(TRgb(45, 45, 130)); 
	iGc->SetPenColor(TRgb(20, 20, 120)); 
 
	for(i = aItemFrom; i <= aItemTo; i++) 
	{ 
		SetFrameDynamic(i); 
		iGc->DrawPolygon(iPointList, 12, CGraphicsContext::EAlternate); 
	} 
	iSpeed += 5; 
	// draw the Txt 
	iGc->SetPenColor(KRgbGray); 
	for(i = aItemFrom; i <= aItemTo; i++) 
	{	 
		SetFrame(i); 
		iGc->DrawText(*iMenuItemTxt.At(i), TRect(iPointList[2]+TPoint(1,1), iPointList[8]-TPoint(1,1)), 15, CGraphicsContext::ECenter, 0); 
	} 
} 
 
 
// Command 
// @return 1 denote quit the game 
// @return 2 dentoe start the game 
TInt32 CMenu::Command(TInt aCommand) 
{ 
	switch(aCommand) 
	{ 
		case 'q' : 
		{ 
			if(iMenuState == EMainPage || iMenuState == EPausePage) 
				break; 
			iMenuState	= iPrevPage; 
			ResetPos(); 
			iMenuItem	= iPrevItem; 
		}return 5; 
 
		case EStdKeyDevice5: 
		case '5': 
		case 63557: 
		{ 
			switch(iMenuItem) 
			{ 
				case EQuit: 
					return 1;						// Quit 
				case EStart : 
				{ 
					iPrevPage = EPausePage; 
					iMenuState = ENonePage; 
					iPrevItem = EPause_Continue;						 
				}return 2;							// Start the game 
				case EPause_Continue: 
				{ 
					iMenuState = ENonePage; 
				}return 3;						// Continue the game 
				case EOptions_Back: 
				{ 
					iMenuState = EMainPage; 
					ResetPos(); 
					iMenuItem	= EStart;	 
				}return 11;							// set rotation 
				case ESound_Done : 
				{ 
					iMenuState = iPrevPage; 
					ResetPos(); 
					iMenuItem = iPrevItem;						 
				}return 12;							// set Sound 
				case EDifficulty_Done : 
				{	 
					iMenuState = iPrevPage; 
					ResetPos(); 
					iMenuItem = iPrevItem;					 
				}return 13;							// set Difficulty 
 
				case EOptions: 
				{ 
					iPrevPage = EMainPage; 
					iMenuState	= EOptionsPage; 
					ResetPos(); 
					iPrevItem	= iMenuItem; 
					iMenuItem	= EOptions_Sound; 
				}break; 
				case ECredit: 
				{ 
					iPrevPage	= EMainPage; 
					iMenuState	= ECreditPage; 
					iPrevItem	= iMenuItem; 
					iMenuItem	= -1; 
				}break;; 
				case EHighScore: 
				{ 
					iPrevPage	= EMainPage; 
					iMenuState	= EHighScorePage; 
					iPrevItem	= iMenuItem; 
					iMenuItem	= -1;	 
				}return 4; 
				 
				// Options 
				case EOptions_Sound: 
				{ 
					iPrevPage = EOptionsPage; 
					iMenuState = ESoundPage; 
					ResetPos(); 
					iPrevItem = iMenuItem; 
					iMenuItem = ESound_Sounds; 
				}break; 
				case EOptions_Difficulty: 
				{ 
					iPrevPage = EOptionsPage; 
					iMenuState = EDifficultyPage; 
					ResetPos(); 
					iPrevItem = iMenuItem; 
					iMenuItem = EDifficulty_StartLines; 
				}break; 
				 
				// Pause page 
				case EPause_Sound: 
				{ 
					iPrevPage = EPausePage; 
					iMenuState = ESoundPage; 
					ResetPos(); 
					iPrevItem = iMenuItem; 
					iMenuItem = ESound_Sounds; 
				}break; 
				case EPause_EndGame: 
				{ 
					iMenuState = EMainPage;		// return to main page 
					ResetPos(); 
					iMenuItem	= EStart; 
				}break; 
				 
				case EOptions_RotateDir: 
				case ESound_Sounds : 
				case ESound_Music : 
				case ESound_Volume : 
				case EDifficulty_StartLines : 
				case EDifficulty_AddBrick : 
				{}break; 
 
				default: 
				{ 
					iMenuState	= iPrevPage; 
					ResetPos(); 
					iMenuItem	= iPrevItem; 
				}break; 
			} 
		}return 5;	 
	 
		case EKeyUpArrow :								// UP 
		case '2' : 
		{ 
			iMenuItem = iMenuItem <= iMenuPagePos[iMenuState].iX ? iMenuPagePos[iMenuState].iY : --iMenuItem;		 
			// select the menu item 
			iSelect = 1;	 
		}return 0; 
 
		case EKeyDownArrow :							// Down 
		case '8' : 
		{	 
			iMenuItem = iMenuItem >= iMenuPagePos[iMenuState].iY ? iMenuPagePos[iMenuState].iX : ++iMenuItem; 
			iSelect = 1; 
		}return 0; 
		 
		case EKeyLeftArrow :							// Left 
		case '4' : 
		{ 
			TInt Item = Index(iMenuItem); 
			if(Item == -1) 
				break; 
			iSetting[Item] = iSetting[Item] <= iSettingPos[Item].iX ? iSettingPos[Item].iY : --iSetting[Item]; 
 
			iMenuItemTxt.At(iMenuItem) = iSettingStr.At(iSetting[Item]); 
		}break; 
 
		case EKeyRightArrow :							// Right 
		case '6' : 
		{ 
			TInt Item = Index(iMenuItem); 
			if(Item == -1) 
				break; 
			iSetting[Item] = iSetting[Item] >= iSettingPos[Item].iY ? iSettingPos[Item].iX : ++iSetting[Item]; 
 
			iMenuItemTxt.At(iMenuItem) = iSettingStr.At(iSetting[Item]); 
		}break; 
 
		// just hold on,wait for key 
		default: 
		{ 
			return 0; 
		}break; 
	} 
	return 0; 
} 
 
 
// SetFrameDynamic() 
void CMenu::SetFrameDynamic(TInt aMenuItem) 
{ 
	TPoint&		pos = iCurrentMenuItemPos[aMenuItem]; 
	TPoint		aimPos = iMenuItemPos[aMenuItem]; 
 
	if(pos.iY < aimPos.iY) 
	{ 
		pos.iY += iSpeed; 
		if(pos.iY > aimPos.iY) 
			pos.iY = aimPos.iY; 
	} 
	else if(pos.iY > aimPos.iY) 
	{ 
		pos.iY -= iSpeed; 
		if(pos.iY < aimPos.iY) 
			pos.iY = aimPos.iY; 
	 
	} 
	 
	SetFrame(aMenuItem); 
} 
 
// 
void CMenu::SetFrame(TInt aMenuItem) 
{ 
	iPointList[0] = iCurrentMenuItemPos[aMenuItem] - TPoint(1, 0); 
	iPointList[1] = iPointList[0] + TPoint( 33,  0); 
	iPointList[2] = iPointList[1] + TPoint(  5, -8); 
	iPointList[3] = iPointList[2] + TPoint(100,  0); 
	iPointList[4] = iPointList[3] + TPoint(  5,  8); 
	iPointList[5] = iPointList[4] + TPoint( 34,  0); 
		 
	iPointList[6] = iPointList[5] + TPoint( 0,  5); 
	iPointList[7] = iPointList[4] + TPoint( 0,  5); 
	iPointList[8] = iPointList[3] + TPoint( 0,  20); 
	iPointList[9] = iPointList[2] + TPoint( 0,  20); 
	iPointList[10] = iPointList[1] + TPoint( 0,  5); 
	iPointList[11] = iPointList[0] + TPoint( 0,  5); 
} 
 
// LoadRes() 
// Init Menu 's position and Txt 
void CMenu::LoadResL() 
{ 
	CEikonEnv* eikonEnv = CEikonEnv::Static(); 
 
	iMenuState	= EMainPage; 
	iMenuItem	= EStart; 
 
	iSettingStr[0] = eikonEnv->AllocReadResourceL(R_MENUITEM_ROTATION1); 
	iSettingStr[1] = eikonEnv->AllocReadResourceL(R_MENUITEM_ROTATION2); 
	iSettingStr[2] = eikonEnv->AllocReadResourceL(R_MENUITEM_SOUNDS1); 
	iSettingStr[3] = eikonEnv->AllocReadResourceL(R_MENUITEM_SOUNDS2); 
	iSettingStr[4] = eikonEnv->AllocReadResourceL(R_MENUITEM_MUSIC1); 
	iSettingStr[5] = eikonEnv->AllocReadResourceL(R_MENUITEM_MUSIC2); 
	iSettingStr[6] = eikonEnv->AllocReadResourceL(R_MENUITEM_VOLUME1); 
	iSettingStr[7] = eikonEnv->AllocReadResourceL(R_MENUITEM_VOLUME2); 
	iSettingStr[8] = eikonEnv->AllocReadResourceL(R_MENUITEM_VOLUME3); 
	iSettingStr[9] = eikonEnv->AllocReadResourceL(R_MENUITEM_VOLUME4); 
	iSettingStr[10] = eikonEnv->AllocReadResourceL(R_MENUITEM_STARTLINES1); 
	iSettingStr[11] = eikonEnv->AllocReadResourceL(R_MENUITEM_STARTLINES2); 
	iSettingStr[12] = eikonEnv->AllocReadResourceL(R_MENUITEM_STARTLINES3); 
	iSettingStr[13] = eikonEnv->AllocReadResourceL(R_MENUITEM_STARTLINES4); 
	iSettingStr[14] = eikonEnv->AllocReadResourceL(R_MENUITEM_ADDBRICK1); 
	iSettingStr[15] = eikonEnv->AllocReadResourceL(R_MENUITEM_ADDBRICK2); 
	iSettingStr[16] = eikonEnv->AllocReadResourceL(R_MENUITEM_ADDBRICK3); 
 
	// settings start & end 
	iSettingPos[0] = TPoint(0, 1); 
	iSettingPos[1] = TPoint(2, 3); 
	iSettingPos[2] = TPoint(4, 5); 
	iSettingPos[3] = TPoint(6, 9); 
	iSettingPos[4] = TPoint(10, 13); 
	iSettingPos[5] = TPoint(14, 16); 
 
	// Init 
	iSetting[0]	= iSettingPos[0].iX; 
	iSetting[1]	= iSettingPos[1].iX; 
	iSetting[2]	= iSettingPos[2].iX; 
	iSetting[3]	= iSettingPos[3].iX; 
	iSetting[4]	= iSettingPos[4].iX; 
	iSetting[5]	= iSettingPos[5].iX; 
	// set menuPage's start & end item  
	iMenuPagePos[EMainPage] = TPoint(0, 4); 
	iMenuPagePos[EOptionsPage] = TPoint(5, 8); 
	iMenuPagePos[ESoundPage] = TPoint(9, 12); 
	iMenuPagePos[EDifficultyPage] = TPoint(13, 15); 
	iMenuPagePos[EPausePage] = TPoint(16, 18); 
	iMenuPagePos[ECreditPage] = TPoint(ENoneItem, ENoneItem); 
	iMenuPagePos[EHighScorePage] = TPoint(ENoneItem, ENoneItem); 
 
	// Menu item Position 
	iMenuItemPos[EStart]	= TPoint(0, 54); 
	iMenuItemPos[EOptions]	= TPoint(0, 79); 
	iMenuItemPos[ECredit]	= TPoint(0, 104); 
	iMenuItemPos[EHighScore]= TPoint(0, 129); 
	iMenuItemPos[EQuit]		= TPoint(0, 154); 
 
	iMenuItemPos[EOptions_Sound]		= TPoint(0, 67); 
	iMenuItemPos[EOptions_Difficulty]	= TPoint(0, 92); 
	iMenuItemPos[EOptions_RotateDir]	= TPoint(0, 116); 
	iMenuItemPos[EOptions_Back]			= TPoint(0, 141); 
 
	iMenuItemPos[ESound_Sounds]	= TPoint(0, 67); 
	iMenuItemPos[ESound_Music]	= TPoint(0, 92); 
	iMenuItemPos[ESound_Volume]	= TPoint(0, 116); 
	iMenuItemPos[ESound_Done]	= TPoint(0, 141); 
 
	iMenuItemPos[EDifficulty_StartLines]	= TPoint(0, 74); 
	iMenuItemPos[EDifficulty_AddBrick]		= TPoint(0, 104); 
	iMenuItemPos[EDifficulty_Done]			= TPoint(0, 134); 
 
	iMenuItemPos[EPause_Continue]	= TPoint(0, 79); 
	iMenuItemPos[EPause_Sound]		= TPoint(0, 104); 
	iMenuItemPos[EPause_EndGame]	= TPoint(0, 129); 
 
	// Menu Item Txt 
	iMenuItemTxt.At(EStart)		= eikonEnv->AllocReadResourceL(R_MENUITEM_START); 
	iMenuItemTxt.At(EOptions)	= eikonEnv->AllocReadResourceL(R_MENUITEM_OPTIONS); 
	iMenuItemTxt.At(ECredit)	= eikonEnv->AllocReadResourceL(R_MENUITEM_CREDIT); 
	iMenuItemTxt.At(EHighScore)	= eikonEnv->AllocReadResourceL(R_MENUITEM_HIGHSCORE); 
	iMenuItemTxt.At(EQuit)		= eikonEnv->AllocReadResourceL(R_MENUITEM_QUIT); 
 
	iMenuItemTxt.At(EOptions_Sound)		= eikonEnv->AllocReadResourceL(R_MENUITEM_SOUND); 
	iMenuItemTxt.At(EOptions_Difficulty)= eikonEnv->AllocReadResourceL(R_MENUITEM_DIFFICULTY); 
	iMenuItemTxt.At(EOptions_RotateDir)	= iSettingStr.At(iSetting[0]); 
	iMenuItemTxt.At(EOptions_Back)		= eikonEnv->AllocReadResourceL(R_MENUITEM_BACK); 
 
	iMenuItemTxt.At(ESound_Sounds)	= iSettingStr.At(iSetting[1]); 
	iMenuItemTxt.At(ESound_Music)	= iSettingStr.At(iSetting[2]); 
	iMenuItemTxt.At(ESound_Volume)	= iSettingStr.At(iSetting[3]); 
	iMenuItemTxt.At(ESound_Done)	= eikonEnv->AllocReadResourceL(R_MENUITEM_DONE); 
 
	iMenuItemTxt.At(EDifficulty_StartLines)	= iSettingStr.At(iSetting[4]); 
	iMenuItemTxt.At(EDifficulty_AddBrick)	= iSettingStr.At(iSetting[5]); 
	iMenuItemTxt.At(EDifficulty_Done)		= iMenuItemTxt.At(ESound_Done); 
 
	iMenuItemTxt.At(EPause_Continue)= eikonEnv->AllocReadResourceL(R_MENUITEM_CONTINUE); 
	iMenuItemTxt.At(EPause_Sound)	= iMenuItemTxt.At(EOptions_Sound); 
	iMenuItemTxt.At(EPause_EndGame)	= eikonEnv->AllocReadResourceL(R_MENUITEM_ENDGAME); 
} 
 
 
// ResetPos() 
void CMenu::ResetPos() 
{ 
	iSpeed = 1; 
 
	TInt start	= iMenuPagePos[iMenuState].iX; 
	TInt end	= iMenuPagePos[iMenuState].iY; 
 
	for(TInt i = start; i <= end; i++) 
		iCurrentMenuItemPos[i] = TPoint(0, 104); 
} 
 
// Index() 
TInt CMenu::Index(TInt aMenuItem) 
{ 
	switch(aMenuItem) 
	{ 
		case EOptions_RotateDir : 
			return 0; 
		case ESound_Sounds : 
			return 1; 
		case ESound_Music : 
			return 2; 
		case ESound_Volume : 
			return 3; 
		case EDifficulty_StartLines : 
			return 4; 
		case EDifficulty_AddBrick : 
			return 5; 
		 
		default: return -1; 
	} 
}