📄 gameengine.cpp
字号:
}
//-----------------------------------------------------------------------------
//
// Name: GetNowPos
// Disc: the member function of the class of the WALL
//-----------------------------------------------------------------------------
void GetNowPos(CTank &tank)
{
int m=0;
int n=0;
int colmax=MAP_WALL_COL_MAX,rowmax=MAP_WALL_ROW_MAX;
if(tank.GetTankBelong()==0)
{
colmax=MAP_WALL_ROW_VIEW-2;
rowmax=MAP_WALL_ROW_VIEW-2;
}
n=rand()*rand()%colmax;
m=rand()*rand()%rowmax;
while(Wall[m][n].IsVisible())
{
n=rand()*rand()%colmax;
m=rand()*rand()%rowmax;
}
POINT point=Wall[m][n].GetWallPos();
tank.SetNowPos(point.x,point.y);
}
BOOL SeeAround(int x,int y,int m)
{
MarkNode d[]={{0,-1},{0,1},{-1,0},{1,0}};
int s=0,t=0;
int xp=0,yp=0;
switch(m)
{
case TANK_MOVE_UP:
case TANK_MOVE_DOWN:
xp=TANK_WIDTH/2;
yp=TANK_HEIGHT/2;
break;
case TANK_MOVE_LEFT:
case TANK_MOVE_RIGHT:
xp=TANK_HEIGHT/2;
yp=TANK_WIDTH/2;
break;
}
s=(y+yp)/WALL_HEIGHT+d[m].j;
t=(x+xp)/WALL_HEIGHT+d[m].i;
if(s>=0&&t>=0&&s<21&&t<36)
return !Wall[s][t].IsLiving();
return FALSE;
}
void TankAIMove()
{
for(int n=0;n<TANK_TOTAL_NUMBER;n++)
{
if(Tank[1][n].IsLivable())
{
if(SearchMovePath(Tank[1][n].GetMDirection(),Tank[1][n]))
{
if(iLevel>(2<<n))
{
int x=Tank[1][n].GetNowPos().x-Tank[0][0].GetNowPos().x+screenmovex;
int y=Tank[1][n].GetNowPos().y-Tank[0][0].GetNowPos().y+screenmovey;
if((fabs(x)<=10&&fabs(y)<200||fabs(y)<=10&&fabs(x)<200)&&Tank[0][0].IsLivable())
{
int d=Tank[1][n].GetMDirection();
if(x<-10)
{
d=TANK_MOVE_RIGHT;
}
if(x>10)
{
d=TANK_MOVE_LEFT;
}
if(y<-10)
{
d=TANK_MOVE_DOWN;
}
if(y>10)
{
d=TANK_MOVE_UP;
}
if(SeeAround(Tank[1][n].GetNowPos().x,Tank[1][n].GetNowPos().y,d))
{
Tank[1][n].SetMoveDirection(d);
if(SearchMovePath(Tank[1][n].GetMDirection(),Tank[1][n]))
{
if(!(x<TANK_HEIGHT&&x>10||y>10&&y<TANK_HEIGHT))
Tank[1][n].Move();
else if(Tank[1][n].IsAttackable())
{
InstallBullet(1,n);
Tank[1][n].Attack();
Tank[1][n].SetTankState(TANK_STATE_STOP);
}
}
}
else Tank[1][n].Move();
}
else Tank[1][n].Move();
}
else Tank[1][n].Move();
}
else
{
Tank[1][n].SetMoveDirection(Tank[1][n].RandDirection());
if(SearchMovePath(Tank[1][n].GetMDirection(),Tank[1][n]))
{
if(iLevel>(2<<n))
{
int x=Tank[1][n].GetNowPos().x-Tank[0][0].GetNowPos().x+screenmovex;
int y=Tank[1][n].GetNowPos().y-Tank[0][0].GetNowPos().y+screenmovey;
if((fabs(x)<=10&&fabs(y)<200||fabs(y)<=10&&fabs(x)<200)&&Tank[0][0].IsLivable())
{
int d=Tank[1][n].GetMDirection();
if(x<-10)
{
d=TANK_MOVE_RIGHT;
}
if(x>10)
{
d=TANK_MOVE_LEFT;
}
if(y<-10)
{
d=TANK_MOVE_DOWN;
}
if(y>10)
{
d=TANK_MOVE_UP;
}
if(SeeAround(Tank[1][n].GetNowPos().x,Tank[1][n].GetNowPos().y,d))
{
Tank[1][n].SetMoveDirection(d);
if(SearchMovePath(Tank[1][n].GetMDirection(),Tank[1][n]))
{
if(!(x<TANK_HEIGHT&&x>10||y>10&&y<TANK_HEIGHT))
Tank[1][n].Move();
else if(Tank[1][n].IsAttackable())
{
InstallBullet(1,n);
Tank[1][n].Attack();
Tank[1][n].SetTankState(TANK_STATE_STOP);
}
}
}
else Tank[1][n].Move();
}
else Tank[1][n].Move();
}
else Tank[1][n].Move();
}
}
if(Tank[1][n].IsAttackable())
{
InstallBullet(1,n);
Tank[1][n].Attack();
Tank[1][n].SetTankState(TANK_STATE_STOP);
}
}
else if(!Tank[1][n].IsLivable()&&Tank[1][n].GetLifeTimes()>0)
{
Tank[1][n].SetLifeTimes(Tank[1][n].GetLifeTimes()-1);
int nl=Tank[1][n].GetLifeTimes();
int type=Tank[1][n].GetTankType();
score+=(type+1)*50;
if(n>0)
{
Tank[1][n].SetTankBelong(1);
GetNowPos(Tank[1][n]);
Tank[1][n].SetLifeCount(TANK_BASIC_LIFECOUNT);
Tank[1][n].SetLivingState(TRUE);
Tank[1][n].SetTankState(TANK_STATE_ATTACK);
}
}
}
if(CountEnemyTank()<=0)
{
screenmovex=0;
screenmovey=0;
Level.Promotion();
InitWall();
InitCMTank();
for(int m=0;m<=iPlayerModel;m++)
{
GetNowPos(Tank[0][m]);
Tank[0][m].SetLifeTimes(Tank[0][m].GetLifeTimes()+2);
Tank[0][m].SetLifeCount(Tank[0][m].GetTankType()*TANK_BASIC_LIFECOUNT);
Tank[0][m].SetLivingState(FALSE);
Tank[0][m].SetTankState(FALSE);
}
iAppState=4;
}
}
//-----------------------------------------------------------------------------
//
// Name: GetViewTank
// Disc: the member function of the class of the WALL
//-----------------------------------------------------------------------------
RECT GetViewTank(CTank tank)
{
RECT rcRect={0,0,0,0};
int Type=tank.GetTankType();
switch(tank.GetMDirection())
{
case TANK_MOVE_UP:
rcRect.top=Type*TANK_HEIGHT;
rcRect.bottom=(Type+1)*TANK_HEIGHT;
rcRect.left=0;
rcRect.right=TANK_WIDTH;
break;
case TANK_MOVE_DOWN:
rcRect.top=Type*TANK_HEIGHT;
rcRect.bottom=(Type+1)*TANK_HEIGHT;
rcRect.left=TANK_WIDTH;
rcRect.right=2*TANK_WIDTH;
break;
case TANK_MOVE_LEFT:
rcRect.top=8*TANK_HEIGHT;
rcRect.bottom=8*TANK_HEIGHT+TANK_WIDTH;
rcRect.left=Type*TANK_HEIGHT;
rcRect.right=(Type+1)*TANK_HEIGHT;
break;
case TANK_MOVE_RIGHT:
rcRect.top=8*TANK_HEIGHT+TANK_WIDTH;
rcRect.bottom=8*TANK_HEIGHT+2*TANK_WIDTH;
rcRect.left=Type*TANK_HEIGHT;
rcRect.right=(Type+1)*TANK_HEIGHT;
break;
default:
break;
}
return rcRect;
}
//-----------------------------------------------------------------------------
//
// Name: GetViewTank
// Disc: the member function of the class of the WALL
//-----------------------------------------------------------------------------
MarkNode GetFrontScene(int x,int y)
{
MarkNode point;
point.j=x/WALL_WIDTH;
point.i=(y-40)/WALL_HEIGHT;
return point;
}
//-----------------------------------------------------------------------------
//
// Name: GetViewTank
// Disc: the member function of the class of the WALL
//-----------------------------------------------------------------------------
BOOL SearchMovePath(int direction,CTank &tank)
{
MarkNode mark;
if(tank.GetTankBelong()==1)
{
if(!tank.UpOk()) return FALSE;
if(!tank.DownOk()) return FALSE;
if(!tank.LeftOk()) return FALSE;
if(!tank.RightOk()) return FALSE;
}
if(tank.GetTankBelong()==0)
{
iTankMovX=tank.GetNowPos().x-(screenmovex);
iTankMovY=tank.GetNowPos().y-(screenmovey);
switch(tank.GetMDirection())
{
case TANK_MOVE_UP:
if((iTankMovY-tank.GetSpeed())<0)
return FALSE;
break;
case TANK_MOVE_DOWN:
if((iTankMovY+tank.GetSpeed())>GAME_SCREEN_HEIGHT-WALL_HEIGHT+TANK_HEIGHT)
return FALSE;
break;
case TANK_MOVE_LEFT:
if((iTankMovX-tank.GetSpeed())<0)
return FALSE;
break;
case TANK_MOVE_RIGHT:
if((iTankMovX+tank.GetSpeed())>GAME_SCREEN_WIDTH-TANK_HEIGHT)
return FALSE;
break;
}
}
else
{
iTankMovX=tank.GetNowPos().x;
iTankMovY=tank.GetNowPos().y;
}
switch(direction)
{
case TANK_MOVE_UP:
mark=GetFrontScene(iTankMovX,iTankMovY-4);
if(Wall[mark.i][mark.j].IsVisible()) return FALSE;
mark=GetFrontScene(iTankMovX+TANK_WIDTH-1,iTankMovY-4);
if(Wall[mark.i][mark.j].IsVisible()) return FALSE;
break;
case TANK_MOVE_DOWN:
mark=GetFrontScene(iTankMovX,iTankMovY+TANK_HEIGHT+4);
if(Wall[mark.i][mark.j].IsVisible()) return FALSE;
mark=GetFrontScene(iTankMovX+TANK_WIDTH-1,iTankMovY+TANK_HEIGHT+4);
if(Wall[mark.i][mark.j].IsVisible()) return FALSE;
break;
case TANK_MOVE_LEFT:
mark=GetFrontScene(iTankMovX-4,iTankMovY);
if(Wall[mark.i][mark.j].IsVisible()) return FALSE;
mark=GetFrontScene(iTankMovX-4,iTankMovY+TANK_WIDTH);
if(Wall[mark.i][mark.j].IsVisible()) return FALSE;
break;
case TANK_MOVE_RIGHT:
mark=GetFrontScene(iTankMovX+TANK_HEIGHT+4,iTankMovY);
if(Wall[mark.i][mark.j].IsVisible()) return FALSE;
mark=GetFrontScene(iTankMovX+TANK_HEIGHT+4,iTankMovY+TANK_WIDTH);
if(Wall[mark.i][mark.j].IsVisible()) return FALSE;
break;
}
for(i=0;i<TANK_WAR_SIDE;i++)
for(j=0;j<TANK_TOTAL_NUMBER;j++)
{
if((!(i==0&&i>iPlayerModel))&&Tank[i][j].IsLivable())
{
int belong1=tank.GetTankBelong();
int belong2=Tank[i][j].GetTankBelong();
int x=tank.GetNowPos().x-Tank[i][j].GetNowPos().x+(belong1*screenmovex-belong2*screenmovex);
int y=tank.GetNowPos().y-Tank[i][j].GetNowPos().y+(belong1*screenmovey-belong2*screenmovey);
if(!(x==0&&y==0))
{
int speed=tank.GetSpeed();
switch(direction)
{
case TANK_MOVE_UP:
if(y>=0&&y-speed<TANK_HEIGHT&&fabs(x)<TANK_WIDTH)
return FALSE;
break;
case TANK_MOVE_DOWN:
if(y<=0&&y+speed>-TANK_HEIGHT&&fabs(x)<TANK_WIDTH)
return FALSE;
break;
case TANK_MOVE_LEFT:
if(x>=0&&x-speed<TANK_HEIGHT&&fabs(y)<TANK_WIDTH)
return FALSE;
break;
case TANK_MOVE_RIGHT:
if(x<=0&&x+speed>-TANK_HEIGHT&&fabs(y)<TANK_WIDTH)
return FALSE;
break;
}
}
}
}
return TRUE;
}
//-----------------------------------------------------------------------------
//
// Name: GetViewTank
// Disc: the member function of the class of the WALL
//-----------------------------------------------------------------------------
void DrawTankp(POINT point,RECT rect)
{
HRESULT hRet;
while (1)
{
hRet = lpBackBuffer->BltFast(point.x,point.y, lpTank, &rect, TRUE);
if (hRet == DD_OK)
{
break;
}
if (hRet == DDERR_SURFACELOST)
{
hRet = RestoreSurfaces();
if (hRet != DD_OK)
break;
}
if (hRet != DDERR_WASSTILLDRAWING)
break;
}
}
void DrawHelicopter()
{
HRESULT hRet;
RECT rect;
static hx=1024,hy=40+4*WALL_HEIGHT;
static hframe=0;
static hframep=0;
static hd=rand()%4;
for (int n=0;n<=iPlayerModel;n++)
{
POINT point=Tank[0][n].GetNowPos();
if(!Tank[0][n].IsLivable()&&Tank[0][n].GetLifeTimes()>0)
{
if (lastTickCount = 0)
{
hframe =0;
hframep =2;
}
hframe++;
if(hframe>2)
{
hframe=0;
hframep++;
}
if(hframep>3)
{
hframe=0;
hframep=2;
}
if(hx>=point.x+1)
hx-=1;
if(hx<=point.x-1)
hx+=1;
if(hy>=point.y+1)
{
hy-=1;
// screenmovey+=1;
}
if(hy<=point.y-1)
{
hy+=1;
// screenmovey-=1;
}
if(hx==point.x&&hy==point.y)
{
bTask=TRUE;
hframe=0;
hframep=0;
}
}
else
{
if(!bTask)
{
hframe++;
if(hframe>2)
{
hframe=0;
hframep++;
}
if(hframep>1)
{
hframe=0;
hframep=0;
}
if(hx<=1024-1)
hx+=1;
else
{
hx=1024;
hy=40+4*WALL_HEIGHT;
}
}
}
}
rect.top=hframe*144;
rect.bottom=(hframe+1)*144;
rect.left=hframep*280;
rect.right=hframep*280+((1024-hx>280 )? 280:(1024-hx));
while (1)
{
hRet = lpBackBuffer->BltFast(hx,hy, lpHelicopter, &rect, TRUE);
if (hRet == DD_OK)
{
break;
}
if (hRet == DDERR_SURFACELOST)
{
hRet = RestoreSurfaces();
if (hRet != DD_OK)
break;
}
if (hRet != DDERR_WASSTILLDRAWING)
break;
}
}
void DrawTank()
{
TankAIMove();
TankViewMov();
int *type=Level.GetTankTypes();
for (int m=0;m<TANK_WAR_SIDE;m++)
for(int n=0;n<TANK_TOTAL_NUMBER;n++)
{
/*
if(m==1)//&&n<=iPlayerModel
{
// bltText(NumToChar(-screenmovex),100,100+50*n);
// bltText(NumToChar(-screenmovey),200,100+50*n);
bltText(NumToChar(Tank[m][n].GetNowPos().x),300,100+50*n);
bltText(NumToChar(Tank[m][n].GetNowPos().y),400,100+50*n);
bltText(NumToChar(Tank[m][n].GetLifeTimes()),500,100+50*n);
}
*/
if(Tank[m][n].IsLivable())
{
RECT rcRect=GetViewTank(Tank[m][n]);
POINT point=Tank[m][n].GetNowPos();
if(m==1)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -