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