📄 game.cpp
字号:
// timer++;
break;
case 2:
if(TankY<30)
{
if(timer==0) pScreen->PutSpt(TankX*15,TankY*15+5,base+(Direction<<1)+timer%2);
if(timer==1)
{
pScreen->PutSpt(TankX*15,TankY*15+10,base+(Direction<<1)+timer%2);
TankY++;
}
if(timer==2) pScreen->PutSpt(TankX*15,TankY*15,base+(Direction<<1)+timer%2);
}
else pScreen->PutSpt(TankX*15,TankY*15,base+(Direction<<1)+timer%2);
// timer++;
break;
case 3:
if(TankX<30)
{
if(timer==0) pScreen->PutSpt(TankX*15+5,TankY*15,base+(Direction<<1)+timer%2);
if(timer==1)
{
pScreen->PutSpt(TankX*15+10,TankY*15,base+(Direction<<1)+timer%2);
TankX++;
}
if(timer==2) pScreen->PutSpt(TankX*15,TankY*15,base+(Direction<<1)+timer%2);
}
else pScreen->PutSpt(TankX*15,TankY*15,base+(Direction<<1)+timer%2);
// timer++;
break;
}
timer++;
if(timer>=3)
{
timer=0;
Status=ST_READY;
}
// if(timer==0)pScreen->PutSpt(TankX*15,TankY*15,base+(Direction<<1)+timer);
break;
}
p=pImageMap+TankX+(TankY<<5);
if(IsEnemy)
*p=*(p+1)=*(p+32)=*(p+33)=2;
else *p=*(p+1)=*(p+32)=*(p+33)=1;
p=pCurrMap+TankX+(TankY<<5);
if(*p==32) pScreen->PutSpt(TankX*15,TankY*15,70);
if(*(p+1)==32) pScreen->PutSpt((TankX+1)*15,TankY*15,70);
if(*(p+32)==32) pScreen->PutSpt(TankX*15,(TankY+1)*15,70);
if(*(p+33)==32) pScreen->PutSpt((TankX+1)*15,(TankY+1)*15,70);
}
CTank::~CTank()
{
//To do:
}
//Defines of the class CScreen:
CScreen::CScreen():hScreenWnd(NULL),lpDD(NULL),
lpDDSPrimary(NULL),lpDDSBuffer(NULL),
lpDDSBack(NULL),DDReady(false)
{
//To do:
}
bool CScreen::Fail(char *szMsg)
{
DeleteDirectDraw();
OutputDebugString( szMsg );
DestroyWindow( hScreenWnd );
return false;
}
void CScreen::SetWnd(HWND hWnd)
{
hScreenWnd=hWnd;
}
bool CScreen::ClearDDSurface(LPRECT lpDescRect,BYTE color)
{
//To do:
HRESULT ddrval;
DDBLTFX ddbltfx;
ddbltfx.dwSize=sizeof(ddbltfx);
ddbltfx.dwFillColor=color;
while(1)
{
ddrval=lpDDSBuffer->Blt(lpDescRect,NULL,NULL,DDBLT_COLORFILL|DDBLT_WAIT,&ddbltfx);
if(ddrval==DDERR_SURFACELOST)
{
ddrval=RestoreDD();
if(ddrval!=DD_OK) return false;
}
else break;
}
return true;
}
bool CScreen::InitDirectDraw(void)
{
DDSURFACEDESC ddsd;
DDSCAPS ddscaps;
FILE *fp;
char str1[12];
fp=fopen(DATFILE,"r");
if(fp==NULL)
{
MessageBox(hScreenWnd,"Cannot open file STank.dat!","Error",MB_OK);
return(false);
}
fread(str1,11,1,fp);
str1[11]='\0';
if(strcmp(str1,"STank file.")!=0)
{
MessageBox(hScreenWnd,"STank.dat is not valid!","Error",MB_OK);
fclose(fp);
return false;
}
fscanf(fp,"%d\n",&numSpt);
pSpt=new RECT[numSpt];
int i,left,right,top,bottom;
for(i=0;i<numSpt;i++)
{
fscanf(fp,"%d,%d,%d,%d;",&left,&top,&right,&bottom);
pSpt[i].left=left;
pSpt[i].right=right+1;
pSpt[i].bottom=bottom+1;
pSpt[i].top=top;
}
fclose(fp);
if(FAILED(DirectDrawCreate(NULL,&lpDD,NULL)))
return(false);
if(FAILED(lpDD->SetCooperativeLevel(hScreenWnd,DDSCL_EXCLUSIVE|DDSCL_FULLSCREEN)))
return(false);
if(FAILED(lpDD->SetDisplayMode(640,480,8)))
return(false);
ddsd.dwSize=sizeof(ddsd);
ddsd.dwFlags=DDSD_CAPS|DDSD_BACKBUFFERCOUNT;
ddsd.ddsCaps.dwCaps=DDSCAPS_PRIMARYSURFACE|DDSCAPS_FLIP|DDSCAPS_COMPLEX;
ddsd.dwBackBufferCount=1;
if(FAILED(lpDD->CreateSurface(&ddsd,&lpDDSPrimary,NULL)))
return(false);
ddscaps.dwCaps=DDSCAPS_BACKBUFFER;
lpDDSPrimary->GetAttachedSurface(&ddscaps,&lpDDSBuffer);
LPDIRECTDRAWPALETTE lpDDPal;
lpDDPal=DDLoadPalette(lpDD,BMPFILE);
lpDDPal->GetEntries(0,0,255,DefaultPE);
if(lpDDPal) lpDDSPrimary->SetPalette(lpDDPal);
lpDD->CreatePalette(DDPCAPS_8BIT|DDPCAPS_ALLOW256,DefaultPE,&lpDDPalette,NULL);
lpDDSPrimary->SetPalette(lpDDPalette);
ddsd.dwSize=sizeof(ddsd);
ddsd.dwFlags=DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH;
ddsd.ddsCaps.dwCaps=DDSCAPS_OFFSCREENPLAIN|DDSCAPS_SYSTEMMEMORY;
ddsd.dwWidth=325;
ddsd.dwHeight=592;
lpDD->CreateSurface(&ddsd,&lpDDSBack,NULL);
DDReLoadBitmap(lpDDSBack,BMPFILE);
DDSetColorKey(lpDDSBack,RGB(0,128,128));
SetReady(true);
return(true);
}
bool CScreen::BeReady(void)
{
return DDReady;
}
void CScreen::SetReady(bool ready)
{
DDReady=ready;
}
void CScreen::SetModify(bool m=true)
{
Modified=m;
}
bool CScreen::BeModified(void)
{
return Modified;
}
HRESULT CScreen::RestoreDD(void)
{
//To do:
HRESULT ddrval;
ddrval=lpDDSPrimary->Restore();
if(ddrval!=DD_OK)
return ddrval;
// lpDDPalette=DDLoadPalette(lpDD,BMPFILE);
if(lpDDPalette) lpDDSPrimary->SetPalette(lpDDPalette);
ddrval=lpDDSBuffer->Restore();
if(ddrval!=DD_OK)
return ddrval;
ddrval=lpDDSBack->Restore();
if(ddrval!=DD_OK)
return ddrval;
ddrval=DDReLoadBitmap(lpDDSBack,BMPFILE);
SetReady(true);
return ddrval;
}
HRESULT CScreen::PutSpt(int x,int y,int index)
{
//To do:
HRESULT ddrval;
while(1)
{
ddrval=lpDDSBuffer->BltFast(x,y,lpDDSBack,pSpt+index,DDBLTFAST_SRCCOLORKEY);
if(ddrval==DDERR_SURFACELOST)
{
ddrval=RestoreDD();
if(ddrval!=DD_OK)
{
if(ddrval==DDERR_SURFACELOST)
SetReady(false);
return ddrval;
}
}
else break;
}
SetReady(true);
return ddrval;
}
HRESULT CScreen::Flip(void)
{
HRESULT ddrval;
while(1)
{
ddrval=lpDDSPrimary->Flip(NULL,0);
if(ddrval==DDERR_SURFACELOST)
{
ddrval=RestoreDD();
if(ddrval!=DD_OK)
{
if(ddrval==DDERR_SURFACELOST)
SetReady(false);
return ddrval;
}
}
else break;
}
SetReady(true);
return ddrval;
}
CScreen::~CScreen()
{
//To do:
lpDD->RestoreDisplayMode();
DeleteDirectDraw();
}
void CScreen::DeleteDirectDraw(void)
{
if(lpDD!=NULL)
{
if(lpDDSPrimary!=NULL)
{
if(lpDDSBuffer!=NULL)
{
lpDDSBuffer->Release();
lpDDSBuffer=NULL;
}
lpDDSPrimary->Release();
lpDDSPrimary=NULL;
}
if(lpDDSBack!=NULL)
{
lpDDSBack->Release();
lpDDSBack=NULL;
}
lpDD->Release();
lpDD=NULL;
}
delete[] pSpt;
}
//Defines of the class CBomb:
CBomb::CBomb():BombX(0),BombY(0),Active(false),Direction(0)
{
//To do:
pScreen=GetTheScreen();
pGame=GetTheGame();
}
int CBomb::Able(int d)
{
//To do:
int res=0;
unsigned char *p1=pGame->GetCurrMap()+BombX+(BombY<<5);
unsigned char *p2=pGame->GetCurrImage()+BombX+(BombY<<5);
switch(d)
{
case 0://Up
if(*(p2+32)==10)
{
*(p2+32)=0;
Active=false;
return 10;
}
if(*(p2+32)>2) *(p2+32)=0;
if(BombY<0) return 5;
if(*p2==3)
{
*p2=10;
Active=false;
return 9;
}
if(*p1==25||*p1==26)
{
*p1=30;
return 9;
}
if(*(p1+1)==25||*(p1+1)==26)
{
*(p1+1)=30;
return 9;
}
if(*p1==28||*(p1+1)==28) return 5;
if(pTank->BeEnemy()&&(*p2==1||*(p2+1)==1))
{
if(*p2==1) *p2=4;
if(*(p2+1)==1) *(p2+1)=4;
return 9;
}
if(!pTank->BeEnemy()&&(*p2==2||*(p2+1)==2))
{
pTank->AddTotal(50);
if(*p2==2) *p2=4;
if(*(p2+1)==2) *(p2+1)=4;
return 9;
}
break;
case 1://Left
if(*(p2+1)==10)
{
*(p2+1)=0;
Active=false;
return 10;
}
if(*(p2+1)>2) *(p2+1)=0;
if(BombX<0) return 6;
if(*p2==3)
{
*p2=10;
Active=false;
return 9;
}
if(*p1==34)
{
pGame->GameOver();
return 9;
}
if(*p1==25||*p1==26)
{
*p1=30;
return 9;
}
if(*(p1+32)==34)
{
pGame->GameOver();
return 9;
}
if(*(p1+32)==25||*(p1+32)==26)
{
*(p1+32)=30;
return 9;
}
if(*p1==28||*(p1+32)==28) return 6;
if(pTank->BeEnemy()&&(*p2==1||*(p2+32)==1))
{
if(*p2==1) *p2=4;
if(*(p2+32)==1) *(p2+32)=4;
return 9;
}
if(!pTank->BeEnemy()&&(*p2==2||*(p2+32)==2))
{
pTank->AddTotal(50);
if(*p2==2) *p2=4;
if(*(p2+32)==2) *(p2+32)=4;
return 9;
}
break;
case 2://Down
if(*(p2-32)==10)
{
*(p2-32)=0;
Active=false;
return 10;
}
if(*(p2-32)>2) *(p2-32)=0;
if(BombY>30) return 7;
if(*p2==3)
{
*p2=10;
Active=false;
return 9;
}
if(*(p1+32)==34)
{
pGame->GameOver();
return 9;
}
if(*(p1+32)==25||*(p1+32)==26)
{
*(p1+32)=30;
return 9;
}
if(*(p1+33)==34)
{
pGame->GameOver();
return 9;
}
if(*(p1+33)==25||*(p1+33)==26)
{
*(p1+33)=30;
return 9;
}
if(*(p1+32)==28||*(p1+33)==28) return 7;
if(pTank->BeEnemy()&&(*(p2-1)==1||*(p2)==1))
{
if(*(p2-1)==1) *(p2-1)=4;
if(*(p2)==1) *(p2)=4;
return 9;
}
if(!pTank->BeEnemy()&&(*(p2-1)==2||*(p2)==2))
{
pTank->AddTotal(50);
if(*(p2)==1) *(p2)=4;
if(*(p2-1)==2) *(p2-1)=4;
return 9;
}
break;
case 3://Right
if(*(p2-1)==10)
{
*(p2-1)=0;
Active=false;
return 10;
}
if(*(p2-1)>2) *(p2-1)=0;
if(BombX>30) return 8;
if(*p2==3)
{
*p2=10;
Active=false;
return 9;
}
if(*(p1+1)==34)
{
pGame->GameOver();
return 9;
}
if(*(p1+1)==25||*(p1+1)==26)
{
*(p1+1)=30;
return 9;
}
if(*(p1+33)==34)
{
pGame->GameOver();
return 9;
}
if(*(p1+33)==25||*(p1+33)==26)
{
*(p1+33)=30;
return 9;
}
if(*(p1+1)==28||*(p1+33)==28) return 8;
if(pTank->BeEnemy()&&(*p2==1||*(p2+33)==1))
{
if(*p2==1) *p2=4;
if(*(p2+33)==1) *(p2+33)=4;
return 9;
}
if(!pTank->BeEnemy()&&(*p2==2||*(p2+33)==2))
{
pTank->AddTotal(50);
if(*p2==2) *p2=4;
if(*(p2+33)==2) *(p2+33)=4;
return 9;
}
break;
}
return res;
}
void CBomb::Go(void)
{
//To do:
unsigned char *p=pGame->GetCurrImage();
if(Active)
{
int res=Able(Direction);
switch(res)
{
case 5:
if(BombY<0) pScreen->PutSpt(BombX*15,0,72);
else pScreen->PutSpt(BombX*15,(BombY+1)*15,72);
Active=false;
break;
case 6:
if(BombX<0) pScreen->PutSpt(0,BombY*15,73);
else pScreen->PutSpt((BombX+1)*15,BombY*15,73);
Active=false;
break;
case 7:
if(BombY>30) pScreen->PutSpt(BombX*15,450,74);
else pScreen->PutSpt(BombX*15,(BombY-1)*15,74);
Active=false;
break;
case 8:
if(BombX>30) pScreen->PutSpt(450,BombY*15,75);
else pScreen->PutSpt((BombX-1)*15,BombY*15,75);
Active=false;
break;
case 9:
if(BombY==0&&Direction==0) pScreen->PutSpt(BombX*15,0,77);
else if(BombX==0&&Direction==1) pScreen->PutSpt(0,BombY*15,78);
else if(BombY>30&&Direction==2) pScreen->PutSpt(BombX*15,BombY*15,79);
else if(BombX>30&&Direction==3) pScreen->PutSpt(BombX*15,BombY*15,80);
else pScreen->PutSpt(BombX*15,BombY*15,76);
Active=false;
break;
case 0:
*(p+BombX+(BombY<<5))=3;
pScreen->PutSpt(BombX*15+12,BombY*15+12,71);
switch(Direction)
{
case 0:
BombY--;
break;
case 1:
BombX--;
break;
case 2:
BombY++;
break;
case 3:
BombX++;
break;
}
break;
case 10:
break;
}
// Active=false;
}
}
void CBomb::SetDirection(int d)
{
//To do:
Direction=d;
}
void CBomb::SetActive(bool b)
{
//To do:
Active=b;
}
void CBomb::SetXY(int x,int y)
{
//To do:
BombX=x;
BombY=y;
}
bool CBomb::BeActive(void)
{
//To do:
return Active;
}
void CBomb::SetTank(CTank* p)
{
//To do:
pTank=p;
}
CBomb::~CBomb()
{
//To do:
}
//Global functions:
CScreen* GetTheScreen()
{
return &theScreen;
}
CGame* GetTheGame()
{
return &theGame;
}
CMap* GetTheMap()
{
return &theMap;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -