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 + -
显示快捷键?