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


/* 
* ============================================================================ 
*  Name     : CModelGame from CModelGame.h 
*  Part of  : 2DExample 
*  Created  : 01/01/2005 by Forum Nokia 
*  Version  : 1.0 
*  Copyright: Nokia Corporation 
* ============================================================================ 
*/ 
 
// INCLUDE FILES 
#include "CModelGame.h" 
#include "CBitmap.h" 
#include "CSprite.h" 
#include "level0.h" 
#include "MCharacter.h" 
#include "CTileMap.h" 
#include "CChrPlayer.h" 
#include "CChrMonster.h" 
#include "CChrDiamond.h" 
#include "CChrDiamondBox.h" 
 
 
 
CModelGame* CModelGame::NewL( MSystem* aSystem ) 
	{ 
	CModelGame* self = new( ELeave )CModelGame( aSystem ); 
	CleanupStack::PushL( self ); 
	self->ConstructL(); 
	CleanupStack::Pop( self ); 
	return self; 
	} 
 
 
 
CModelGame::~CModelGame() 
	{ 
	 
	} 
 
 
 
 
CModelGame::CModelGame( MSystem* aSystem ) 
	: iSystem( aSystem ) 
	{ 
	 
	} 
 
 
 
void CModelGame::ConstructL() 
	{ 
	} 
 
 
 
void CModelGame::ActivateL() 
	{ 
	TFileName file; 
	file.Copy( iSystem->Path() ); 
	file.Append( _L("sprites.mbm") ); 
	iBmTest = CBitmap::NewL( file, 0 ); 
 
	file.Copy( iSystem->Path() ); 
	file.Append( _L("level0.mbm" ) ); 
	iBmTile = CBitmap::NewL( file,  0 ); 
 
	file.Copy( iSystem->Path() ); 
	file.Append( _L("font.mbm" ) ); 
	iBmFont = CBitmap::NewL( file, 0 ); 
	iBmFont->SetMaskColor( 0 ); 
	iFont = CBmFont::NewL( iBmFont, iSystem ); 
 
	iSprPlayer = CSprite::NewL(); 
	iSprMonster = CSprite::NewL(); 
	iSprDiamond = CSprite::NewL(); 
	iSprDiamondBox = CSprite::NewL(); 
 
	TInt i; 
	for(  i=0; i<8; i++ ) 
		{ 
		file.Copy( iSystem->Path() ); 
		file.Append( _L("player.mbm" ) ); 
		CBitmap* bmPlayer = CBitmap::NewL( file,  i ); 
		bmPlayer->SetMaskColor( 0 );		 
		iSprPlayer->AddSpriteBmp( bmPlayer ); 
		} 
 
	for(  i=0; i<2; i++ ) 
		{ 
		file.Copy( iSystem->Path() ); 
		file.Append( _L("monster.mbm" ) ); 
		CBitmap* bmMonster = CBitmap::NewL( file,  i ); 
		bmMonster->SetMaskColor( 0 );		 
		iSprMonster->AddSpriteBmp( bmMonster ); 
		} 
 
	for(  i=0; i<2; i++ ) 
		{ 
		file.Copy( iSystem->Path() ); 
		file.Append( _L("diamondbox.mbm" ) ); 
		CBitmap* bmDiamondBox = CBitmap::NewL( file,  i ); 
		bmDiamondBox->SetMaskColor( 255 );		 
		iSprDiamondBox->AddSpriteBmp( bmDiamondBox ); 
		} 
 
	file.Copy( iSystem->Path() ); 
	file.Append( _L("diamond.mbm" ) ); 
	CBitmap* bmDiamond = CBitmap::NewL( file,  0 ); 
	bmDiamond->SetMaskColor( 0 );		 
	iSprDiamond->AddSpriteBmp( bmDiamond ); 
 
	iTileMap = CTileMap::NewL( iBmTile, TSize( KMapW, KMapH ), KLevel0,/* this, */ iSystem );  
	 
	iPlayer = CChrPlayer::NewL( iSprPlayer, iSystem, iTileMap ); 
	iPlayer->SetType( KPlayer ); 
	iPlayer->SetPosition( TPoint( 0,0 ) ); 
	iCharacter.Append( iPlayer ); 
 
	// Go Through tilemap and add monster/diamond positions accordingly 
	for( TInt y=0; y<22; y++ ) 
		{ 
		for( TInt x=0; x<255; x++ ) 
			{ 
			TInt tile = iTileMap->Tile( TPoint( x*8, y*8 ), 2 ); 
 
			if( tile == 144 ) // Monster 
				{ 
				iMonster = CChrMonster::NewL( iSprMonster, iSystem, iTileMap ); 
				iMonster->SetPosition( TPoint( x*8,y*8 ) ); 
				iMonster->SetType( KMonster ); 
				iCharacter.Append( iMonster ); 
				} 
 
			if( tile == 10 || tile == 2) // Diamond 
				{ 
				iDiamond = CChrDiamond::NewL( iSprDiamond, iSystem, iTileMap ); 
				iDiamond->SetPosition( TPoint( x*8,y*8 ) ); 
				iDiamond->SetType( KDiamond ); 
				iCharacter.Append( iDiamond ); 
				} 
	 
			if( tile == 7 ) // DiamondBox 
				{ 
				iDiamondBox = CChrDiamondBox::NewL( iSprDiamondBox, iSystem, iTileMap ); 
				iDiamondBox->SetPosition( TPoint( x*8, y*8 ) ); 
				iDiamondBox->SetType( KDiamondBox ); 
				iCharacter.Append( iDiamondBox ); 
				} 
 
			if( tile == 53 ) // LevelWarp 
				{ 
				iLevelWarp = TRect( x*8,y*8,(x*8)+8,(y*8)+32); 
				} 
			} 
		} 
 
	 
	iCamera = TPoint( 0,0 ); 
	iPlayerDead = EFalse; 
 
	iTime = 400; 
	iScore = 0; 
	iCurrentTime.HomeTime(); 
	} 
 
 
 
void CModelGame::Deactivate() 
	{ 
	iBmTest->Destroy(); 
	delete iBmTest; 
	iBmTest = NULL; 
 
	iBmTile->Destroy(); 
	delete iBmTile; 
	iBmTile = NULL; 
 
	iBmFont->Destroy(); 
	delete iBmFont; 
	iBmFont = NULL; 
 
	delete iFont; 
	delete iSprPlayer; 
	delete iSprMonster; 
	delete iSprDiamond; 
	delete iSprDiamondBox; 
	delete iTileMap; 
 
	iCharacter.ResetAndDestroy(); 
	} 
 
 
 
void CModelGame::Draw( CBitmap& aTarget ) 
	{ 
	TInt i; 
	TInt c = iCharacter.Count(); 
 
	if( iSystem->KeyState( iSystem->BackKey() ) ) 
		{ 
		iSystem->ChangeModelL( EModelTitleScreen ); 
		} 
 
	TSize scrSize = aTarget.Size(); 
 
	if( !iPlayerDead ) 
		{ 
		TTime time; 
		time.HomeTime(); 
 
		TTimeIntervalSeconds sf; 
		time.SecondsFrom( iCurrentTime, sf ); 
		iTime = 400-sf.Int(); 
 
		if( iTime <= 0 ) 
			{ 
			iPlayerDead = ETrue; 
			iCharacter[ 0 ]->Die(); 
			} 
 
		iCameraPos = TPoint( iCamera.iX >> 16, iCamera.iY >> 16 ); 
		iCameraPos -= TPoint( scrSize.iWidth / 2, scrSize.iHeight / 2 ); 
 
 
		// Check player collisions 
		TRect src,tgt; 
		src.iTl.iX = iCharacter[0]->Position().iX+10; 
		src.iTl.iY = iCharacter[0]->Position().iY; 
		src.iBr.iX = src.iTl.iX+iCharacter[0]->Sprite()->Bitmap()->Size().iWidth-20; 
		src.iBr.iY = src.iTl.iY+iCharacter[0]->Sprite()->Bitmap()->Size().iHeight; 
 
		// Player vs. Levelwarp 
 
		if( src.Intersects( iLevelWarp ) ) 
			{ 
			iSystem->ChangeModelL( EModelTitleScreen ); 
			return;			 
			} 
 
		for( i=1; iPosition().iX; 
			tgt.iTl.iY = iCharacter[i]->Position().iY; 
			tgt.iBr.iX = tgt.iTl.iX+iCharacter[i]->Sprite()->Bitmap()->Size().iWidth; 
			tgt.iBr.iY = tgt.iTl.iY+iCharacter[i]->Sprite()->Bitmap()->Size().iHeight; 
 
 
			if( src.Intersects( tgt ) )  
				{			 
				if(  iCharacter[i]->Type() == KMonster ) 
					{ 
					iCharacter[ 0 ]->Die(); 
					iPlayerDead = ETrue; 
					} 
				 
				if( iCharacter[i]->Type() == KDiamond ) 
					{ 
					iCharacter[ i ]->Die(); 
					iScore += 100; 
					} 
				} 
			} 
 
		//  Check Diamond Box Collisions 
		src.iTl.iX = iCharacter[0]->Position().iX+10; 
		src.iTl.iY = iCharacter[0]->Position().iY-8; 
		src.iBr.iX = src.iTl.iX+iCharacter[0]->Sprite()->Bitmap()->Size().iWidth-20; 
		src.iBr.iY = src.iTl.iY+iCharacter[0]->Sprite()->Bitmap()->Size().iHeight; 
		 
		for( i=1; iPosition().iX; 
			tgt.iTl.iY = iCharacter[i]->Position().iY+8; 
			tgt.iBr.iX = tgt.iTl.iX+iCharacter[i]->Sprite()->Bitmap()->Size().iWidth; 
			tgt.iBr.iY = tgt.iTl.iY+iCharacter[i]->Sprite()->Bitmap()->Size().iHeight; 
 
			if( src.Intersects( tgt ) )  
				{			 
				if( iCharacter[i]->Type() == KDiamondBox ) 
					{ 
					iCharacter[ i ]->Die(); 
					iScore += 200; 
					} 
				} 
			} 
		} 
	else 
		{ 
		if( iCharacter[0]->Position().iY > 36*8 ) // Game is over 
			{ 
			iSystem->ChangeModelL( EModelTitleScreen ); 
			return; 
			} 
		} 
 
	aTarget.Clear( TRgb( 32,48,150 ) ); 
	 
	iTileMap->Draw( aTarget, iCameraPos ); 
	 
	for( i=0; iDraw( aTarget, iCameraPos ); 
		iCharacter[ i ]->Move(); 
		} 
 
	TBuf8<16> txt; 
	// Draw Time 
	txt.Copy( _L("TIME    ") ); 
	iFont->DrawText( aTarget, txt , TPoint( 0,0 ) ); 
	iFont->DrawNumber( aTarget, iTime, TPoint(  45,0 ) ); 
 
	// Draw Score 
	txt.Copy( _L( "SCORE     " ) ); 
	iFont->DrawText( aTarget, txt, TPoint( 0,14 ) ); 
	iFont->DrawNumber( aTarget, iScore, TPoint(  50,14 ) ); 
	 
	TPoint p1 = iCharacter[0]->Position();  
	p1.iX <<= 16; 
	p1.iY <<= 16; 
	 
	iCamera.iX = ( iCamera.iX * 2 + p1.iX ) / 3; 
	iCamera.iY = ( iCamera.iY * 2 + p1.iY ) / 3; 
 
	if( iCharacter[0]->Position().iY > 19*8 && !iPlayerDead ) 
		{ 
		iPlayerDead = ETrue; 
		iPlayer->Die(); 
		return; 
		} 
	} 
 
 
 
void CModelGame::Move() 
	{ 
	TInt c = iCharacter.Count(); 
	 
	TInt i; 
	for( i=0; iMove(); 
		} 
	} 
 
// End of file