📄 gamemain.cpp
字号:
if(key.up)
{
doraemon.Y-=speed;
}
if(key.a)
{
if(doraemon.lpanimate==&dora_anim[1]||doraemon.lpanimate==&dora_anim[3])
{
doraemon.lpanimate=&dora_anim[3];
if(key.a_d)
{
int index;
if((index=GetEtcIndex())!=-1)
{
etc[index].X=doraemon.X+doraemon.width;
etc[index].Y=doraemon.Y;
etc[index].Xstart=doraemon.X+doraemon.width;
etc[index].Ystart=doraemon.Y;
etc[index].width=28;
etc[index].height=10;
etc[index].relation=CHARACTER_ANIMATE;
etc[index].lpanimate=&etcanim[1];
etc[index].type=MULTI_POINTER_TO_ONE_ANIMATE|(BULLET_DORAEMON_RIGHT<<16);
etc[index].visible=1;
etc[index].intvalue[ATP]=doraemon.intvalue[ATP]+rand()%5;
etc[index].doublevalue[SPEED]=7;
}
}
}
else
{
doraemon.lpanimate=&dora_anim[2];
if(key.a_d)
{
int index;
if((index=GetEtcIndex())!=-1)
{
etc[index].X=doraemon.X-28;
etc[index].Y=doraemon.Y;
etc[index].Xstart=doraemon.X-28;
etc[index].Ystart=doraemon.Y;
etc[index].width=28;
etc[index].height=10;
etc[index].relation=CHARACTER_ANIMATE;
etc[index].lpanimate=&etcanim[0];
etc[index].type=MULTI_POINTER_TO_ONE_ANIMATE|(BULLET_DORAEMON_LEFT<<16);
etc[index].visible=1;
etc[index].intvalue[ATP]=doraemon.intvalue[ATP]+rand()%5;
etc[index].doublevalue[SPEED]=7;
}
}
}
}
else
{
if(doraemon.lpanimate==&dora_anim[1]||doraemon.lpanimate==&dora_anim[3])
{
doraemon.lpanimate=&dora_anim[1];
}
else
{
doraemon.lpanimate=&dora_anim[0];
}
}
if(key.b_d&&item[ITEM_CATE]>0)
{
int index;
if((index=GetEtcIndex())!=-1)
{
etc[index].X=doraemon.X;
etc[index].Y=doraemon.Y-20;
etc[index].Xstart=doraemon.X;
etc[index].Ystart=doraemon.Y-20;
etc[index].width=32;
etc[index].height=10;
etc[index].relation=CHARACTER_ANIMATE;
etc[index].lpanimate=&etcanim[8];
etc[index].type=MULTI_POINTER_TO_ONE_ANIMATE|(ITEM_1_USE<<16);
etc[index].visible=1;
etc[index].intvalue[ACTION]=0;
etc[index].doublevalue[SPEED]=2;
}
item[ITEM_CATE]-=1;
doraemon.intvalue[HP]=doraemon.intvalue[HP_MAX];
}
//动画
doraemon.lpanimate->frame=doraemon.intvalue[FRAME];
if(key.down||key.up||key.right||key.left)
{
PlayAnimate(doraemon.lpanimate);
}
else
{
StopAnimate(doraemon.lpanimate);
}
doraemon.intvalue[FRAME]=doraemon.lpanimate->frame;
doraemon.intvalue[CUR]=doraemon.lpanimate->cur;
Xfocus=doraemon.X;
Yfocus=doraemon.Y;
if(Xfocus-X>WIDTH/2&&X+speed<=stage.maplength*32-WIDTH)
{
X+=speed;
}
if((Xfocus-X<WIDTH/2&&X-speed>=0)||X>stage.maplength*32-WIDTH)
{
X-=speed;
}
if(Yfocus-Y>HEIGHT/2&&Y+speed<=16*32-HEIGHT)
{
Y+=speed;
}
if((Yfocus-Y<HEIGHT/2&&Y-speed>=0)||Y>16*32-HEIGHT)
{
Y-=speed;
}
/////////////////////////////////////////////////////////////////////////////////////////////
//画屏幕范围地图
/////////////////////////////////////////////////////////////////////////////////////////////
int Xmin=((int)X)/32,Xmax=(((int)X)+WIDTH)/32,Ymin=((int)Y)/32,Ymax=(((int)Y)+HEIGHT)/32,Xstart=-(((int)X)%32),Ystart=-(((int)Y)%32);
for(i=Xmin;i<=Xmax;i++)
{
for(j=Ymin;j<=Ymax;j++)
{
SetGraphPos(&tile[stage.map[i][j]],Xstart+(i-Xmin)*32,Ystart+(j-Ymin)*32);
GraphToBack(&tile[stage.map[i][j]]);
}
}
int num=0; //统计排序对象总数
CHARACTER* c[sizeof(stage.scenery)/sizeof(CHARACTER)+sizeof(stage.animate)/sizeof(CHARACTER)+sizeof(etc)/sizeof(CHARACTER)+1]; //用于排序的指针数组
int clist[sizeof(stage.scenery)/sizeof(CHARACTER)+sizeof(stage.animate)/sizeof(CHARACTER)+sizeof(etc)/sizeof(CHARACTER)+1]; //用于排序序号的数组
memset(clist,0,sizeof(clist)); //初始化排序序号为0
for(i=0;i<sizeof(stage.scenery)/sizeof(CHARACTER);i++) //统计对象总数并定位显示位置
{
if(stage.scenery[i].visible)
{
stage.scenery[i].x=stage.scenery[i].X-X; //象幽灵一样的东西
stage.scenery[i].y=stage.scenery[i].Y-Y;
SetCharacterPos(&stage.scenery[i],stage.scenery[i].x,stage.scenery[i].y);
if(Act(stage.scenery[i].lpgraph->destrect,maprect)) //仅提取满足显示需要的对象
{
c[num]=&stage.scenery[i]; //获得对象的指针
num+=1;
}
}
}
for(i=0;i<sizeof(etc)/sizeof(CHARACTER);i++)
{
if(etc[i].visible)
{
switch(HIWORD(etc[i].type))
{
case BULLET_DORAEMON_LEFT:
etc[i].X-=etc[i].doublevalue[SPEED];
if(abs(etc[i].X-etc[i].Xstart)>300)
{
etc[i].visible=0;
etcnum=GetEtcUsed();
}
break;
case BULLET_DORAEMON_RIGHT:
etc[i].X+=etc[i].doublevalue[SPEED];
if(abs(etc[i].X-etc[i].Xstart)>300)
{
etc[i].visible=0;
etcnum=GetEtcUsed();
}
break;
case BULLET_CAT_RIGHT:
etc[i].doublevalue[AHEAD_SPEED]+=etc[i].doublevalue[AHEAD_A];
etc[i].X+=etc[i].doublevalue[AHEAD_SPEED];
etc[i].doublevalue[FLOAT_SPEED]+=etc[i].doublevalue[FLOAT_A];
etc[i].doublevalue[Z]+=etc[i].doublevalue[FLOAT_SPEED];
if(etc[i].doublevalue[Z]>10)
{
etc[i].visible=0;
etcnum=GetEtcUsed();
}
break;
case BULLET_CAT_LEFT:
etc[i].doublevalue[AHEAD_SPEED]+=etc[i].doublevalue[AHEAD_A];
etc[i].X+=etc[i].doublevalue[AHEAD_SPEED];
etc[i].doublevalue[FLOAT_SPEED]+=etc[i].doublevalue[FLOAT_A];
etc[i].doublevalue[Z]+=etc[i].doublevalue[FLOAT_SPEED];
if(etc[i].doublevalue[Z]>10)
{
etc[i].visible=0;
etcnum=GetEtcUsed();
}
break;
case BOWL_1:
etc[i].X+=etc[i].doublevalue[AHEAD_SPEED];
if(etc[i].intvalue[FRAME]+1==etc[i].lpanimate->surcount*etc[i].lpanimate->step)
{
etc[i].visible=0;
etcnum=GetEtcUsed();
}
break;
case BOWL_2:
etc[i].doublevalue[FLOAT_SPEED]+=etc[i].doublevalue[FLOAT_A];
etc[i].doublevalue[Z]+=etc[i].doublevalue[FLOAT_SPEED];
if(etc[i].doublevalue[Z]<-500)
{
etc[i].visible=0;
etcnum=GetEtcUsed();
}
break;
case BULLET_HACKCAT_LEFT:
etc[i].X-=etc[i].doublevalue[SPEED];
if(abs(etc[i].X-etc[i].Xstart)>WIDTH*5)
{
etc[i].visible=0;
etcnum=GetEtcUsed();
}
break;
case BULLET_HACKCAT_RIGHT:
etc[i].X+=etc[i].doublevalue[SPEED];
if(abs(etc[i].X-etc[i].Xstart)>WIDTH*5)
{
etc[i].visible=0;
etcnum=GetEtcUsed();
}
break;
case BULLET_HACKCAT_SMALL_LEFT:
etc[i].X-=etc[i].doublevalue[SPEED];
if(abs(etc[i].X-etc[i].Xstart)>WIDTH)
{
etc[i].visible=0;
etcnum=GetEtcUsed();
}
break;
case BULLET_HACKCAT_SMALL_RIGHT:
etc[i].X+=etc[i].doublevalue[SPEED];
if(abs(etc[i].X-etc[i].Xstart)>WIDTH)
{
etc[i].visible=0;
etcnum=GetEtcUsed();
}
break;
case ITEM_1:
etc[i].doublevalue[Z]-=etc[i].doublevalue[SPEED];
if(etc[i].doublevalue[Z]<-90)
{
etc[i].visible=0;
etcnum=GetEtcUsed();
}
break;
case ITEM_1_USE:
etc[i].doublevalue[Z]-=etc[i].doublevalue[SPEED];
if(etc[i].doublevalue[Z]<-90)
{
etc[i].visible=0;
etcnum=GetEtcUsed();
}
break;
case ITEM_2:
etc[i].doublevalue[Z]-=etc[i].doublevalue[SPEED];
if(etc[i].doublevalue[Z]<0)
{
_stprintf(strbuf,"+%d",etc[i].intvalue[SCORE]);
DrawString(etc[i].x,etc[i].y,strbuf);
DrawString(etc[i].x-1,etc[i].y-1,strbuf,0);
}
if(etc[i].doublevalue[Z]<-90)
{
etc[i].visible=0;
etcnum=GetEtcUsed();
}
break;
default:
break;
}
etc[i].x=etc[i].X-X;
etc[i].y=etc[i].Y-Y;
SetCharacterPos(&etc[i],etc[i].x,etc[i].y);
destrect=etc[i].lpanimate->graph[etc[i].intvalue[CUR]].destrect;
if(Act(destrect,maprect))
{
c[num]=&etc[i];
num+=1;
}
//动画
etc[i].lpanimate->frame=etc[i].intvalue[FRAME];
if(etc[i].intvalue[ACTION]!=0)
{
PlayAnimate(etc[i].lpanimate);
}
else
{
StopAnimate(etc[i].lpanimate);
}
etc[i].intvalue[FRAME]=etc[i].lpanimate->frame;
etc[i].intvalue[CUR]=etc[i].lpanimate->cur;
//毁灭
if((HIWORD(etc[i].type)==BULLET_DORAEMON_LEFT||HIWORD(etc[i].type)==BULLET_DORAEMON_RIGHT))
{
for(j=0;j<sizeof(stage.animate)/sizeof(CHARACTER);j++)
{
if(stage.animate[j].visible&&etc[i].visible)
{
if(Act(etc[i].colliderect,stage.animate[j].colliderect))
{
int index;
if((index=GetEtcIndex())!=-1)
{
etc[index].X=etc[i].X;
etc[index].Y=etc[i].Y;
etc[index].width=28;
etc[index].height=10;
etc[index].relation=CHARACTER_ANIMATE;
etc[index].lpanimate=&etcanim[2];
etc[index].type=MULTI_POINTER_TO_ONE_ANIMATE|(BOWL_1<<16);
etc[index].intvalue[ACTION]=1;
etc[index].doublevalue[AHEAD_SPEED]=((HIWORD(etc[i].type)==BULLET_DORAEMON_LEFT)?-2:2);
etc[index].visible=1;
}
if(etc[i].intvalue[ATP]-stage.animate[j].intvalue[DEF]>0)
stage.animate[j].intvalue[HP]-=etc[i].intvalue[ATP]-stage.animate[j].intvalue[DEF];
if(stage.animate[j].intvalue[HP]<=0)
{
int k,k_max=rand()%(stage.animate[j].width*stage.animate[j].height/100)+12;
for(k=0;k<k_max;k++)
{
if((index=GetEtcIndex())!=-1)
{
etc[index].X=stage.animate[j].X+(rand()%stage.animate[j].width-(stage.animate[j].width/2));
etc[index].Y=stage.animate[j].Y+(rand()%stage.animate[j].height*4-(stage.animate[j].height*4/2));
etc[index].width=28;
etc[index].height=10;
etc[index].relation=CHARACTER_ANIMATE;
etc[index].lpanimate=&etcanim[2];
etc[index].type=MULTI_POINTER_TO_ONE_ANIMATE|(BOWL_1<<16);
etc[index].intvalue[ACTION]=1;
etc[index].intvalue[FRAME]=rand()%etc[index].lpanimate->step*2;
etc[index].doublevalue[AHEAD_SPEED]=((HIWORD(etc[i].type)==BULLET_DORAEMON_LEFT)?-2:2);
etc[index].visible=1;
}
}
stage.animate[j].visible=0;
score+=stage.animate[j].intvalue[SCORE];
//道具掉落-铜锣烧
if(HIWORD(stage.animate[j].type)==0&&rand()%12==0)
{
if((index=GetEtcIndex())!=-1)
{
etc[index].X=stage.animate[j].X;
etc[index].Y=stage.animate[j].Y;
etc[index].width=32;
etc[index].height=10;
etc[index].relation=CHARACTER_ANIMATE;
etc[index].lpanimate=&etcanim[8];
etc[index].type=MULTI_POINTER_TO_ONE_ANIMATE|(ITEM_1<<16);
etc[index].intvalue[ACTION]=1;
etc[index].visible=1;
}
}
//道具掉落-钱币
if(HIWORD(stage.animate[j].type)==0
&&rand()%(15-(int)((double)doraemon.intvalue[HP]/(double)doraemon.intvalue[HP_MAX])*10)==0)
{
if((index=GetEtcIndex())!=-1)
{
etc[index].X=stage.animate[j].X;
etc[index].Y=stage.animate[j].Y;
etc[index].width=32;
etc[index].height=10;
etc[index].relation=CHARACTER_ANIMATE;
etc[index].lpanimate=&etcanim[9];
etc[index].type=MULTI_POINTER_TO_ONE_ANIMATE|(ITEM_2<<16);
etc[index].intvalue[ACTION]=1;
etc[index].visible=1;
}
}
enemynum=GetAnimateUsed();
}
etc[i].visible=0;
}
}
}
}
if(HIWORD(etc[i].type)==BULLET_CAT_RIGHT||HIWORD(etc[i].type)==BULLET_CAT_LEFT
||HIWORD(etc[i].type)==BULLET_HACKCAT_RIGHT||HIWORD(etc[i].type)==BULLET_HACKCAT_LEFT
||HIWORD(etc[i].type)==BULLET_HACKCAT_SMALL_RIGHT||HIWORD(etc[i].type)==BULLET_HACKCAT_SMALL_LEFT)
{
if(Act(etc[i].colliderect,doraemon.colliderect)&&doraemon.visible)
{
int index;
if((index=GetEtcIndex())!=-1)
{
etc[index].X=etc[i].X;
etc[index].Y=etc[i].Y;
etc[index].width=28;
etc[index].height=10;
etc[index].relation=CHARACTER_ANIMATE;
etc[index].lpanimate=&etcanim[2];
etc[index].type=MULTI_POINTER_TO_ONE_ANIMATE|(BOWL_1<<16);
etc[index].doublevalue[AHEAD_SPEED]=
((HIWORD(etc[i].type)==BULLET_CAT_LEFT||HIWORD(etc[i].type)==BULLET_HACKCAT_LEFT)?-2:2);
etc[index].intvalue[ACTION]=1;
etc[index].visible=1;
}
if(etc[i].intvalue[ATP]-doraemon.intvalue[DEF]>0&&Act(etc[i].colliderect,doraemon.colliderect)&&timer1==0)
doraemon.intvalue[HP]-=etc[i].intvalue[ATP]-doraemon.intvalue[DEF]; //timer1==0表示清关计时器的状态为0才会被击中
etc[i].visible=0;
if(doraemon.intvalue[HP]<=0&&doraemon.visible)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -