📄 basetank.cpp
字号:
// BaseTank.cpp: implementation of the CBaseTank class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "BaseTank.h"
#include "MainGame.h"
#include "Bullet.h"
#include "Missile.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CBaseTank::CBaseTank(CBaseTank *aTank):CContainerObject(aTank)
{
}
CBaseTank::~CBaseTank()
{
}
void CBaseTank::displayObject()
{
//////////////////////////////////////////////////////////
// 算出此种坦克在图中的位置mapX: 0 -- 3, mapY: 0 -- 15
//////////////////////////////////////////////////////////
int mapX,mapY;
mapX=2*(type%4);
mapY=direction+(type/4)*4;
///////////////////////刚出世的小星星
if(appearance<80)
{
CMainGame *pWnd=(CMainGame*)AfxGetMainWnd();
CRect rt1(positionX,positionY,positionX+32,positionY+32);
CRect rt2(32*(appearance/20),0,32*(appearance/20+1),32);
pWnd->BltBitMap(pWnd->lpBackBuffer,rt1,pWnd->lpBKGObject[5],rt2);
appearance++;
return;
}
///////////////////坦克28*28 方格32*32
CMainGame *pWnd=(CMainGame*)AfxGetMainWnd();
if(boolFlip)
{
CRect rt1(positionX+2,positionY+2,positionX+2+width,positionY+2+height);
CRect rt2(32*mapX,32*mapY,32*(mapX+1),32*(mapY+1));
pWnd->BltBitMap(pWnd->lpBackBuffer,rt1,pWnd->lpBKGObject[2],rt2);
if(movement)boolFlip=0;
}
else
{
CRect rt1(positionX+2,positionY+2,positionX+2+width,positionY+2+height);
CRect rt2(32*(mapX+1),32*mapY,32*(mapX+2),32*(mapY+1));
pWnd->BltBitMap(pWnd->lpBackBuffer,rt1,pWnd->lpBKGObject[2],rt2);
if(movement)boolFlip=1;
}
}
bool CBaseTank::ActiveObject()//move
{
//检查坦克是否可移动,必须在iPos等于0时.
if(iPos==0)
{
if(ChargeMove()==false)goto GoGoGo;
else
if(movement)iPos++;
}
///////////////////////////////////////
if(iPos<17&&iPos>0)
{
int i;
switch(direction)
{
case 0: for(i=0;i<speed;i++)
{
positionY--;
if(++iPos==17)
{
iPos=0;
break;
}
}break;
case 1: for(i=0;i<speed;i++)
{
positionX++;
if(++iPos==17)
{
iPos=0;
break;
}
}break;
case 2: for(i=0;i<speed;i++)
{
positionY++;
if(++iPos==17)
{
iPos=0;
break;
}
}break;
case 3: for(i=0;i<speed;i++)
{
positionX--;
if(++iPos==17)
{
iPos=0;
break;
}
}break;
}
}
//分不出是CPlayerTank的还是CBaseTank的displayObject.
GoGoGo:
CBaseTank::displayObject();
return true;
}
bool CBaseTank::ChargeMove()
{
///////////////////////////////////////////矩形边界:
if(positionX==0&&direction==3)
{
return false;
}
if(positionY==0&&direction==0)
{
return false;
}
if(positionX==640-32&&direction==1)
{
return false;
}
if(positionY==480-32&&direction==2)
{
return false;
}
///////////////////////////////////////////物体
int across=positionY/8; //横坐标
int column=positionX/8; //纵坐标
CMainGame *pMainGame=(CMainGame*)AfxGetMainWnd();
switch(direction)
{
int i;
case 0:
for(i=0;i<4;i++)
{
if(pMainGame->theMap->GameMap[across-1][column+i]==3 //砖
||pMainGame->theMap->GameMap[across-2][column+i]==3
||pMainGame->theMap->GameMap[across-1][column+i]==1 //石
||pMainGame->theMap->GameMap[across-2][column+i]==1
||pMainGame->theMap->GameMap[across-1][column+i]==4 //泽
||pMainGame->theMap->GameMap[across-1][column+i]==5
||pMainGame->theMap->GameMap[across-2][column+i]==5)//将
{
return false;
}
}
break;
case 1:
for(i=0;i<4;i++)
{
if(pMainGame->theMap->GameMap[across+i][column+4]==3
||pMainGame->theMap->GameMap[across+i][column+5]==3
||pMainGame->theMap->GameMap[across+i][column+4]==1
||pMainGame->theMap->GameMap[across+i][column+5]==1
||pMainGame->theMap->GameMap[across+i][column+4]==4
||pMainGame->theMap->GameMap[across+i][column+4]==5
||pMainGame->theMap->GameMap[across+i][column+5]==5)
{
return false;
}
}
break;
case 2:
for(i=0;i<4;i++)
{
if(pMainGame->theMap->GameMap[across+4][column+i]==3
||pMainGame->theMap->GameMap[across+5][column+i]==3
||pMainGame->theMap->GameMap[across+4][column+i]==1
||pMainGame->theMap->GameMap[across+4][column+i]==4
||pMainGame->theMap->GameMap[across+4][column+i]==5
||pMainGame->theMap->GameMap[across+5][column+i]==5)
{
return false;
}
}
break;
case 3:
for(i=0;i<4;i++)
{
if(pMainGame->theMap->GameMap[across+i][column-1]==3
||pMainGame->theMap->GameMap[across+i][column-2]==3
||pMainGame->theMap->GameMap[across+i][column-1]==1
||pMainGame->theMap->GameMap[across+i][column-1]==4
||pMainGame->theMap->GameMap[across+i][column-1]==5
||pMainGame->theMap->GameMap[across+i][column-2]==5)
{
return false;
}
}
break;
}//switch
return true;//可以移动
}
void CBaseTank::Tankfire(int n)
{
if(!GetBulletNum(this) && bulletNum==0)
{
bulletNum+=2;
}
if(bulletNum)
{
switch(n) //子弹
{
case 1:
{
if(type<=7)
sndPlaySound("sound//gunfire.wav",SND_ASYNC|SND_NODEFAULT);
CBullet *pBullet=new
CBullet(positionX,positionY,type,power,bulletSpeed,direction);
pBullet->displayObject();
}break;
case 2:
{
sndPlaySound("sound//missile.wav",SND_ASYNC|SND_NODEFAULT);
CMissile *pBullet=new
CMissile(positionX,positionY,type,power,3,direction);
pBullet->displayObject();
}break;
}//switch
bulletNum--;
}//if
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -