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

📄 tank1.cpp

📁 vc编写的超级坦克源码,vc6编写
💻 CPP
📖 第 1 页 / 共 2 页
字号:
				m_Normal->Sety(y+TANKHEIGHT-BULLETHEIGHT);
				break;
			case RIGHT:
				m_Normal->Setx(x+TANKWIDTH);
				m_Normal->Sety(y+TANKHEIGHT-BULLETHEIGHT);
				break;
			}
			m_Normal->SetGame(m_pGame);
			m_Normal->SetDamage(m_nDamage);
			m_Normal->SetBulletBmp(m_pGame->m_pBulletBuffer);
			m_Normal->SetBelong(Belong());
			m_pGame->m_BulletList.AddHead(m_Normal);
		}
		if(m_nDoubleBullet==3)
		{
		   m_Normal=new CNormalBullet;
   			if(m_Normal)
			{
			 SetBullet();
			 m_pGame->m_BulletList.AddHead(m_Normal);		
			}
		}
		m_pGame->m_wavShoot.Play();
	}
}

void CTank::SetCell(Cell type,BYTE mask)
{
	for(int i=m_nX;i<m_nX+2;i++)
		for(int j=m_nY;j<m_nY+2;j++)
			m_pGame->m_TankMap.SetMapCell(i,j,type,mask);
}

void CTank::DestroyTank()
{
	if(m_bmpTank)
	{
		m_bmpTank->Release();
		m_bmpTank=NULL;
	}
	if(m_bmpTankState)
	{
		m_bmpTankState->Release();
		m_bmpTankState=NULL;
	}	
}

void CTank::DrawTank(LPDIRECTDRAWSURFACE pdds)
{
	RECT rc;
	rc.left=m_nDirection * TANKWIDTH;
	rc.top=m_nSkin*TANKHEIGHT;
	rc.right=rc.left + TANKWIDTH;
	rc.bottom=rc.top + TANKHEIGHT;
	pdds->BltFast( x, y, m_bmpTank, &rc, DDBLTFAST_SRCCOLORKEY | DDBLTFAST_WAIT );
	rc.left=0;rc.top=0;rc.right=32;rc.bottom=5;
	pdds->BltFast( x, y-6, m_bmpTankState, &rc, DDBLTFAST_WAIT );
	rc.top=5;rc.bottom=10;
	if(Belong()==1||Belong()==2)rc.right=int(32 * float(m_nTankLife)/200);
	if(Belong()==3)
	{
		switch(m_nSkin)
		{
			case 0:
			case 1:
			case 2:
			case 3:
				rc.right=int(32 * float(m_nTankLife)/100);
				break;
			case 4:
			case 5:
				rc.right=int(32 * float(m_nTankLife)/150);
			    break;
		    
			case 6:
				rc.right=int(32 * float(m_nTankLife)/200);
				break;
			case 7:
				rc.right=int(32 * float(m_nTankLife)/250);
				break;			
			case 8:
				rc.right=int(32 * float(m_nTankLife)/300);
				break;
		}
	}
	pdds->BltFast( x, y-6, m_bmpTankState, &rc, DDBLTFAST_WAIT );
}

int CTank::MapxyTonXnY()
{
	int ret=0;
	m_nX= (x==0 ? 0 : x/TANKMAPCELL);
	m_nY= (y==0 ? 0 : y/TANKMAPCELL);
	return ret;
}

Obj CTank::HasObject(int xpos, int ypos)
{
	Obj object;
    BOOL Result=FALSE;
	CRect rec(xpos,ypos,xpos+TANKWIDTH,ypos+TANKHEIGHT);
	CRect recEgg;
	POSITION position,preposition;
	position=m_pGame->m_Egg.GetHeadPosition();
	CellType celltype;
	while(position)
	{
	   preposition=position;
	   CEgg * p=m_pGame->m_Egg.GetNext(position);
	   recEgg.SetRect(p->m_nXPosition,p->m_nYPosition,p->m_nXPosition+TANKWIDTH,p->m_nYPosition+TANKHEIGHT);
	   CRect rc;
	   Result=rc.IntersectRect(&this->rect,&recEgg);
	   int count=0;
	   if(Result)
	   {
		   switch(p->GetIndex())
		   {
		   case 0:
			    m_nTankLife+=100;
			   	if(Belong()==1||Belong()==2)
				{
					if(m_nTankLife>200)m_nTankLife=200;
				}
				if(Belong()==3)
				{
					switch(m_nSkin)
					{
						case 0:
						case 1:
						case 2:
						case 3:
							if(m_nTankLife>100)m_nTankLife=100;
							break;
						case 4:
						case 5:
							if(m_nTankLife>150)m_nTankLife=150;
							break;					
						case 6:
							if(m_nTankLife>200)m_nTankLife=200;
							break;
						case 7:
							if(m_nTankLife>250)m_nTankLife=250;
							break;			
						case 8:
							if(m_nTankLife>300)m_nTankLife=300;
							break;
					}
				}
				break;
		   case 1:
			   m_nDamage+=50;
			   if(m_nDamage>=300)m_nDamage=300;
			   if(m_nDamage<0)m_nDamage=50;
			   tempDamage=m_nDamage;
			   break;
		   case 2://炸掉所有敌方坦克
			   if(Belong()==3)
				{
				   if(m_pGame->m_tankleft)
				   {
					   int temp=m_pGame->m_tankleft->GetTankLife();
					   temp-=100;			  
						CExplode *pe=new CExplode;
						if(pe)
						{
							pe->SetExplodeBmp(m_pGame->m_pExplodeBuffer);
							pe->SetPostion(m_pGame->m_tankleft->Getx()-12,m_pGame->m_tankleft->Gety()-12);
							m_pGame->m_Explode.AddTail(pe);
							m_pGame->PlaySound();
						}
	 					if(temp<=0)
						{
						delete  m_pGame->m_tankleft;
						m_pGame->m_tankleft=NULL;
                        m_pGame->m_Player.RemoveHead();
						}                        
					   else m_pGame->m_tankleft->SetTankLife(temp);
					}
                    if(m_pGame->m_tankright)
					{
					   int temp=m_pGame->m_tankright->GetTankLife();
					   temp-=100;
					   	CExplode *pe=new CExplode;
						if(pe)
						{
							pe->SetExplodeBmp(m_pGame->m_pExplodeBuffer);
							pe->SetPostion(m_pGame->m_tankright->Getx()-12,m_pGame->m_tankright->Gety()-12);
							m_pGame->m_Explode.AddTail(pe);
							m_pGame->PlaySound();
						}
						if(temp<=0)
						{
							delete  m_pGame->m_tankright;
							m_pGame->m_tankright=NULL;
							m_pGame->m_Player.RemoveTail();
						}                        
					   else m_pGame->m_tankright->SetTankLife(temp);
					}
				   break;
			   }
				position=m_pGame->m_Enemy.GetHeadPosition();
  				while(position)
				{
					CTank * pm=m_pGame->m_Enemy.GetNext(position);
					CExplode *pe=new CExplode;
					if(pe)
					{
						pe->SetExplodeBmp(m_pGame->m_pExplodeBuffer);
						pe->SetPostion(pm->Getx()-12,pm->Gety()-12);
						m_pGame->m_Explode.AddTail(pe);
						m_pGame->PlaySound();
					}
					delete pm;
					count++;
				}
				m_pGame->m_Enemy.RemoveAll();
				if(Belong()==1)
				{
					m_pGame->m_nLeftKills+=count;
					m_pGame->m_nLeftScore+=500;
				}
				else
				{
					m_pGame->m_nRightKills+=count;
					m_pGame->m_nRightScore+=500;
				}
				break;
		   case 3://增加坦克人数
			   switch(Belong())
			   {
			   case 1:
				   m_pGame->m_nLeftPlayer++;
				   if(m_pGame->m_nLeftPlayer>9)
				   {
					   m_pGame->m_nLeftPlayer=9;
					   m_pGame->m_nLeftScore+=100;
				   }
				   break;
			   case 2:
				   m_pGame->m_nRightPlayer++;
 				   if(m_pGame->m_nRightPlayer>9)
				   {
					   m_pGame->m_nRightPlayer=9;
					   m_pGame->m_nRightPlayer+=100;
				   }
				   break;
			   case 3:
				   m_pGame->m_nLeftEnemy++;
				   break;
			   }
			   break;
		   case 4://提高坦克速度
			   AddTankSpeed();
			   break;
		   case 5://提高发弹数量
			   m_nDoubleBullet++;
			   if(m_nDoubleBullet>3)
			   {
				   m_nDoubleBullet=3;
				   switch(Belong())
				   {
				   case 1:
					   m_pGame->m_nLeftScore+=100;
					   break;
				   case 2:
					   m_pGame->m_nRightScore+=100;
					   break;
				   }
			   }
			   break;
		   case 6://提高发弹频率
			   m_nFireSpeed=max(m_nFireSpeed-100,200);
			   break;
		   case 7:
			   switch(Belong())
			   {
			   case 1:
				   m_pGame->m_nLeftScore+=1000;
				   break;
			   case 2:
				   m_pGame->m_nRightScore+=1000;
				   break;
			   }				   
			   break;
		   case 8:
			 switch(Belong())
			   {
			   case 1:
				   m_pGame->m_nLeftScore+=500;
				   break;
			   case 2:
				   m_pGame->m_nRightScore+=500;
				   break;
			   }				   
			   break;
		   case 9:
			    switch(Belong())
			   {
			   case 1:
				   m_pGame->m_nLeftScore+=200;
				   break;
			   case 2:
				   m_pGame->m_nRightScore+=200;
				   break;
			   }				   
			   break;
		case 10:
			   switch(Belong())
			   {
			   case 1:
				   m_pGame->m_nLeftScore+=100;
				   break;
			   case 2:
				   m_pGame->m_nRightScore+=100;
				   break;
			   }				  	
		case 11:
			sort=1;
			number=30;
			m_nDamage=10000000;
			break;
		case 12:
		    m_nTankLife=1;
			break;
		case 13:	
			if(Belong()!=3)
			{
				CellType temp;
				temp.cell=CT_STEEL;
				temp.mask=0;
				temp.defence=100000;
				m_pGame->m_TankMap.SetHeadQuarterBorder(temp);
				m_pGame->m_nBorderTime=2000;
			}
		   else
		   {
			   CellType temp;
     			temp.cell=CT_EMPTY;
				temp.mask=0;
				temp.defence=0;
				m_pGame->m_TankMap.SetHeadQuarterBorder(temp);
				m_pGame->m_nBorderTime=2000;
			}
          break;
		case 14:
			if(Belong()!=3)m_pGame->m_nFreezeTime=700;
			else m_pGame->m_bFreeze=TRUE;
			break;
		}
		m_pGame->PlaySound(3);
	    delete p;
	    m_pGame->m_Egg.RemoveAt(preposition);
	    break;
		}
	}
	   
	position=m_pGame->m_Player.GetHeadPosition();
  	while(position)
	{
		preposition=position;
		CTank * p=m_pGame->m_Player.GetNext(position);
		if(p!=this)
		{
			CRect rc;
			Result=rc.IntersectRect(&rec,&p->rect);
			if(Result)
			{
				object.position=preposition;
				object.sort=1;
				object.has=TRUE;
                return object;
			}	   
		}
	}
	position=m_pGame->m_Enemy.GetHeadPosition();
  	while(position)
	{
		preposition=position;
		CTank * p=m_pGame->m_Enemy.GetNext(position);
		if(p!=this)
		{
			CRect rc;
			Result=rc.IntersectRect(&rec,&p->rect);
			if(Result)
			{
				object.position=preposition;
				object.sort=2;
				object.has=TRUE;
                return object;
			}	   
		}
	}
//专门针对坦克新出现时有可能出现的坦克重叠现象的处理方法
	if(m_pGame->m_tankleft==NULL && m_pGame->m_nLeftPlayer>0)
	{
		CRect rc,rc1;
		rc1.SetRect(15*TANKMAPCELL,38*TANKMAPCELL,15*TANKMAPCELL+TANKWIDTH,38*TANKMAPCELL+TANKHEIGHT);
		Result=rc.IntersectRect(&rec,rc1);
		if(Result)
		{
			object.has=TRUE;
			object.sort=1;
			return object;
		}
	}
   if(m_pGame->m_tankright==NULL && m_pGame->m_nRightPlayer>0)
	{
		CRect rc,rc1;
		rc1.SetRect(23*TANKMAPCELL,38*TANKMAPCELL,23*TANKMAPCELL+TANKWIDTH,38*TANKMAPCELL+TANKHEIGHT);
		Result=rc.IntersectRect(&rec,rc1);
		if(Result)
		{
			object.has=TRUE;
			object.sort=1;
			return object;
		}
	}
       
	return object;
}
 
