cmodelgame.cpp

来自「Symbian手机游戏,可运行于S60 1.x和2.x下, Carbide.C」· C++ 代码 · 共 2,364 行 · 第 1/4 页

CPP
2,364
字号
								enemy->x++;
								if(enemy->direction==LEFT)
								{
									enemy->ctr=9;
									enemy->action=TURN;
								}
							}
							else if(enemy->x<player->x)
							{
								enemy->x--;
								if(enemy->direction==RIGHT)
								{
									enemy->ctr=9;
									enemy->action=TURN;
								}
							}
						}
						if(r<8)
						{
							if(enemy->y>player->y)
								enemy->y++;
							else if(enemy->y<player->y)
									enemy->y--;
						}
					}
					else if(enemy->action==TURN)
					{
						if(enemy->ctr==5)//计数器到5改变方向
							if(enemy->direction==RIGHT)
								enemy->direction=LEFT;
							else
								enemy->direction=RIGHT;
					}
					else if(enemy->action==INCREASE)
					{
						enemy->y-=2;
						if(enemy->y<-offsetYMax[level-1])
							enemy->type=0;
					}
					else if(enemy->action==EAT)
					{
						if(player->x+player->width/2<enemy->x+enemy->width&&player->x+player->width/2>enemy->x&&player->y+player->height/2<enemy->y+enemy->height&&player->y+player->height/2>enemy->y)
							PlayerDead();
					}
					else if(enemy->action==SHUIMUINCREASE)
					{
						enemy->y--;
						if(enemy->y<-offsetYMax[level-1])
							enemy->type=0;
					}
				}
				if(enemy->ctr==0)
				{
					if(enemy->action==INCREASE)
					{
						enemy->type=0;
					}
					else if(enemy->action==OPEN)
					{
						for(TInt j=0;j<70;j++)
						{
							if(sprite[j].type==BLACK||sprite[j].type==WHITE)
								sprite[j].type=0;
						}
						enemy->action=EAT;
						enemy->ctr=9;
					}
					else if(enemy->action==EAT)
					{
						enemy->action=CLOSE;
						enemy->ctr=25;
					}
					else if(enemy->action==CLOSE)
					{
						InitBounus(*enemy);
						enemy->action=OPEN;
						enemy->ctr=50;
					}
					else if(enemy->action==BUBBLEINCREASE)
					{
						TInt r=(Math::Rand(seed))%10;
						if(r>3)
							enemy->y-=2;
						else if(r>1)
							enemy->y-=1;
						if(counter%3==0)
						{
							TInt s=(Math::Rand(seed))%5-2;
							enemy->x+=s;
						}
						if(enemy->y<-offsetYMax[level-1])
							enemy->type=0;
					}
					else if(enemy->action==BUBBLEBOUNUSINCREASE)
					{
						enemy->y-=2;
						if(enemy->y<-offsetYMax[level-1])
							enemy->type=0;
					}
					else if(enemy->action==HIT)
					{
						enemy->x+=3-6*(enemy->direction);
						if(enemy->x<offsetXMin[level-1]-enemy->width||enemy->x>screenWidth+offsetXMax[level-1])
							enemy->type=0;
					}
					else if(enemy->action==SHUIMUINCREASE)
					{
						enemy->ctr=20;
					}
					
					//	主角进入敌人视线之内
					if(newCtr==0&&freezeCtr==0&&enemy->type<20&&player->x+player->width>enemy->x-enemy->sight&&player->x<enemy->x+enemy->width+enemy->sight&&player->y+player->height>enemy->y-enemy->sight&&player->y<enemy->y+enemy->height+enemy->sight)
					{
						TInt randomAction=(Math::Rand(seed))%10;
						if(randomAction<1)
						{
							enemy->action=IDLE;
							enemy->ctr=27;
						}
						else if(randomAction<8)
						{
							if(enemy->level>player->level)
								enemy->action=MOVENEAR;
							else
								enemy->action=MOVEFAR;
							enemy->ctr=27;
						}
						else
						{
							if(enemy->level>player->level)
								enemy->action=MOVEFAR;
							else
								enemy->action=MOVENEAR;
							enemy->ctr=27;
						}
					}
					else if(enemy->type<20&&freezeCtr==0)
					{
						//主角在敌人视线之外
						if(enemy->x<-enemy->width&&enemy->direction==LEFT||enemy->x>screenWidth&&enemy->direction==RIGHT)
						{
							enemy->action=TURN;
							enemy->ctr=9;
						}
						if(enemy->direction==RIGHT)
						{
							enemy->x++;
						}
						else if(enemy->direction==LEFT)
						{
							enemy->x--;
						}
						if(counter%3==0)
						{
							TInt r=(Math::Rand(seed))%3-1;
							enemy->y+=r;
							if(enemy->y<BOARDHEIGHT)
								enemy->y=BOARDHEIGHT;
							if(enemy->y>screenHeight-enemy->height)
								enemy->y=screenHeight-enemy->height;
						}
					}
				}
				if(deadCtr==0&&enemy->type>0&&(enemy->type<27||enemy->type==SHARK||enemy->type==SHUIMU)&&player->x<enemy->x+enemy->width&&player->x+player->width>enemy->x&&player->y<enemy->y+enemy->height&&player->y+player->height>enemy->y)
				{
					if(player->level>=enemy->level&&gameOverCtr==0)
					{
						KillEnemy(enemy);
						player->action=KILL;
						player->ctr=6;
						if(enemy->level==SMALL)
							smallEaten++;
						if(enemy->level==MIDDLE)
							middleEaten++;
						if(enemy->level==LARGE)
							largeEaten++;
					}else if(freezeCtr==0&&newCtr==0&&gameOverCtr==0)
					{
						if(enemy->type!=SHUIMU)
							PlayerDead();
						else{
							player->action=STUN;
							player->ctr=20;
						}
					}
				}
			}
		}
}

void CModelGame::RandomShark()
{
	TInt r=(Math::Rand(seed))%150;
	if(r==0)
	{
		sharkCtr=250;
		InitShark();
	}
}

void CModelGame::InitShark()
{
	SP* shark=GetFreeSprite();
		if(shark!=NULL)
		{
			shark->type=SHARK;
			shark->level=HUGE;
			shark->width=90;
			shark->height=32;
			TInt r=(Math::Rand(seed))%2;
			shark->x=-shark->width+offsetXMin[level-1]+(screenWidth+shark->width-offsetXMin[level-1]+offsetXMax[level-1])*r;
			shark->direction=r;
			TInt s=(Math::Rand(seed)%(screenHeight+offsetYMax[level-1]-shark->height))-offsetYMax[level-1];
			shark->y=s;
			shark->action=HIT;
		}
}

void CModelGame::RandomShuimu()
{
	TInt r=(Math::Rand(seed))%100;
		if(r==0)
		{
			InitShuimu();
		}
}

void CModelGame::InitShuimu()
{
	SP* shuimu=GetFreeSprite();
		if(shuimu!=NULL)
		{
			shuimu->type=SHUIMU;
			shuimu->level=HUGE;
			shuimu->width=28;
			shuimu->height=35;
			TInt r=(Math::Rand(seed))%(screenWidth-offsetXMin[level-1]+offsetXMax[level-1]-shuimu->width)+offsetXMin[level-1];
			shuimu->x=r;
			shuimu->y=screenHeight+offsetY;
			shuimu->action=SHUIMUINCREASE;
			shuimu->ctr=14;
		}
}

void CModelGame::KillEnemy(SP *enemy)
{
	if(enemy->type<20)
	{
			InitEnemy(enemy->type,enemy->level);
			InitScore((enemy->level+1)*20,enemy->x,enemy->y);
	}
	else if(enemy->type<22)
		{
			if(enemy->type==WHITE)
			{
				TInt r=(Math::Rand(seed))%3+1;
				InitScore(60*r,enemy->x,enemy->y);
		}else
		{
				if(player->level<LARGE)
				{
					player->level++;
					if(player->level==MIDDLE)
						collected=goal[level-1]/3;
					else
						collected=(goal[level-1]*2)/3;
				}
				else
				{
					collected=goal[level-1];
					gameState=LEVELCOMPLETE;
					levelCompleteCtr=100;
				}
			}
		}
		else if(enemy->type==SEASTAR)
		{
			InitScore(60,enemy->x,enemy->y);
		}
		else if(enemy->type==DOUBLE)
		{
			doubleCtr=100;
		}
		else if(enemy->type==EXTRALIFE)
		{
			rest++;
		}
		else if(enemy->type==SPEED)
		{
			speedCtr=100;
		}
		else if(enemy->type==FREEZE)
		{
			freezeCtr=100;
		}
		enemy->type=0;
}

void CModelGame::InitScore(TInt value, TInt x, TInt y)
{
	if(doubleCtr>0){
			score+=(value*hit);
			collected+=(value*hit);
		}
		else{
			score+=(value*hit)/2;
			collected+=(value*hit)/2;
		}
		if(collected>goal[level-1]/3&&player->level==SMALL)//超过目标得分的1/3变成中等大小
		{
			yummyCtr=50;
			player->level=MIDDLE;
			player->width=20;
			player->height=17;
		}
		if(collected>goal[level-1]*2/3&&player->level==MIDDLE)//超过目标得分的2/3变成最大
		{
			yummyCtr=50;
			player->level=LARGE;
			player->width=37;
			player->height=28;
		}
		if(collected>=goal[level-1]){
			gameState=LEVELCOMPLETE;
			levelCompleteCtr=100;
		}
		SP* score=GetFreeSprite();
		if(score!=NULL){
			score->type=SCORE;
			score->level=9999;
			score->ctr=15;
			score->action=INCREASE;
			score->x=x;
			score->y=y;
			if(doubleCtr>0)
				score->value=(value*hit);
			else
				score->value=(value*hit)/2;
		}
}

void CModelGame::PlayerDead()
{
	if(rest==0)
			gameOverCtr=100;
		else{
			rest--;
			TInt bl=player->level;
			player->type=0;
			InitPlayer();
			deadCtr=50;
			newCtr=100;
			player->level=bl;
			if(player->level==SMALL)
				collected=0;
			else if(player->level==MIDDLE)
				collected=goal[level-1]/3;
			else if(player->level==LARGE)
				collected=(goal[level-1]*2)/3;
		}
}

void CModelGame::InitBounus(const SP &perl)
{
	SP* bounus=GetFreeSprite();
		if(bounus!=NULL)
		{
			TInt r=(Math::Rand(seed))%10;
			if(r<2)
				bounus->type=NULL;
			else if(r<3)
				bounus->type=BLACK;
			else
				bounus->type=WHITE;
			bounus->level=SMALL;
			bounus->width=8;
			bounus->height=9;
			bounus->x=perl.x+7;
			bounus->y=perl.y+7;
			bounus->action=BOUNUS;
			bounus->ctr=0;
		}
}

void CModelGame::InitLevel(TInt level)
{
	collected=0;
	smallEaten=0;
	middleEaten=0;
	largeEaten=0;
	for(TInt i=0;i<70;i++)
	{
		sprite[i].type=0;
	}
	InitPlayer();
	newCtr=50;
	AddEnemy();
}

void CModelGame::UpdateMenu()
{
	if (iSystem->KeyState(iSystem->OkKey())&&(lastMenuKey!=iSystem->OkKey()))//(keySoftLeft||keyFire)
	{
			lastMenuKey = iSystem->OkKey();
			switch(menuIndex)
			{
				case 0:
					gameState=INTRO;
					NewGame();
					pauseFlag=EFalse;
					break;
				case 3:
					hasSound=!hasSound;
					iSystem->ToggleAudio();
					break;
				case 1:
					gameState=HELP;
					helpY=76;
					break;
				case 2:
					gameState=ABOUT;
					break;
				case 4:
					//iSystem->ToggleAudio();
						isRunning=EFalse;
						iSystem->PrepareExit();
					break;
				case 5:
					gameState=PLAY;
					pauseFlag=EFalse;
					//keySoftRight=EFalse;
					break;
			}
	}else if ((iSystem->KeyState(EStdKeyLeftArrow))&&(lastMenuKey!=EStdKeyLeftArrow))
		{
			//keyLeft=EFalse;
			lastMenuKey = EStdKeyLeftArrow;
			if(resumeFlag)
			{
				menuIndex--;
				menuIndex=(menuIndex+6)%6;
			}else{
				menuIndex--;
				menuIndex=(menuIndex+6-1)%(6-1);
			}
		}else if ((iSystem->KeyState(EStdKeyRightArrow))&&(lastMenuKey!=EStdKeyRightArrow))
		{
			//keyRight=EFalse;
			lastMenuKey = EStdKeyRightArrow;
			if(resumeFlag){
				menuIndex++;
				menuIndex=(menuIndex+6)%6;
			}else{
				menuIndex++;
				menuIndex=(menuIndex+6-1)%(6-1);
			}
		}
}

void CModelGame::NewGame()
{
	CleanSprites();
	level=1;
	hit=2;
	rest=2;
	newCtr=50;
	yummyCtr=50;
	score=0;
	InitPlayer();
	AddEnemy();
	smallEaten=0;
	middleEaten=0;
	largeEaten=0;
	smallCtr=0;
	middleCtr=0;
	largeCtr=0;
	freezeCtr=0;
	speedCtr=0;
	doubleCtr=0;
	sharkCtr=0;
	congratulationsCtr=0;
	deadCtr=0;
	gameOverCtr=0;
	collected=0;
}

void CModelGame::CleanSprites()
{
	for(TInt i=0;i<70;i++)
		{
			sprite[i].type=0;
		}
}

void CModelGame::UpdateAbout()
{
	if (iSystem->KeyState( iSystem->BackKey() ))//(keySoftRight)
	{
		gameState=MENU;
	}
}

void CModelGame::UpdateHelp()
{
	if (iSystem->KeyState(iSystem->BackKey()))
		{
			gameState=MENU;
		}
		if ((iSystem->KeyState(EStdKeyUpArrow) || (iSystem->KeyState(50)))&&helpY>-100 && (lastMenuKey != EStdKeyUpArrow))
		{
			//keyUp=false;
			lastMenuKey = EStdKeyUpArrow;
			helpY-=16;
		}
		if((iSystem->KeyState(EStdKeyDownArrow) || (iSystem->KeyState(56)))&&helpY<76 && (lastMenuKey != EStdKeyDownArrow))
		{
			//keyDown=false;
			lastMenuKey = EStdKeyDownArrow;
			helpY+=16;
		}
}

void CModelGame::ReleaseLastKey()
{
	lastMenuKey = 0;
}

void CModelGame::InitConstData()
{
	MENU=4,
	PLAY=0,
	SHARK=27,
	PLAYER=1,
	WHITE=20,
	SEASTAR=22,
	DOUBLE=23,
	EXTRALIFE=24,
	SPEED=25,
	FREEZE=26,
	SHUIMU=9995,
	BUBBLE1=9996,
	BUBBLE2=9997,
	PERL=9998,
	SCORE=9999,
	BLACK=21,
	INTRO=1,
	LEVELCOMPLETE=2,
	ANALYS=3,
	ABOUT=5,
	HELP=6,
	CONGRATULATIONS=7,
	RIGHT=0,
	LEFT=1,
	SWIM=0,
	TURN=1,
	IDLE=2,
	MOVENEAR=3,
	MOVEFAR=4,
	INCREASE=5,
	OPEN=6,
	EAT=7,
	CLOSE=8,
	BOUNUS=9,
	BUBBLEINCREASE=10,
	BUBBLEBOUNUSINCREASE=11,
	HIT=12,
	KILL=13,
	SHUIMUINCREASE=14,
	STUN=15,
	BOARDHEIGHT=47,
	SMALL=0,
	MIDDLE=1,
	LARGE=2,
	HUGE=3;
}



void CModelGame::DrawPauseHint(CBitmap &aTarget, CFbsBitGc &aGc)
{
	aGc.SetPenColor( TRgb(0xFE, 0xFE, 0xFE) );
	aGc.SetPenStyle( CGraphicsContext::ESolidPen );
	const CFont* font = CEikonEnv::Static()->NormalFont();
	aGc.UseFont(font);
	TBuf<60> text;
	CEikonEnv::Static()->ReadResource(text, R_PAUSE_HINT);
	TInt w = font->TextWidthInPixels(text);
	aGc.DrawText(text, TPoint(screenWidth-w-2,screenHeight-2));
	aGc.DiscardFont(); 
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?