📄 cmodelgame.cpp
字号:
/*
============================================================================
* Name : CModelGame.cpp
* Part of : 2DMario
* Description : Implementation of CModelGame
* Copyright (c) 2007 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; i<c; i++ )
{
tgt.iTl.iX = iCharacter[i]->Position().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; i<c; i++ )
{
tgt.iTl.iX = iCharacter[i]->Position().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; i<c; i++ )
{
iCharacter[ i ]->Draw( 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; i<c; i++ )
{
iCharacter[ i ]->Move();
}
}
// End of file
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -