cmodelgame.cpp
来自「Symbian手机游戏,可运行于S60 1.x和2.x下, Carbide.C」· C++ 代码 · 共 2,364 行 · 第 1/4 页
CPP
2,364 行
/*
* ============================================================================
* 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 "level0.h"
#include "fish.mbg"
#include <e32math.h>
#include <eikenv.h>
#include <fish.rsg>
#include <stringloader.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()
{
InitConstData();
isRunning = ETrue;
resumeFlag = EFalse;
hasSound = ETrue;
menuIndex = 0;
backGroundColor = TRgb(254, 254, 254);
menuColor=0;
titleY=0;
menuY=iSystem->Height()/2+20;
gameState=MENU;
helpY=76;
screenWidth = iSystem->Width();
screenHeight = iSystem->Height();
TFileName file;
file.Copy( iSystem->Path() );
file.Append( _L("fish.mbm") );
imgTitle = CBitmap::NewL( file, EMbmFishTitle );
level=1;
hit=2;
rest=2;
newCtr=50;
yummyCtr=50;
InitPlayer();
AddEnemy();
for (TInt i = 0; i < 3; i++)
{
imgBack[i] = CBitmap::NewL( file, EMbmFishBg0 + i);
}
//__UHEAP_CHECK(10);
imgPlayerSmall = CBitmap::NewL( file, EMbmFishPs );
//__UHEAP_CHECK(12);
for (i=0;i<11;i++)
{
imgPS[i]=CBitmap::NewL(imgPlayerSmall->Data(), imgPlayerSmall->Size(), imgPlayerSmall->Mode() );
imgPS[i]->SetDrawRect( TRect( TPoint(i*15,0), TSize(15,12) ));
imgPlayer[i]=imgPS[i];
}
imgPlayerMiddle = CBitmap::NewL( file, EMbmFishPm );
for (i=0;i<11;i++)
{
imgPM[i]=CBitmap::NewL(imgPlayerMiddle->Data(), imgPlayerMiddle->Size(), imgPlayerMiddle->Mode() );
imgPM[i]->SetDrawRect( TRect( TPoint(i*20,0), TSize(20,17) ) );
imgPlayer[11+i]=imgPM[i];
}
imgPlayerLarge=CBitmap::NewL(file, EMbmFishPl);
for (i=0;i<11;i++)
{
imgPL[i]=CBitmap::NewL(imgPlayerLarge->Data(), imgPlayerLarge->Size(), imgPlayerLarge->Mode() );
imgPL[i]->SetDrawRect( TRect( TPoint(i*37,0), TSize(37,28) ) );
imgPlayer[22+i]=imgPL[i];
}
//加载敌人图片
for(TInt j=0;j<11;j++)
{
imgEnemy0Small[j] = CBitmap::NewL(file, EMbmFishE0s + j * 3);
for (i=0;i<5;i++)
{
imgEnemy[i+15*j]=CBitmap::NewL(imgEnemy0Small[j]->Data(), imgEnemy0Small[j]->Size(), imgEnemy0Small[j]->Mode() );
imgEnemy[i+15*j]->SetDrawRect( TRect( TPoint(i*12,0), TSize(12,10) ) );
}
imgEnemy0Middle[j]=CBitmap::NewL(file, EMbmFishE0m + j * 3);
for (i=0;i<5;i++)
{
imgEnemy[5+i+15*j]=CBitmap::NewL(imgEnemy0Middle[j]->Data(), imgEnemy0Middle[j]->Size(), imgEnemy0Middle[j]->Mode() );
imgEnemy[5+i+15*j]->SetDrawRect( TRect( TPoint(i*17,0), TSize(17,14) ) );
}
imgEnemy0Large[j]=CBitmap::NewL(file, EMbmFishE0l + j * 3);
for (i=0;i<5;i++)
{
imgEnemy[10+i+15*j]=CBitmap::NewL(imgEnemy0Large[j]->Data(), imgEnemy0Large[j]->Size(), imgEnemy0Large[j]->Mode() );
imgEnemy[10+i+15*j]->SetDrawRect( TRect( TPoint(i*24,0),TSize(24,20) ) );
}
}
imgScores=CBitmap::NewL(file, EMbmFishScore);
for (i=0;i<13;i++)
{
imgScore[i]=CBitmap::NewL(imgScores->Data(), imgScores->Size(), imgScores->Mode() );
imgScore[i]->SetDrawRect( TRect( TPoint(i*6,0), TSize(6,7) ) );
}
imgPerl[0]=CBitmap::NewL(file, EMbmFishP0);
imgPerl[1]=CBitmap::NewL(file, EMbmFishP1);
imgPerl[2]=CBitmap::NewL(file, EMbmFishP2);
imgPerl[3]=CBitmap::NewL(file, EMbmFishP3);
imgTop=CBitmap::NewL(file, EMbmFishUp);
imgBubble=CBitmap::NewL(file, EMbmFishQipao);
imgIntro=CBitmap::NewL(file, EMbmFishBack);
imgYummy=CBitmap::NewL(file, EMbmFishYummy);
for(i=0;i<5;i++)
{
imgBounus[i]=CBitmap::NewL(file, EMbmFishBounus0 + i);
}
imgGrowth=CBitmap::NewL(file, EMbmFishChengzhang);
imgSharks=CBitmap::NewL(file, EMbmFishShayu);
for(i=0;i<4;i++)
{
imgShark[i]=CBitmap::NewL(imgSharks->Data(), imgSharks->Size(), imgSharks->Mode());
imgShark[i]->SetDrawRect( TRect( TPoint(i*90,0), TSize(90,32) ) );
}
imgNumber=CBitmap::NewL(file, EMbmFishShuzi);
imgBy=CBitmap::NewL(file, EMbmFishChenghao);
imgShuimu=CBitmap::NewL(file, EMbmFishShuimu);
imgMenu=CBitmap::NewL(file, EMbmFishCaidan);
imgSinlan=CBitmap::NewL(file, EMbmFishSinlan);
imgStun=CBitmap::NewL(file, EMbmFishXuanyun);
imgArrow=CBitmap::NewL(file, EMbmFishJiantou);
imgArrowL=CBitmap::NewL(file, EMbmFishJiantoul);
lastMenuKey = 0;
iSystem->LoadMusic();
}
void CModelGame::Deactivate()
{
//iSystem->DestroyMusic();
imgTitle->Destroy();
delete imgTitle;
imgPlayerSmall->Destroy();
delete imgPlayerSmall;
imgPlayerMiddle->Destroy();
delete imgPlayerMiddle;
imgPlayerLarge->Destroy();
delete imgPlayerLarge;
for (TInt i = 0; i < 11; i++)
{
imgEnemy0Small[i]->Destroy();
delete imgEnemy0Small[i];
imgEnemy0Middle[i]->Destroy();
delete imgEnemy0Middle[i];
imgEnemy0Large[i]->Destroy();
delete imgEnemy0Large[i];
}
imgScores->Destroy();
delete imgScores;
imgTop->Destroy();
delete imgTop;
imgIntro->Destroy();
delete imgIntro;
imgYummy->Destroy();
delete imgYummy;
imgGrowth->Destroy();
delete imgGrowth;
imgSharks->Destroy();
delete imgSharks;
imgSinlan->Destroy();
delete imgSinlan;
for (i = 0; i < 11; i++)
{
delete imgPS[i];
delete imgPM[i];
delete imgPL[i];
}
for (i = 0; i < 165; i++)
{
delete imgEnemy[i];
}
for (i = 0; i < 13; i++)
{
delete imgScore[i];
}
for (i = 0; i < 4; i++)
{
imgPerl[i]->Destroy();
delete imgPerl[i];
}
imgBubble->Destroy();
delete imgBubble;
for (i = 0; i < 5; i++)
{
imgBounus[i]->Destroy();
delete imgBounus[i];
}
for (i = 0; i < 3; i++)
{
imgBack[i]->Destroy();
delete imgBack[i];
}
for (i=0; i < 4; i++)
{
delete imgShark[i];
}
imgNumber->Destroy();
delete imgNumber;
imgBy->Destroy();
delete imgBy;
imgShuimu->Destroy();
delete imgShuimu;
imgMenu->Destroy();
delete imgMenu;
imgStun->Destroy();
delete imgStun;
imgArrow->Destroy();
delete imgArrow;
imgArrowL->Destroy();
delete imgArrowL;
}
void CModelGame::Draw( CBitmap& aTarget, CFbsBitGc& aGc )
{
if(gameState==INTRO)
{
DrawIntro(aTarget, aGc);
}
else if (gameState==PLAY||gameState==LEVELCOMPLETE)
{
DrawBack(aTarget, aGc);
DrawSP(aTarget, aGc);
DrawStatus(aTarget, aGc);
DrawRest(aTarget, aGc);
if(gameState==LEVELCOMPLETE)
{
DrawLevelComplete(aTarget, aGc);
}
if(pauseFlag)
{
DrawPause(aTarget, aGc);
}
else
{
DrawPauseHint(aTarget, aGc);
}
if(deadCtr>0)
{
DrawDead(aTarget, aGc);
}
if(gameOverCtr>0)
{
DrawGameOver(aTarget, aGc);
}
}
else if(gameState==ANALYS)
{
DrawAnalys(aTarget, aGc);
}
else if(gameState==MENU)
{
aGc.SetBrushColor( KRgbWhite );
aGc.SetBrushStyle( CGraphicsContext::ESolidBrush );
aGc.SetPenStyle( CGraphicsContext::ENullPen );
aGc.DrawRect( TRect(0,0,screenWidth,screenHeight));
DrawTitle(aTarget, aGc);
DrawMenu(aTarget, aGc);
}
else if(gameState==HELP)
{
DrawHelp(aTarget, aGc);
}
else if(gameState==ABOUT)
{
DrawAbout(aTarget, aGc);
}else if(gameState==CONGRATULATIONS)
{
DrawCongratulations(aTarget, aGc);
}
}
void CModelGame::Move()
{
counter++;
if (gameState==PLAY)
{
if( iSystem->KeyState(iSystem->SelectKey()) && lastMenuKey != iSystem->SelectKey())//(keySoftLeft)
{
lastMenuKey = iSystem->SelectKey();
gameState=MENU;
menuIndex=5;
resumeFlag=true;
}
else if(iSystem->KeyState(iSystem->BackKey())&&deadCtr==0&&gameOverCtr==0 && (lastMenuKey!=iSystem->BackKey()))
{
lastMenuKey = iSystem->BackKey();
//游戏中响应右软键
pauseFlag=!pauseFlag;
}
else if(!pauseFlag)
{
RandomBubbles();
UpdatePlayer();
UpdateEnemies();
}
}
else if(gameState==LEVELCOMPLETE)
{
if(levelCompleteCtr>0)
{
levelCompleteCtr--;
UpdatePlayer();
}
else
{
gameState=ANALYS;
smallCtr=smallEaten;
middleCtr=middleEaten;
largeCtr=largeEaten;
}
}
else if(gameState==INTRO)
{
if( (iSystem->KeyState(iSystem->OkKey()) || iSystem->KeyState(iSystem->SelectKey())) && (lastMenuKey != iSystem->OkKey()) && (lastMenuKey!=iSystem->SelectKey()))
{
lastMenuKey = iSystem->SelectKey();
yummyCtr=50;
newCtr=50;
gameState=PLAY;
}
}
else if(gameState==ANALYS)
{
if(counter%3==0)
{
if(smallCtr>0)
smallCtr--;
else if(middleCtr>0)
middleCtr--;
else if(largeCtr>0)
largeCtr--;
}
if (iSystem->KeyState(iSystem->OkKey())|| iSystem->KeyState(iSystem->SelectKey()))//(keySoftLeft||keyFire)
{
lastMenuKey = iSystem->SelectKey();
if(level<9)
{
yummyCtr=50;
newCtr=50;
level++;
InitLevel(level);
gameState=INTRO;
}
else
{
gameState=CONGRATULATIONS;
congratulationsCtr=100;
}
}
}
else if(gameState==MENU)
{
UpdateMenu();
}
else if(gameState==ABOUT)
{
UpdateAbout();
}
else if(gameState==HELP)
{
UpdateHelp();
}
else if(gameState==CONGRATULATIONS)
{
if(congratulationsCtr>0)
{
congratulationsCtr--;
}
else if(congratulationsCtr==0)
{
gameState=MENU;
resumeFlag=EFalse;
menuIndex=0;
}
}
}
// End of file
void CModelGame::InitPlayer()
{
player=GetFreeSprite();
if(player!=NULL)
{
player->type=PLAYER;
player->level=SMALL;
player->width=15;
player->height=12;
player->x=iSystem->Width()/2-player->width/2;
player->y=iSystem->Height()/2-player->height/2;
player->direction=RIGHT;
player->action=SWIM;
}
}
SP* CModelGame::GetFreeSprite()
{
for(TInt i=0;i<70;i++)
{
if(sprite[i].type==0)
{
SP* sp=&(sprite[i]);
sp->x=0;
sp->y=0;
sp->ctr=0;
sp->width=0;
sp->height=0;
sp->direction=0;
sp->action=0;
sp->value=0;
return sp;
}
}
return NULL;
}
void CModelGame::AddEnemy()
{
for(TInt i=0;i<smallCount[level-1];i++)
{
InitEnemy(small[level-1],SMALL);
}
for(i=0;i<middleCount[level-1];i++)
{
InitEnemy(middle[level-1],MIDDLE);
}
for(i=0;i<largeCount[level-1];i++)
{
InitEnemy(large[level-1],LARGE);
}
InitPerl();
}
void CModelGame::InitEnemy(TInt type, TInt level)
{
SP* enemy=GetFreeSprite();
if (enemy!=NULL)
{
enemy->type=type;
enemy->level=level;
if(level==SMALL)
{
enemy->width=12;
enemy->height=10;
}
else if(level==MIDDLE)
{
enemy->width=17;
enemy->height=14;
}else if(level==LARGE)
{
enemy->width=24;
enemy->height=20;
}
TInt rx=(Math::Rand(seed))%2;
TInt r=(Math::Rand(seed))%(offsetXMax[this->level-1]+enemy->width);
if(rx==0)
r=-r;
enemy->x=-enemy->width+(iSystem->Width()+enemy->width)*rx+r;
TInt ry=(Math::Rand(seed))%(iSystem->Height()-enemy->height-BOARDHEIGHT)+BOARDHEIGHT;
enemy->y=ry;
enemy->direction=rx;
enemy->action=SWIM;
enemy->sight=32;
}
}
void CModelGame::InitPerl()
{
SP* perl=GetFreeSprite();
if(perl!=NULL)
{
perl->type=PERL;
perl->level=HUGE;
perl->width=23;
perl->height=23;
perl->x=iSystem->Width()/2-perl->width/2;
perl->y=iSystem->Height()-perl->height;
perl->action=OPEN;
perl->ctr=50;
}
}
void CModelGame::DrawIntro(CBitmap &aTarget, CFbsBitGc &aGc)
{
const CFont* font = CEikonEnv::Static()->NormalFont();
aGc.UseFont(font);
aGc.SetBrushColor(TRgb(0x11, 0x75, 0xAB) );
aGc.SetBrushStyle( CGraphicsContext::ESolidBrush );
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?