⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 game.cpp

📁 超级坦克大战游戏
💻 CPP
📖 第 1 页 / 共 4 页
字号:
//			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 + -