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


/* 
* ============================================================================ 
*  Name     : CChrMonster from CChrMonster.h 
*  Part of  : 2DExample 
*  Created  : 01/01/2005 by Forum Nokia 
*  Version  : 1.0 
*  Copyright: Nokia Corporation 
* ============================================================================ 
*/ 
 
// INCLUDE FILES 
#include "CChrMonster.h" 
#include "CSprite.h" 
#include "MSystem.h" 
#include "CTileMap.h" 
 
const TInt KMaxSpeed = 4096; 
 
CChrMonster* CChrMonster::NewL( CSprite* aSprite, MSystem* aSystem, CTileMap* aMap ) 
	{ 
	CChrMonster* self = new( ELeave )CChrMonster( aSprite, aSystem, aMap ); 
	CleanupStack::PushL( self ); 
	self->ConstructL(); 
	CleanupStack::Pop( self ); 
	return self; 
	}; 
 
 
 
CChrMonster::~CChrMonster() 
	{ 
 
	} 
 
 
 
CChrMonster::CChrMonster( CSprite* aSprite, MSystem* aSystem, CTileMap* aMap ) 
	: iSprite( aSprite ) 
	, iSystem( aSystem ) 
	, iTileMap( aMap ) 
	{ 
 
	} 
 
 
 
void CChrMonster::ConstructL() 
	{ 
 
	} 
 
 
 
void CChrMonster::ActivateL() 
	{ 
	iSpeed = TPoint(100 << 16 ,0); 
	iMonsterDir = 0; 
	iMoving = EFalse; 
	} 
 
 
 
void CChrMonster::Deactivate() 
	{ 
	} 
 
void CChrMonster::Draw( CBitmap& aTarget, const TPoint& aCamera ) 
	{ 
	iCameraPos = aCamera; 
	 
	iSprite->Draw( aTarget, ( iSprAnim >> 2 ) & 1, aCamera ); 
	iSprAnim++; 
 
	if( ( aCamera.iX + aTarget.Size().iWidth ) > (iPosition.iX>>16) ) 
		{ 
		iMoving = ETrue; 
		} 
	} 
 
 
 
void CChrMonster::Move() 
	{ 
	if( (iPosition.iY>>16) > 36*8 ) // Monster has fallen 
		{ 
		return;  
		} 
 
	if( iMoving ) 
		{ 
		//TBool move = EFalse; 
 
		if( iMonsterDir == 0 ) 
			{ 
			if( ( iPosition.iX >> 16 ) <= 0 ) // Beginning of tilemap 
				{ 
				iMonsterDir = 1; 
				} 
			else 
				{ 
				iSpeed.iX = -KMaxSpeed; 
				//move = ETrue; 
				} 
			} 
		else 
			{ 
			if( ( iPosition.iX >> 16 ) > 253*8 ) // End of Tilemap 
				{ 
				iSpeed.iX -= iSpeed.iX; 
				} 
			else 
				{ 
				iSpeed.iX = KMaxSpeed; 
				//move = ETrue; 
				} 
			} 
		 
		TInt x = iPosition.iX >> 16; 
		TInt y = iPosition.iY >> 16; 
 
		// Check bottom collision 
		TInt tile1 = iTileMap->Tile( TPoint( x+4, y+24 ), 0 ); 
		TInt tile2 = iTileMap->Tile( TPoint( x+20, y+24 ), 0 ); 
 
		if( tile1 == 1 && tile2 == 1 ) 
			{ 
			iSpeed.iY += 128; 
			} 
		else 
			{ 
			iSpeed.iY = 0; 
			} 
 
		// Check left / right collision 
		tile1 = iTileMap->Tile( TPoint( x, y+16 ), 0 ); 
		tile2 = iTileMap->Tile( TPoint( x+23, y+16 ), 0 ); 
 
		if( tile1 != 1 || tile2 != 1 ) 
			{ 
			iSpeed.iX -= iSpeed.iX*2; 
 
			if( iMonsterDir == 0 ) 
				{ 
				iMonsterDir = 1; 
				} 
			else 
				{ 
				iMonsterDir = 0; 
				} 
			} 
 
		iPosition += iSpeed; 
		} 
 
	iSprite->SetPosition( TPoint( iPosition.iX >> 16, iPosition.iY >> 16 ) ); 
	} 
 
 
 
TPoint CChrMonster::Position() 
	{ 
	return TPoint( iPosition.iX >> 16, iPosition.iY >> 16 ); 
	} 
 
 
 
void CChrMonster::SetPosition( const TPoint& aPosition ) 
	{ 
	iPosition.iX = aPosition.iX << 16; 
	iPosition.iY = aPosition.iY << 16; 
 
	iSprite->SetPosition( aPosition ); 
	} 
 
 
 
void CChrMonster::Die() 
	{ 
	} 
 
 
 
void CChrMonster::SetType( const TChType& aChType ) 
	{ 
	iChType = aChType; 
	} 
 
 
 
CSprite* CChrMonster::Sprite() 
	{ 
	return iSprite; 
	}	 
 
 
 
TChType CChrMonster::Type() 
	{ 
	return iChType; 
	} 
	 
// End of file