BYTE CTank::Belong()
{
  if(m_pGame->m_tankleft==this){return 1;}
  if(m_pGame->m_tankright==this){return 2;}
  return 3;  
}

void CTank::Init(CGame* pGame,int X,int Y,LPDIRECTDRAWSURFACE Tankbmp,LPDIRECTDRAWSURFACE TankStatebmp,int nSkin)
{
	SetGame(pGame);
	SetTankBmp(Tankbmp);
	SetTankStateBmp(TankStatebmp);
	SetSkin(nSkin);
	SetTankPos(X,Y);
	SetRect();
}
void CTank::SetSkin(int nSkin)
{
	BYTE t=Belong();
	if(t==1 || t==2)
	{
		if(nSkin >= NUM_PLAYERTANKSKINS || nSkin<0)
			nSkin=0;
	}
	else if(t==3)
	{
		if(nSkin>=NUM_ENEMYTANKSKINS || nSkin<0)
			nSkin=8;
		switch(nSkin)
		{
		case 0:
			m_nDamage=20;
			SetTankLife(100);
			break;
		case 1:
			m_nDamage=25;
			SetTankLife(100);
			break;
		case 2:
			m_nDamage=30;
			SetTankLife(100);
			break;
		case 3:
			m_nDamage=35;
			SetTankLife(100);
			break;
		case 4:
			m_nDamage=40;
			SetTankLife(150);
			break;
		case 5:
			m_nDamage=40;
			SetTankLife(150);
			break;
		case 6:
			m_nDamage=50;
			SetTankLife(200);
			break;
		case 7:
			m_nDamage=70;
			SetTankLife(250);
			break;
		case 8:
			m_nDamage=100;
			SetTankLife(300);
			break;
		}

	}
	m_nSkin=nSkin;
}


BOOL CTank::HasBlock(int sx, int sy, int ex, int ey)
{
	for(int i=sx;i<=ex;i++)
		for(int j=sy;j<=ey;j++)
		{
			CellType &celltype= m_pGame->m_TankMap.GetCellType(i,j);
				if(celltype.cell==CT_SOIL || celltype.cell==CT_STEEL ||celltype.cell==CT_STONE)
					return TRUE;
		}
	return FALSE;
}

BOOL CTank::DownCanGo()
{
	for(int i=m_nX;i<=m_nX+2;i++)
		for(int j=m_nY+2;j<=m_nY+2;j++)
		{
			if(j>=TANKMAPHEIGHT || i>=TANKMAPWIDTH)return FALSE;
			CellType &ct=m_pGame->m_TankMap.GetCellType(i,j);
			if(ct.cell==CT_SOIL||ct.cell==CT_STONE||ct.cell==CT_STEEL||ct.cell==CT_WATER)
				return FALSE;
		}
	return TRUE;
}

⌨️ 快捷键说明

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