📄 tankframe.cpp
字号:
tank->timefire=dwTime;
lpDSBFire->SetCurrentPosition(0);//播放音乐
lpDSBFire->Play(0,0,0);
}
}
if(tank->CtrlD)//按下了方向键
{
old=abs(tank->speedx+tank->speedy);//当前坦克绝对速度
switch(tank->CtrlD)
{
case 1://左
{
if(tank->frame==2)tank->frame=6;
else tank->frame=2;
if((tank->y-TANK_YU)%12<6)tank->y=(tank->y-TANK_YU)/12*12+TANK_YU;
else tank->y=(tank->y-TANK_YU)/12*12+TANK_YU+12;//将坦克坐标格式化成最近的12的倍数
tank->speedy=0;tank->speedx=-old;break;
}
case 2://上
{
if(tank->frame==0)tank->frame=4;
else tank->frame=0;
if((tank->x-TANK_XL)%12<6)tank->x=(tank->x-TANK_XL)/12*12+TANK_XL;
else tank->x=(tank->x-TANK_XL)/12*12+TANK_XL+12;
tank->speedy=-old;tank->speedx=0;break;
}
case 3://右
{
if(tank->frame==3)tank->frame=7;
else tank->frame=3;
if((tank->y-TANK_YU)%12<6)tank->y=(tank->y-TANK_YU)/12*12+TANK_YU;
else tank->y=(tank->y-TANK_YU)/12*12+TANK_YU+12;
tank->speedy=0;tank->speedx=old;break;
}
case 4://下
{
if(tank->frame==1)tank->frame=5;
else tank->frame=1;
if((tank->x-TANK_XL)%12<6)tank->x=(tank->x-TANK_XL)/12*12+TANK_XL;
else tank->x=(tank->x-TANK_XL)/12*12+TANK_XL+12;
tank->speedy=old;tank->speedx=0;break;
}
}
xo=tank->x;
yo=tank->y;
tank->x+=get(tank->speedx*FrameRatio);
tank->y+=get(tank->speedy*FrameRatio);//四舍五入计算坦克的新坐标
if(tank->x>TANK_XR-24)tank->x=TANK_XR-24;
if(tank->x<TANK_XL)tank->x=TANK_XL;
if(tank->y>TANK_YD-24)tank->y=TANK_YD-24;
if(tank->y<TANK_YU)tank->y=TANK_YU;//越界检测
/*与每一辆地方坦克的相互作用*/
src1.left=tank->x;
src1.top=tank->y;
src1.right=src1.left+24;
src1.bottom=src1.top+24;
etank=top->next;
while(etank)
{
src2.left=etank->x;
src2.top=etank->y;
src2.right=src2.left+24;
src2.bottom=src2.top+24;
if((etank->x-TANK_XL)%12)//敌方坦克占36*36像素的大小
{
src2.left-=(etank->x-TANK_XL)%12;
src2.right+=(12-(etank->x-TANK_XL)%12);
}
if((etank->y-TANK_YU)%12)
{
src2.top-=(etank->y-TANK_YU)%12;
src2.bottom+=(12-(etank->y-TANK_YU)%12);
}
if(CheckIn(src2,src1))
{
tank->x=xo;
tank->y=yo;
break;
}
etank=etank->next;
}
/*与我方坦克相互作用*/
for(k=0;k<config.playernum;k++)
{
if(tank->type==k)continue;
src2.left=players[k].x;
src2.top=players[k].y;
src2.right=src2.left+24;
src2.bottom=src2.top+24;
if((players[k].x-TANK_XL)%12)//同上
{
src2.left-=(players[k].x-TANK_XL)%12;
src2.right+=(12-(players[k].x-TANK_XL)%12);
}
if((players[k].y-TANK_YU)%12)
{
src2.top-=(players[k].y-TANK_YU)%12;
src2.bottom+=(12-(players[k].y-TANK_YU)%12);
}
if(CheckIn(src2,src1))
{
tank->x=xo;
tank->y=yo;
break;
}
}
if(bons.valid==1)//有宝物
{
src2.left=bons.x;
src2.top=bons.y;
src2.right=src2.left+24;
src2.bottom=src2.top+24;
if(CheckIn(src2,src1))
{
lpDSBBon->SetCurrentPosition(0);
lpDSBBon->Play(0,0,0);//播放音乐
switch(bons.type)
{
case 1:if(tank->speed<54)tank->speed=tank->speed*3/2;break;//吃星星
case 2:tank->lifenum++;break;//吃十字架
case 3:tank->force++;break;//吃枪
case 4://吃钢块
{
mp.array[35][21]=5;
mp.array[34][21]=5;
mp.array[33][21]=5;
mp.array[33][22]=5;
mp.array[33][23]=5;
mp.array[33][24]=5;
mp.array[34][24]=5;
mp.array[35][24]=5;
DisMap();
break;
}
case 5://吃帽子
{
tank->status=3;
tank->timestart=timeGetTime();
break;
}
case 6://吃怀表
{
mode.status=1;
mode.timestart=timeGetTime();
break;
}
case 7://吃炸弹
{
lpDSBExplo->SetCurrentPosition(0);
lpDSBExplo->Play(0,0,0);//播放音乐
etank=top->next;
while(etank)
{
etankm=etank->next;
CreateAppl(etank->x-6,etank->y-6,0);
delete etank;
etank=etankm;
}
top->next=NULL;
end=top;
mode.tanknum=0;
break;
}
case 8://吃翅膀
{
if(tank->speedx&&abs(tank->speedx)<15)
tank->speedx=(abs(tank->speedx)+3)*tank->speedx/abs(tank->speedx);
else if(tank->speedy&&abs(tank->speedy)<15)
tank->speedy=(abs(tank->speedy)+3)*tank->speedy/abs(tank->speedy);
break;
}
}
bons.valid=0;//宝物被吃掉了
}
}
/*我方坦克与地图元素相互作用*/
i[0]=tank->x-TANK_XL;
j[0]=tank->y-TANK_YU;
i[1]=i[0];
j[1]=j[0];
if(tank->speedx>0)
{
i[0]+=24;i[1]+=24;
j[1]+=12;
}
if(tank->speedx<0)
{
j[1]+=12;
}
if(tank->speedy>0)
{
i[1]+=12;
j[0]+=24;j[1]+=24;
}
if(tank->speedy<0)
{
i[1]+=12;
}//同子弹
for(l=0;l<2;l++)
{
i[l]/=12;j[l]/=12;
if(mp.array[j[l]][i[l]]!=0&&mp.array[j[l]][i[l]]!=7)//若前方是不可通过的元素坦克不移动
{
tank->x=xo;
tank->y=yo;
break;
}
}
}
}
/*---------------------------------------------------
更新敌方坦克
----------------------------------------------------*/
void CTankFrame::UpdateTank()
{
DWORD dwTime,dwDelta;
double FrameRatio;
int i[2],j[2],k=0,l,m;
LPTANK tank,etank;
RECT src1,src2;
int rnd;
int xo,yo;
if(mode.tanknum<mp.tanknum&&(mp.tank[0]+mp.tank[1]+mp.tank[2]+mp.tank[3])>0)
//如果剩余数量敌方坦克大于0同时同现坦克数量小于最大同现坦克数量则生成坦克
{
do
{
rnd=rand()%4;
}while(mp.tank[rnd]==0);//随机生成坦克种类
l=rand()%3;
tank=top->next;
m=1;
/*位置冲突检测*/
while(tank)
{
if(((tank->x<=(l*264+TANK_XL+24+24))&&(tank->x>=(l*264+TANK_XL-24)))
&&(tank->y<=(TANK_YU+24)&&tank->y>=TANK_YU))
{
m=0;
break;
}
tank=tank->next;
}
for(int n=0;n<config.playernum;n++)
{
if(((players[n].x<=(l*264+TANK_XL+24+24))&&(players[n].x>=(l*264+TANK_XL-24)))
&&(players[n].y<=(TANK_YU+24)&&players[n].y>=TANK_YU))
{
m=0;
break;
}
}
if(m==1)//如果没有位置冲突则生成
{
CreateTank(l*264+TANK_XL,TANK_YU,rnd);
mp.tank[rnd]--;
mode.tanknum++;
}
}
/*循环更新每一辆敌方坦克*/
tank=top->next;
while(tank)
{
dwTime=timeGetTime();
dwDelta=dwTime-tank->timeupdate;
FrameRatio=float(dwDelta)/float(FRAME_RATE);
if((dwTime-tank->timeupdate)<1000/FRAME_RATE)goto end;
tank->timeupdate=dwTime;
if(tank->status==0)
{
if((dwTime-tank->timestart)>config.borntime)
{
tank->timestart=dwTime;
tank->superupdate=dwTime;
tank->status=1;
tank->frame=1;
tank->force=1;
}//生成超时
if((dwTime-tank->superupdate)>50)
{
tank->frame=tank->frame+tank->force;
if(tank->frame==13)tank->force=-1;
else if(tank->frame==10)tank->force=1;
tank->superupdate=dwTime;
}//保护超时
goto end;
}
else if(tank->status==1&&(dwTime-tank->timestart)>config.supertime)//长保护超时
tank->status=2;
if(mode.status==1)goto end;//如果我方吃了怀表
if(rand()%100<1)GetnewSpeed(tank);//有1%的可能性改变方向
xo=tank->x;
yo=tank->y;
if(rand()%100<2&&(dwTime-tank->timefire)>300)//每两颗子弹生成间隔300ms且有2%的可能性产生
{
if(tank->speedx!=0)//产生x方向子弹
CreateShot(tank->x+10,tank->y+10,tank->speedx*tank->speed/abs(tank->speedx),
0,2,tank->force);
else//产生y方向子弹
CreateShot(tank->x+10,tank->y+10,0,
tank->speedy*tank->speed/abs(tank->speedy),2,tank->force);
tank->timefire=dwTime;
}
tank->x+=get(tank->speedx*FrameRatio);
tank->y+=get(tank->speedy*FrameRatio);//取得四舍五入后的新坐标
/*越界检测*/
if(tank->x>TANK_XR-24)
{
tank->x=TANK_XR-24;
GetnewSpeed(tank);
goto end;
}
if(tank->x<TANK_XL)
{
tank->x=TANK_XL;
GetnewSpeed(tank);
goto end;
}
if(tank->y>TANK_YD-24)
{
tank->y=TANK_YD-24;
GetnewSpeed(tank);
goto end;
}
if(tank->y<TANK_YU)
{
tank->y=TANK_YU;
GetnewSpeed(tank);
goto end;
}
/*该坦克与每一辆我方坦克相互作用*/
src1.left=tank->x;
src1.top=tank->y;
src1.right=tank->x+24;
src1.bottom=tank->y+24;
for(m=0;m<config.playernum;m++)
{
src2.left=players[m].x;
src2.top=players[m].y;
src2.right=src2.left+24;
src2.bottom=src2.top+24;
if((players[m].x-TANK_XL)%12)
{
src2.left-=(players[m].x-TANK_XL)%12;
src2.right+=(12-(players[m].x-TANK_XL)%12);
}
if((players[m].y-TANK_YU)%12)
{
src2.top-=(players[m].y-TANK_YU)%12;
src2.bottom+=(12-(players[m].y-TANK_YU)%12);
}//我方坦克占有36*36
if(CheckIn(src2,src1))//有冲突不动
{
tank->x=xo;
tank->y=yo;
GetnewSpeed(tank);
goto end;
}
}
/*该坦克与每一辆敌方坦克相互作用*/
etank=top->next;
while(etank)
{
if(etank->x!=tank->x||etank->y!=tank->y)
{
src2.left=etank->x;
src2.top=etank->y;
src2.right=src2.left+24;
src2.bottom=src2.top+24;
if((etank->x-TANK_XL)%12)
{
src2.left-=(etank->x-TANK_XL)%12;
src2.right+=(12-(etank->x-TANK_XL)%12);
}
if((etank->y-TANK_YU)%12)
{
src2.top-=(etank->y-TANK_YU)%12;
src2.bottom+=(12-(etank->y-TANK_YU)%12);
}
if(CheckIn(src2,src1))
{
tank->x=xo;
tank->y=yo;
GetnewSpeed(tank);
goto end;
}
}
etank=etank->next;
}
/*该坦克与地图元素相互作用同UpdateOtank*/
i[0]=tank->x-TANK_XL;
j[0]=tank->y-TANK_YU;
i[1]=i[0];
j[1]=j[0];
if(tank->speedx>0)
{
i[0]+=24;i[1]+=24;
j[1]+=12;
}
if(tank->speedx<0)
{
j[1]+=12;
}
if(tank->speedy>0)
{
i[1]+=12;
j[0]+=24;j[1]+=24;
}
if(tank->speedy<0)
{
i[1]+=12;
}
for(l=0;l<2;l++)
{
i[l]/=12;j[l]/=12;
if(mp.array[j[l]][i[l]]!=0&&mp.array[j[l]][i[l]]!=7)
{
tank->x=xo;
tank->y=yo;
GetnewSpeed(tank);
break;
}
}
end:
tank=tank->next;
}
}
/*-----------------------------------------
更新爆炸效果
------------------------------------------*/
void CTankFrame::UpdateAppl()
{
DWORD dwTime;
LPAPPL appl,applm;
dwTime=timeGetTime();
appl=topa->next;
while(appl!=NULL)//循环更新每一个爆炸效果
{
if(appl->type==0)
{
if((dwTime-appl->timeupdate)>100)//100ms更新一幅画
{
appl->frame++;
appl->timeupdate=dwTime;
}
if(appl->frame>5)//共6幅
{
applm=appl->prev;
Remove(appl);
appl=applm;
goto end;
}
}
end:
appl=appl->next;
}
}
/*--------------------------------------------
取得敌方坦克新的方向的速度
---------------------------------------------*/
void CTankFrame::GetnewSpeed(LPTANK tank)
{
int old,dir;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -