📄 gameengine.cpp
字号:
for(j=0;j<TANK_TOTAL_NUMBER;j++)
{
InstallBullet(i,j);
}
}
BOOL CheckBreakWall(int m,int n)
{
if(Bullet[m][n].IsFlying())
{
MarkNode mark;
int BulletX=Bullet[m][n].GetNowPos().x-((m==1)? 0:(screenmovex));
int BulletY=Bullet[m][n].GetNowPos().y-((m==1)? 0:(screenmovey));
int power=Bullet[m][n].GetPower();
switch(Bullet[m][n].GetFlyingDirection())
{
case TANK_MOVE_UP:
mark=GetFrontScene(BulletX+6,BulletY-4);
if(Wall[mark.i][mark.j].IsVisible())
{
Wall[mark.i][mark.j].BeAttacked(power);
if(!Wall[mark.i][mark.j].IsLiving())
{
Boomx=mark.j*WALL_HEIGHT+screenmovex;
Boomy=mark.i*WALL_WIDTH+40+screenmovey;
Bullet[m][n].SetBoom(TRUE);
Bullet[m][n].SetBoomPos(Boomx,Boomy);
}
return FALSE;
}
mark=GetFrontScene(BulletX+12,BulletY-4);
if(Wall[mark.i][mark.j].IsVisible())
{
Boomx=mark.j*WALL_HEIGHT+screenmovex;
Boomy=mark.i*WALL_WIDTH+40+screenmovey;
Bullet[m][n].SetBoomPos(Boomx,Boomy);
Wall[mark.i][mark.j].BeAttacked(power);
if(!Wall[mark.i][mark.j].IsLiving())
{
Bullet[m][n].SetBoom(TRUE);
Bullet[m][n].SetBoomPos(Boomx,Boomy);
}
return FALSE;
}
break;
case TANK_MOVE_DOWN:
mark=GetFrontScene(BulletX+6,BulletY+20+4);
if(Wall[mark.i][mark.j].IsVisible())
{
Boomx=mark.j*WALL_HEIGHT+screenmovex;
Boomy=mark.i*WALL_WIDTH+40+screenmovey;
Bullet[m][n].SetBoomPos(Boomx,Boomy);
Wall[mark.i][mark.j].BeAttacked(power);
if(!Wall[mark.i][mark.j].IsLiving())
{
Bullet[m][n].SetBoom(TRUE);
Bullet[m][n].SetBoomPos(Boomx,Boomy);
}
return FALSE;
}
mark=GetFrontScene(BulletX+12,BulletY+20+4);
if(Wall[mark.i][mark.j].IsVisible())
{
Boomx=mark.j*WALL_HEIGHT+screenmovex;
Boomy=mark.i*WALL_WIDTH+40+screenmovey;
Bullet[m][n].SetBoomPos(Boomx,Boomy);
Wall[mark.i][mark.j].BeAttacked(power);
if(!Wall[mark.i][mark.j].IsLiving())
{
Bullet[m][n].SetBoom(TRUE);
Bullet[m][n].SetBoomPos(Boomx,Boomy);
}
return FALSE;
}
break;
case TANK_MOVE_LEFT:
mark=GetFrontScene(BulletX-4,BulletY+6);
if(Wall[mark.i][mark.j].IsVisible())
{
Boomx=mark.j*WALL_HEIGHT+screenmovex;
Boomy=mark.i*WALL_WIDTH+40+screenmovey;
Bullet[m][n].SetBoomPos(Boomx,Boomy);
Wall[mark.i][mark.j].BeAttacked(power);
if(!Wall[mark.i][mark.j].IsLiving())
{
Bullet[m][n].SetBoom(TRUE);
Bullet[m][n].SetBoomPos(Boomx,Boomy);
}
return FALSE;
}
mark=GetFrontScene(BulletX-4,BulletY+12);
if(Wall[mark.i][mark.j].IsVisible())
{
Boomx=mark.j*WALL_HEIGHT+screenmovex;
Boomy=mark.i*WALL_WIDTH+40+screenmovey;
Bullet[m][n].SetBoomPos(Boomx,Boomy);
Wall[mark.i][mark.j].BeAttacked(power);
if(!Wall[mark.i][mark.j].IsLiving())
{
Bullet[m][n].SetBoom(TRUE);
Bullet[m][n].SetBoomPos(Boomx,Boomy);
}
return FALSE;
}
break;
case TANK_MOVE_RIGHT:
mark=GetFrontScene(BulletX+20+4,BulletY+6);
if(Wall[mark.i][mark.j].IsVisible())
{
Boomx=mark.j*WALL_HEIGHT+screenmovex;
Boomy=mark.i*WALL_WIDTH+40+screenmovey;
Bullet[m][n].SetBoomPos(Boomx,Boomy);
Wall[mark.i][mark.j].BeAttacked(power);
if(!Wall[mark.i][mark.j].IsLiving())
{
Bullet[m][n].SetBoom(TRUE);
Bullet[m][n].SetBoomPos(Boomx,Boomy);
}
return FALSE;
}
mark=GetFrontScene(BulletX+20+4,BulletY+12);
if(Wall[mark.i][mark.j].IsVisible())
{
Boomx=mark.j*WALL_HEIGHT+screenmovex;
Boomy=mark.i*WALL_WIDTH+40+screenmovey;
Bullet[m][n].SetBoomPos(Boomx,Boomy);
Wall[mark.i][mark.j].BeAttacked(power);
if(!Wall[mark.i][mark.j].IsLiving())
{
Bullet[m][n].SetBoom(TRUE);
Bullet[m][n].SetBoomPos(Boomx,Boomy);
}
return FALSE;
}
break;
}
}
return TRUE;
}
int CountEnemyTank()
{
int n=0;
for(int m=0;m<TANK_TOTAL_NUMBER;m++)
{
n+=Tank[1][m].GetLifeTimes();
}
return n;
}
BOOL CheckBreakTank(int s,int t)
{
if(Bullet[s][t].IsFlying())
{
int BulletX=Bullet[s][t].GetNowPos().x-((s==1)? -screenmovex:(screenmovex));
int BulletY=Bullet[s][t].GetNowPos().y-((s==1)? -screenmovey:(screenmovey));
int power=Bullet[s][t].GetPower();
int m=1-s;
for(int n=0;n<TANK_TOTAL_NUMBER;n++)
{
if(m!=s&&Tank[m][n].IsLivable())
{
int x=BulletX-Tank[m][n].GetNowPos().x;
int y=BulletY-Tank[m][n].GetNowPos().y;
int sx=Tank[m][n].GetNowPos().x+((m==0)? 0:screenmovex);
int sy=Tank[m][n].GetNowPos().y+((m==0)? 0:screenmovey);
if(!(x==0&&y==0))
{
int speed=Bullet[s][t].GetSpeed();
switch(Bullet[s][t].GetFlyingDirection())
{
case TANK_MOVE_UP:
if(y>=0&&y-speed<20&&(x+9)<TANK_WIDTH&&(x+9)>0)
{
Bullet[s][t].SetBoomPos(sx,sy);
Tank[m][n].SetTankState(TANK_STATE_BEATTACKED);
Tank[m][n].BeAttacked(power);
Tank[m][n].SetTankState(TANK_STATE_MOVE);
if(!Tank[m][n].IsLivable())
Bullet[s][t].SetBoom(TRUE);
return FALSE;
}
break;
case TANK_MOVE_DOWN:
if(y<=0&&y+speed>-20&&(x+9)<TANK_WIDTH&&(x+9)>0)
{
Bullet[s][t].SetBoomPos(sx,sy);
Tank[m][n].SetTankState(TANK_STATE_BEATTACKED);
Tank[m][n].BeAttacked(power);
Tank[m][n].SetTankState(TANK_STATE_MOVE);
if(!Tank[m][n].IsLivable())
Bullet[s][t].SetBoom(TRUE);
return FALSE;
}
break;
case TANK_MOVE_LEFT:
if(x>=0&&x-speed<20&&(y+9)<TANK_WIDTH&&(y+9)>0)
{
Bullet[s][t].SetBoomPos(sx,sy);
Tank[m][n].SetTankState(TANK_STATE_BEATTACKED);
Tank[m][n].BeAttacked(power);
Tank[m][n].SetTankState(TANK_STATE_MOVE);
if(!Tank[m][n].IsLivable())
Bullet[s][t].SetBoom(TRUE);
return FALSE;
}
break;
case TANK_MOVE_RIGHT:
if(x<=0&&x+speed>-20&&(y+9)<TANK_WIDTH&&(y+9)>0)
{
Bullet[s][t].SetBoomPos(sx,sy);
Tank[m][n].SetTankState(TANK_STATE_BEATTACKED);
Tank[m][n].BeAttacked(power);
Tank[m][n].SetTankState(TANK_STATE_MOVE);
if(!Tank[m][n].IsLivable())
Bullet[s][t].SetBoom(TRUE);
return FALSE;
}
break;
}
}
}
}
}
return TRUE;
}
BOOL SearchFlyingPath(int m,int n)
{
if(CheckBreakWall(m,n))
return CheckBreakTank(m,n);
return FALSE;
}
void CheckBreak(int m,int n)
{
BOOL movable;
if(Bullet[m][n].IsBoom())
DrawBoom(m,n);
if(Bullet[m][n].IsFlying())
{
int x=Bullet[m][n].GetNowPos().x;
int y=Bullet[m][n].GetNowPos().y;
if(m==0)
movable=CheckViewBoundry(x,y);
else
movable=CheckViewBoundry(x+screenmovex,y+screenmovey);
if(!movable)
{
Bullet[m][n].Break();
Bullet[m][n].SetNowPos(-100,-100);
Tank[m][n].SetTankState(TANK_STATE_ATTACK);
return ;
}
if(!SearchFlyingPath(m,n))
{
Bullet[m][n].Break();
Bullet[m][n].SetBFrame(0,0);
Bullet[m][n].SetNowPos(-100,-100);
Tank[m][n].SetTankState(TANK_STATE_ATTACK);
return ;
}
Bullet[m][n].Flying();
switch(Bullet[m][n].GetFlyingDirection())
{
case 0:
Bullet[m][n].SetFrame(Bullet[m][n].GetFrame(),0);
break;
case 1:
Bullet[m][n].SetFrame(Bullet[m][n].GetFrame(),3);
break;
case 2:
Bullet[m][n].SetFrame(Bullet[m][n].GetFrame(),2);
break;
case 3:
Bullet[m][n].SetFrame(Bullet[m][n].GetFrame(),1);
break;
}
}
}
void DrawBullet(int m,int n)
{
// Draw bullets in the screen
HRESULT hRet;
RECT rcRect;
CheckBreak(m,n);
int x,y;
// bltText(NumToChar(iBulletMovX),100,100);
// bltText(NumToChar(iBulletMovX),200,100);
// bltText(NumToChar(Bullet[m][n].GetFlyingDirection()),300,100);
if(Bullet[m][n].IsFlying())
{
if(m==1)
{
x=Bullet[m][n].GetNowPos().x+screenmovex;
y=Bullet[m][n].GetNowPos().y+screenmovey;
}
else
{
x=Bullet[m][n].GetNowPos().x;
y=Bullet[m][n].GetNowPos().y;
}
frame=Bullet[m][n].GetFrame();
framep=Bullet[m][n].GetFramep();
rcRect.left = frame * 20;
rcRect.top = framep*20 ;
rcRect.right = frame * 20 + 20;
rcRect.bottom = (framep+1)*20;
frame++;
Bullet[m][n].SetFrame(frame,framep);
if (frame == 11 )
{
frame = 0;
framep=0;
Bullet[m][n].SetFrame(frame,framep);
}
while (1)
{
hRet = lpBackBuffer->BltFast(x, y, lpTankShoot, &rcRect, DDBLTFAST_SRCCOLORKEY);
if (hRet == DD_OK)
{
break;
}
if (hRet == DDERR_SURFACELOST)
{
hRet=RestoreSurfaces();
if (hRet != DD_OK)
break;
}
if (hRet != DDERR_WASSTILLDRAWING)
break;
}
}
}
void DrawBullet()
{
for(i=0;i<TANK_WAR_SIDE;i++)
for(j=0;j<TANK_TOTAL_NUMBER;j++)
{
/*
if(i==1)
{
bltText(NumToChar(Bullet[i][j].GetNowPos().x),100,100+50*j);
bltText(NumToChar(Bullet[i][j].GetNowPos().y),200,100+50*j);
bltText(NumToChar(Bullet[i][j].GetPower()),300,100+50*j);
}
if(i==0)
{
bltText(NumToChar(Bullet[i][0].GetNowPos().x),100,100+50*8);
bltText(NumToChar(Bullet[i][0].GetNowPos().y),200,100+50*8);
bltText(NumToChar(Bullet[i][0].GetPower()),300,100+50*8);
}
*/
if(Bullet[i][j].IsFlying()&&Tank[i][j].IsLivable())
DrawBullet(i,j);
}
}
BOOL DrawBoom(int m,int n)
{
RECT rcRect;
HRESULT hRet;
bframe=Bullet[m][n].GetBFrame();
bframep=Bullet[m][n].GetBFramep();
rcRect.top = bframep*70;
rcRect.bottom = (bframep+1)*70;
rcRect.left =bframe*70;
rcRect.right = (bframe+1)*70;
if(bframe>=5)
{
bframe=0;
bframep++;
if(bframep>=3)
{
bframep=0;
bframe=0;
Bullet[m][n].SetBoom(FALSE);
sndPlaySound("res\\explosion.wav",SND_ASYNC);
}
}
bframe++;
Bullet[m][n].SetBFrame(bframe,bframep);
int bx=Bullet[m][n].GetBoomPos().x;
int by=Bullet[m][n].GetBoomPos().y;
while (1)
{
hRet = lpBackBuffer->BltFast(bx, by, lpBoom, &rcRect, TRUE);
if (hRet == DD_OK)
{
hRet = TRUE;
break;
}
if (hRet == DDERR_SURFACELOST)
{
hRet = RestoreSurfaces();
break;
}
if (hRet != DDERR_WASSTILLDRAWING)
{
hRet = TRUE;
break;
}
}
return hRet;
}
//-----------------------------------------------------------------------------
//
// Name: Tank
// Disc: the member function of the class of the WALL
//-----------------------------------------------------------------------------
void InitPRTank()
{
int n=1;
int t=Level.GetType(1);
int *types=Level.GetTankTypes();
int num=TANK_TOTAL_NUMBER/(Level.GetTotalType());
i=0;
while(i<=iPlayerModel)
{
Tank[0][i].SetTankBelong(0);
GetNowPos(Tank[0][i]);
Tank[0][i].SetTank(1,0);
Tank[0][i].SetSpeed(3);
Tank[0][i].SetLifeTimes(4);
Tank[0][i].SetLivingState(FALSE);
Bullet[0][i].SetLifeState(FALSE);
i++;
}
}
void InitCMTank()
{
int n=0;
int t=Level.GetType(n);
float num=((float)TANK_TOTAL_NUMBER)/((float)(Level.GetTotalType()));
i=0;
while(i<TANK_TOTAL_NUMBER)
{
if(i<n*num)
{
Tank[1][i].SetTankBelong(1);
GetNowPos(Tank[1][i]);
Tank[1][i].SetTank(t,1);
i++;
}
else
{
n++;
t=Level.GetType(n);
}
}
}
void InitTank()
{
InitPRTank();
InitCMTank();
}
//-----------------------------------------------------------------------------
//
// Name: GetTank
// Disc: the member function of the class of the WALL
//-----------------------------------------------------------------------------
void TankViewMov()
{
int x,y,speed;
for(int n=0;n<=iPlayerModel;n++)
{
x=Tank[0][n].GetNowPos().x;
y=Tank[0][n].GetNowPos().y;
speed=Tank[0][n].GetSpeed();
if(Tank[0][n].IsLivable()&&bKeyState)//&&Tank[0][0].GetTankState()==TANK_STATE_MOVE
{
switch(Tank[0][n].GetMDirection())
{
case TANK_MOVE_UP:
if(SearchMovePath(TANK_MOVE_UP,Tank[0][n])&&y<=SCREEN_Y_MIN&&screenmovey<speed)
screenmovey+=speed;
else
if(SearchMovePath(TANK_MOVE_UP,Tank[0][n]))
Tank[0][n].Move();
break;
case TANK_MOVE_DOWN:
if(SearchMovePath(TANK_MOVE_DOWN,Tank[0][n])&&y>=SCREEN_Y_MAX&&screenmovey>-(Wall[MAP_WALL_ROW_MAX-1][MAP_WALL_COL_MAX-1].GetWallPos().y-SCREEN_Y_MAX))
screenmovey-=speed;
else
if(SearchMovePath(TANK_MOVE_DOWN,Tank[0][n]))
Tank[0][n].Move();
break;
case TANK_MOVE_LEFT:
if(SearchMovePath(TANK_MOVE_LEFT,Tank[0][n])&&x<=SCREEN_X_MIN&&screenmovex<speed)
screenmovex+=speed;
else
if(SearchMovePath(TANK_MOVE_LEFT,Tank[0][n]))
Tank[0][n].Move();
break;
case TANK_MOVE_RIGHT:
if(SearchMovePath(TANK_MOVE_RIGHT,Tank[0][n])&&x>=SCREEN_X_MAX&&screenmovex>-(Wall[MAP_WALL_ROW_MAX-1][MAP_WALL_COL_MAX-1].GetWallPos().x-SCREEN_X_MAX))
screenmovex-=speed;
else
if(SearchMovePath(TANK_MOVE_RIGHT,Tank[0][n]))
Tank[0][n].Move();
break;
}
}
else if(!Tank[0][n].IsLivable()&&Tank[0][n].GetLifeTimes()>0)
{
Bullet[0][i].SetLifeState(FALSE);
if(bTask)
{
bTask=FALSE;
Tank[0][n].SetLivingState(TRUE);
Tank[0][n].SetLifeTimes(Tank[0][n].GetLifeTimes()-1);
Tank[0][n].SetLifeCount((Tank[0][n].GetTankType()+1)*100+TANK_BASIC_LIFECOUNT);
}
}
if(Tank[0][n].GetLifeTimes()<=0)
{
Level.ClearTypes();
dwShipExplode=100000;
iShipState = 3;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -