⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tankframe.cpp

📁 疯狂坦克源代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
   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 + -