www.pudn.com > Example2D.rar > CModelTitle.cpp


/* 
* ============================================================================ 
*  Name     : CModelTitle from CModelTitle.h 
*  Part of  : 2DExample 
*  Created  : 01/01/2005 by Forum Nokia 
*  Version  : 1.0 
*  Copyright: Nokia Corporation 
* ============================================================================ 
*/ 
 
// INCLUDE FILES 
#include "CModelTitle.h" 
#include "CBitmap.h" 
#include "CSprite.h" 
#include "level0.h" 
#include "MCharacter.h" 
#include "CTileMap.h" 
#include "CChrPlayer.h" 
#include "CFont.h" 
 
 
 
CModelTitle* CModelTitle::NewL( MSystem* aSystem ) 
	{ 
	CModelTitle* self = new( ELeave )CModelTitle( aSystem ); 
	CleanupStack::PushL( self ); 
	self->ConstructL(); 
	CleanupStack::Pop( self ); 
	return self; 
	} 
 
 
 
CModelTitle::~CModelTitle() 
	{ 
	} 
 
 
 
CModelTitle::CModelTitle( MSystem* aSystem ) 
	: iSystem( aSystem ) 
	{ 
	 
	} 
 
 
 
void CModelTitle::ConstructL() 
	{ 
	iAudio = EFalse; 
	} 
 
 
 
void CModelTitle::ActivateL() 
	{ 
	TFileName file; 
	file.Copy( iSystem->Path() ); 
	file.Append( _L("title.mbm") ); 
	iBmTitle = CBitmap::NewL( file, 0 ); 
 
	file.Copy( iSystem->Path() ); 
	file.Append( _L("font.mbm" ) ); 
	iBmFont = CBitmap::NewL( file, 0 ); 
 
	iFont = CBmFont::NewL( iBmFont, iSystem ); 
 
	iBmFont->SetMaskColor( 0 );		 
 
	iCursorPos = 0; 
	} 
 
 
 
void CModelTitle::Deactivate() 
	{ 
	iBmTitle->Destroy(); 
	delete iBmTitle; 
	iBmTitle = NULL; 
 
	iBmFont->Destroy(); 
	delete iBmFont; 
	iBmFont = NULL; 
 
	delete iFont; 
	} 
 
 
 
void CModelTitle::Move() 
	{ 
	} 
 
 
 
void CModelTitle::Draw( CBitmap& aTarget ) 
	{	 
	HandleKeys(); 
 
	TInt xPos = aTarget.Size().iWidth - 160; 
	TInt yPos = aTarget.Size().iHeight - 80; 
 
	aTarget.Clear( TRgb( 0,0,0 ) ); 
	 
	// position title to center, if screen width > title bitmap width 
	TInt xOffset = (aTarget.Size().iWidth - iBmTitle->Size().iWidth) / 2; 
	if(xOffset < 0) 
			xOffset = 0; 
			 
	iBmTitle->Draw( aTarget, TPoint( xOffset, 0 ) ); 
 
	TRect cursorRect = TRect( xPos-1, yPos+(iCursorPos*20), xPos+102, yPos+ 16 +(iCursorPos*20) ); 
	DrawRect( aTarget, cursorRect ); 
 
	TBuf8<16> txt; 
	txt.Copy( _L( "START GAME" ) ); 
	iFont->DrawText ( aTarget, txt, TPoint ( xPos, yPos ) ); 
	txt.Copy( _L( "HELP" ) ); 
	iFont->DrawText ( aTarget, txt, TPoint ( xPos, yPos+20 ) ); 
	if( iAudio ) 
		{ 
		txt.Copy( _L( "AUDIO ON" ) ); 
		} 
	else 
		{ 
		txt.Copy( _L("AUDIO OFF") ); 
		} 
	iFont->DrawText ( aTarget, txt, TPoint ( xPos, yPos+40 ) ); 
	txt.Copy( _L( "QUIT" ) ); 
	iFont->DrawText ( aTarget, txt, TPoint ( xPos, yPos+60 ) ); 
	} 
 
 
 
void CModelTitle::DrawRect( CBitmap& aTarget, TRect aRect ) 
	{ 
	TRgb aRgb = TRgb( 255,0,0 ); 
 
	TInt divider; 
	TUint32 longword = 0; 
 
	switch( aTarget.Mode() ) 
		{ 
		case EColor4K: 
			{ 
			longword = aRgb.Color4K(); 
			longword |= longword << 16; 
			divider = 2; 
			break; 
			} 
		case EColor64K: 
			{ 
			longword = aRgb.Color64K(); 
			longword |= longword << 16; 
			divider = 2; 
			break; 
			} 
		default: 
			{ 
			longword = aRgb.Color16M(); 
			divider = 1; 
			break; 
			} 
		} 
 
	TUint32* p = ( TUint32* )aTarget.Data(); 
 
	for( TInt x=aRect.iTl.iX; x < aRect.iBr.iX; x++ ) 
		{ 
		for( TInt y=aRect.iTl.iY; y < aRect.iBr.iY; y++ ) 
			{ 
			p[ (x + y * aTarget.Size().iWidth) / divider ] = longword; 
			} 
		} 
	} 
 
void CModelTitle::HandleKeys() 
	{ 
 
	if( iLastKey != EStdKeyUpArrow ) 
		{ 
		if( iSystem->KeyState( EStdKeyUpArrow ) )  
			{ 
			CursorUp( EStdKeyUpArrow ); 
			} 
		} 
	if( iLastKey != EStdKeyDownArrow ) 
		{ 
		if( iSystem->KeyState( EStdKeyDownArrow )  )  
			{ 
			CursorDown( EStdKeyDownArrow ); 
			} 
		} 
	if( iLastKey != iSystem->SelectKey() ) 
		{ 
		if( iSystem->KeyState( iSystem->SelectKey() ) ) 
			{ 
			Fire( iSystem->SelectKey() ); 
			} 
		} 
 
	// Nokia 9300 / Nokia 9500 has two sets of navigation keys 
	if( iLastKey != EStdKeyDevice8 ) 
		{ 
		if( iSystem->KeyState( EStdKeyDevice8 ) )  
			{ 
			CursorUp( EStdKeyDevice8 ); 
			} 
		} 
	if( iLastKey != EStdKeyDevice9 ) 
		{ 
		if( iSystem->KeyState( EStdKeyDevice9 )  )  
			{ 
			CursorDown( EStdKeyDevice9 ); 
			} 
		} 
	if( iLastKey != iSystem->OkKey() ) 
		{ 
		if( iSystem->KeyState( iSystem->OkKey() ) ) 
			{ 
			Fire( iSystem->OkKey() ); 
			} 
		} 
 
	// Reset key states if key when released 
	if( ( iLastKey == EStdKeyUpArrow )  &&( !iSystem->KeyState( EStdKeyUpArrow ) ) ) 
		{ 
		iLastKey = 0; 
		} 
	if( ( iLastKey == EStdKeyDevice8 )  &&( !iSystem->KeyState( EStdKeyDevice8 ) ) ) 
		{ 
		iLastKey = 0; 
		} 
	if( ( iLastKey == EStdKeyDownArrow )  && (!iSystem->KeyState( EStdKeyDownArrow ) ) ) 
		{ 
		iLastKey = 0; 
		} 
	if( ( iLastKey == EStdKeyDevice9 )  && (!iSystem->KeyState( EStdKeyDevice9 ) ) ) 
		{ 
		iLastKey = 0; 
		} 
	if( ( iLastKey == iSystem->OkKey() )  && (!iSystem->KeyState( iSystem->OkKey() ) ) ) 
		{ 
		iLastKey = 0; 
		} 
	if( ( iLastKey == iSystem->SelectKey() )  && (!iSystem->KeyState( iSystem->SelectKey() ) ) ) 
		{ 
		iLastKey = 0; 
		} 
	} 
 
void CModelTitle::CursorUp( TInt aLastKey ) 
	{ 
	if( iCursorPos > 0 ) 
		{ 
			iCursorPos--; 
		} 
	iLastKey = aLastKey; 
	} 
 
void CModelTitle::CursorDown( TInt aLastKey ) 
	{ 
	if ( iCursorPos < 3 ) 
		{ 
			iCursorPos++; 
		} 
	iLastKey = aLastKey; 
	} 
 
void CModelTitle::Fire( TInt aLastKey ) 
	{ 
	switch ( iCursorPos ) 
		{ 
			case 0: 
				{ 
				iSystem->ChangeModelL( EModelGame ); 
				break; 
				} 
			case 1: 
				{ 
				iSystem->ChangeModelL( EModelHelp ); 
				break; 
				} 
			case 2: 
				{ 
				iSystem->ToggleAudio(); 
				// Toggle Audio off -> on -> off 
				if( iAudio ) 
					{ 
					iAudio = EFalse; 
					} 
				else 
					{ 
					iAudio = ETrue; 
					} 
				break; 
				} 
			case 3: 
				{ 
				iSystem->PrepareExit(); 
				break; 
				} 
		} 
 
	iLastKey = aLastKey; 
	} 
	 
// End of file