?? tank1.cpp
字號:
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://增加坦克人數(shù)
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://提高發(fā)彈數(shù)量
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://提高發(fā)彈頻率
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;
}
}
}
//專門針對坦克新出現(xiàn)時有可能出現(xiàn)的坦克重疊現(xiàn)象的處理方法
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;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -