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

📄 gameengine.cpp

📁 本游戏是一款单机版的坦克大战游戏
💻 CPP
📖 第 1 页 / 共 5 页
字号:
			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 + -