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

📄 tankfighting.cpp

📁 坦克大战小游戏 控制说明: 玩家1相关控制: A/W/S/D:控制方向 F:开火 1 :玩家1复活 玩家2相关控制: UP/LEFT/RIGHT/DOWN:控制方
💻 CPP
📖 第 1 页 / 共 3 页
字号:
} //end GameIntro

INT CMyGameApplication::GameOptsetting( void )
{
	m_game_state = GAME_MENU;

	return(1);
} //end GameOptsetting

INT CMyGameApplication::GameOut( void )
{
	PostMessage(main_window_handle,WM_QUIT,0,0);

	return(1);
} //end GameOut

INT CMyGameApplication::GameInit( void )
{
	POINT pos;
	GEOMETRY temp_geometry;
	CComputerTank *lpTemp_computer;

	m_game_level = 1;

	m_cur_computer_count = 0;
    m_cur_slug_count = 0;
	m_cur_tankexplored_count = 0;

	m_barrier_count = 20;
	m_total_computer = 10;
	m_total_player	= 3;
	m_total_score  = 0;

	m_show_computer_count=5;

	m_bPlayerDie = FALSE;
    m_bGameStop = FALSE;

	//产生随机地图
	MakeRandomMap();

	//随机产生1辆玩家坦克
	pos.x = rand()%((MAP_REGION.right - MAP_REGION.left)/2) + MAP_REGION.left + 5*TANK_PIC_CELL_WIDTH;
	pos.y = rand()%((MAP_REGION.bottom - MAP_REGION.top)/2) + MAP_REGION.top + 5*TANK_PIC_CELL_WIDTH;
	while ( ! m_player.Create( 0, 0, pos, &m_tank_surface[0][0], &MAP_REGION, 
						&m_geometry_vec ) )
	{
		pos.x = rand()%((MAP_REGION.right - MAP_REGION.left)/2) + MAP_REGION.left + 5*TANK_PIC_CELL_WIDTH;
		pos.y = rand()%((MAP_REGION.bottom - MAP_REGION.top)/2) + MAP_REGION.top + 5*TANK_PIC_CELL_WIDTH;
	}

	temp_geometry.m_lpBoundingBox = &m_player.GetBoundingBox();
	temp_geometry.m_style = GS_PLAYER_TANK;
	temp_geometry.m_objectID = 10000;
	m_geometry_vec.push_back(temp_geometry);

	//随机产生可见的电脑坦克,与玩家坦克区别
	for (int i=0; i<m_show_computer_count; i++)
	{
		int kind = rand()%(TANK_KIND_NUM-1) + 1;

		pos.x = rand()%((MAP_REGION.right - MAP_REGION.left)/2) + MAP_REGION.left + 5*TANK_PIC_CELL_WIDTH;
		pos.y = rand()%((MAP_REGION.bottom - MAP_REGION.top)/2) + MAP_REGION.top + 5*TANK_PIC_CELL_WIDTH;
		
		lpTemp_computer = new CComputerTank();

		if ( NULL == lpTemp_computer )
		{
			PostMessage(main_window_handle,WM_QUIT,0,0);
			return(0);
		}

		while ( !lpTemp_computer->Create( kind, 0, pos, &m_tank_surface[0][0], &MAP_REGION, 
						&m_geometry_vec ) )
		{
			pos.x = rand()%((MAP_REGION.right - MAP_REGION.left)/2) + MAP_REGION.left + 5*TANK_PIC_CELL_WIDTH;
			pos.y = rand()%((MAP_REGION.bottom - MAP_REGION.top)/2) + MAP_REGION.top + 5*TANK_PIC_CELL_WIDTH;
		}

		temp_geometry.m_lpBoundingBox = &lpTemp_computer->GetBoundingBox();
		temp_geometry.m_style = GS_COMPUTER_TANK;
		temp_geometry.m_objectID = 20000+i;
		m_geometry_vec.push_back(temp_geometry);

		m_computer_vec.push_back(lpTemp_computer);

		m_cur_computer_count++;

	}

	m_game_state = GAME_RUNNING;

	return(1);
} //end GameInit

INT CMyGameApplication::InputProcess( void )
{
	int		time = 0;
	GEOMETRY *lpGeometry = NULL;
	CSlug	*lpSlug = NULL;

	if ( KEYDOWN(VK_ESCAPE) )
	{
		ShowCursor(TRUE);
		ReleaseObjects();
		m_bGameStop = TRUE;
		m_game_state = GAME_MENU;

		return(0);
	}

	if ( m_bPlayerDie || m_bGameStop )
	{
		return(0);
	}

	m_cur_time=GetTickCount()%100000;

	if(m_cur_time - m_pre_time<0)
		 time = 100000 - m_pre_time + m_cur_time;
	else
		 time = m_cur_time - m_pre_time;

	if ( time > 20 )
	{
		m_pre_time = m_cur_time;

	    if ( KEYDOWN('D') || KEYDOWN('d') || KEYDOWN(VK_RIGHT))
		{
			if ( m_player.SetDirect(0) )
			{
				if ( m_player.TestMoving() )
				{
					m_player.Move();
				}
			}
		}
		else if ( KEYDOWN('S') || KEYDOWN('s') || KEYDOWN(VK_DOWN) )
		{
		    if ( m_player.SetDirect(1) )
			{
				if ( m_player.TestMoving() )
				{
				m_player.Move();
				}
			}
		}
		else if ( KEYDOWN('A') || KEYDOWN('a') || KEYDOWN(VK_LEFT))
		{
		    if ( m_player.SetDirect(2) )
			{
				if ( m_player.TestMoving() )
				{
					m_player.Move();
				}
			}
		} 
		else if ( KEYDOWN('W') || KEYDOWN('w') || KEYDOWN(VK_UP))
		{
			if ( m_player.SetDirect(3) )
			{
				if ( m_player.TestMoving() )
				{
					m_player.Move();
				}
			}
		}
		
		if ( KEYDOWN('F') || KEYDOWN('f') || KEYDOWN(VK_ESCAPE) )
		{
			lpGeometry = new GEOMETRY;

			if ( NULL != lpGeometry )
			{
				int res = m_player.Fire( &lpSlug, &m_slug_surface[0] );

				if ( res )
				{
					sound_fx[m_tank_fire_sound_id].dsbuffer->Play(0,0,0);

					lpGeometry->m_lpBoundingBox = &lpSlug->GetBoundingBox();
					lpGeometry->m_style = GS_PLAYER_SLUG;
					lpGeometry->m_objectID = 0;

					m_geometry_vec.push_back(*lpGeometry);
					m_slug_vec.push_back(lpSlug);
				}
				
				delete lpGeometry;
			}
		}
	}

	return(1);  
} //end InputProcess

INT	CMyGameApplication::DoAI( void )
{
	GEOMETRY *lpGeometry=NULL;
	CSlug	*lpSlug;
	vector<CComputerTank *>::iterator it_computer;

	if ( m_bGameStop )
		return(0);

	for ( it_computer=m_computer_vec.begin(); 
				it_computer!=m_computer_vec.end(); it_computer++ )
	{
		if ( !(*it_computer)->DoAI() )
		{
			return(0);
		}

		int res = (*it_computer)->Fire( &lpSlug, &m_slug_surface[0] );

		if ( res )
		{
//			sound_fx[m_tank_fire_sound_id].dsbuffer->Play(0,0,0);

			lpGeometry = new GEOMETRY;

			if ( NULL == lpGeometry )
			{
				PostMessage(main_window_handle,WM_QUIT,0,0);
				return(0);
			}
			
			lpGeometry->m_lpBoundingBox = &lpSlug->GetBoundingBox();
			lpGeometry->m_style = GS_COMPUTER_SLUG;
			lpGeometry->m_objectID = 0;

			m_geometry_vec.push_back(*lpGeometry);
			m_slug_vec.push_back(lpSlug);
			
			delete lpGeometry;
		}
	}

	return(1);
}

INT CMyGameApplication::Draw( void )
{
	char str_buffer[50];
	int	 res;
	int  player1_total_tank, player1_total_score;
	int  player2_total_tank, player2_total_score;

	if ( !m_bGameStop )
	{

	    DDraw_Draw_Surface(m_background_surface_game,0,0, SCREEN_WIDTH, SCREEN_HEIGHT, lpddsback,0);

		for ( vector<CSlug *>::iterator it_slug=m_slug_vec.begin(); 
				it_slug!=m_slug_vec.end(); it_slug++ )
		{
			(*it_slug)->Draw();			
		}

		if ( !m_bPlayerDie )
			m_player.Draw();

		for ( vector<CComputerTank *>::iterator it_computer = m_computer_vec.begin(); 
				it_computer != m_computer_vec.end(); it_computer++ )
		{
			(*it_computer)->Draw();			
		}

		for (vector<CBarrier *>::iterator it_barrier = m_barrier_vec.begin(); 
			it_barrier != m_barrier_vec.end(); it_barrier++)
		{
			(*it_barrier)->Draw();		
		}

		for (vector<CExplored *>::iterator it_explored = m_tankexplored_vec.begin();
			it_explored != m_tankexplored_vec.end(); it_explored++)
		{
			(*it_explored)->Draw();		
		}
	
		while (FAILED(lpddsprimary->Flip(NULL, DDFLIP_WAIT)));
	
	}

	//获取玩家1的游戏信息
	if ( NULL == m_player_table[0] )
	{
		player1_total_tank = 0;
		player1_total_tank = 0;
	}
	else
	{
//		player1_total_tank = m_player_table[0];
	}

	if ( IntToStr( str_buffer, 50, m_total_player ) )
	{
		DrawGDIText( 143, 4, str_buffer, RGB(255,255,255), RGB(128,0,255) );
	}

	if ( IntToStr( str_buffer, 50, m_total_score ) )
	{
		DrawGDIText( 280, 4, str_buffer, RGB(255,255,255), RGB(128,0,255) );
	}

	if ( IntToStr( str_buffer, 50, m_total_computer ) )
	{
		DrawGDIText( 594, 4, str_buffer, RGB(255,255,255), RGB(128,0,255) );
	}

	if ( IntToStr( str_buffer, 50, m_game_level ) )
	{
		DrawGDIText( 420, 4, str_buffer, RGB(255,255,255), RGB(128,0,255) );
	}

	return(1);
} //end Draw

int	CMyGameApplication::MakeRandomMap( void )
{
	int i = 0;
	POINT pos;
	CBarrier *temp_barrier = NULL;
	GEOMETRY temp_geometry;

	for (i=0; i<m_barrier_count; i++)
	{
		temp_barrier = new CBarrier();

		if ( NULL == temp_barrier )
		{
			PostMessage(main_window_handle,WM_QUIT,0,0);
			return(0);
		}

		pos.x = rand()%(MAP_REGION.right - MAP_REGION.left) + MAP_REGION.left;
		pos.y = rand()%(MAP_REGION.bottom - MAP_REGION.top) + MAP_REGION.top;		
		
		while ( ! temp_barrier->Create( rand()%BARRIER_PIC_COUNT, pos, 
				&m_barrier_surface[0], &MAP_REGION, &m_geometry_vec ) )
		{
			pos.x = rand()%(MAP_REGION.right - MAP_REGION.left) + MAP_REGION.left;
			pos.y = rand()%(MAP_REGION.bottom - MAP_REGION.top) + MAP_REGION.top;			
		}
	
		temp_geometry.m_lpBoundingBox = &temp_barrier->GetBoundingBox();
		temp_geometry.m_style = GS_BARRIER;
		temp_geometry.m_objectID = 00000;
		m_geometry_vec.push_back(temp_geometry);
		m_barrier_vec.push_back(temp_barrier);
	}

	return(1);
}

INT CMyGameApplication::DoPhysics( void )
{
	GEOMETRY temp_geometry, temp_geometry2;
	int hit_res = 0;
	int explored_res = 0;
	vector<GEOMETRY>::iterator it_geometry = NULL;
	vector<CExplored *>::iterator it_explored = NULL;

	if ( m_bGameStop )
		return(0);

	//进行子弹碰撞处理
	for ( vector<CSlug *>::iterator it_slug=m_slug_vec.begin(); 
				it_slug!=m_slug_vec.end(); it_slug++ )
	{

		(*it_slug)->Move();
		
		hit_res = (*it_slug)->TestHitting( &temp_geometry );

		switch (hit_res)
		{ 
		  case 0:		//未发生碰撞
			   continue;
			   break;

		  case 1:       //与几何体发生碰撞
			   

			   //根据子弹对应类型,进行相关的碰撞处理
			   for ( it_geometry=m_geometry_vec.begin(); 
					it_geometry!=m_geometry_vec.end(); it_geometry++ )
				{
					if ( it_geometry->m_lpBoundingBox == &(*it_slug)->GetBoundingBox() )
					{
						temp_geometry2.m_lpBoundingBox = it_geometry->m_lpBoundingBox;
						temp_geometry2.m_objectID = it_geometry->m_objectID;
						temp_geometry2.m_style	= it_geometry->m_style;
						m_geometry_vec.erase(it_geometry);

						//删除子弹对象
						delete (*it_slug);
						m_slug_vec.erase( it_slug );

						//进行被撞几何体逻辑处理
						DoGeometryHittingLogic( temp_geometry2, temp_geometry);

						//撞击逻辑处理后自生的几何体对象也被移出
						break;
					}
				}			   
			 
			   break;

		  case 2:		//与边界发生碰撞
			   
			   //删除子弹对应的几何体对象
			   for ( it_geometry=m_geometry_vec.begin(); 
					it_geometry!=m_geometry_vec.end(); it_geometry++ )
				{
					if ( it_geometry->m_lpBoundingBox == &(*it_slug)->GetBoundingBox() )
					{
						m_geometry_vec.erase(it_geometry);
						break;
					}
				}
				
				//删除子弹对象
				delete (*it_slug);
			    m_slug_vec.erase( it_slug );
			
				break;
		}

		if ( it_slug == m_slug_vec.end() 
		  || m_slug_vec.begin() == m_slug_vec.end() )
		{
				break;
		}
	}	

	//进行爆破处理
	for (it_explored = m_tankexplored_vec.begin(); 
			it_explored != m_tankexplored_vec.end(); it_explored++ )
	{
		explored_res = (*it_explored)->DoExplored();
		
		//爆破结束删除爆破对象
		if ( !explored_res )
		{
			delete (*it_explored);
			m_tankexplored_vec.erase( it_explored );
			m_cur_tankexplored_count--;

			if ( it_explored == m_tankexplored_vec.end() )
			{
				break;
			}
		}
	}

	return(1);
}

int CMyGameApplication::DoGeometryHittingLogic( GEOMETRY & slug_geometry, GEOMETRY & dest_geometry )
{
	vector<GEOMETRY>::iterator it_geometry = NULL;
	vector<CComputerTank *>::iterator it_computer = NULL;
	CExplored *lpExplored = NULL;

	//电脑坦克子弹与玩家坦克相撞情况,玩家坦克被击毁
	if ( slug_geometry.m_style == GS_COMPUTER_SLUG &&
		dest_geometry.m_style == GS_PLAYER_TANK )
	{
		m_total_player--;
		m_bPlayerDie = TRUE;

		if ( m_total_player == 0)
		{
			sound_fx[m_mission_fail_sound_id].dsbuffer->Play(0,0,0);
		}

		//删除玩家坦克对应的几何体对象
		for ( it_geometry = m_geometry_vec.begin(); 
			  it_geometry != m_geometry_vec.end(); it_geometry++ )
		{
			if ( it_geometry->m_lpBoundingBox == dest_geometry.m_lpBoundingBox )
			{
				m_geometry_vec.erase(it_geometry);
				break;
			}
		}

		//产生一个爆破对象
		lpExplored  = new CExplored();

		if ( NULL == lpExplored )
		{
			PostMessage(main_window_handle,WM_QUIT,0,0);			
			return(0);
		}

		lpExplored->Create( m_player.GetPosition(), 
					TANKEXPLORED_PIC_CELL_WIDTH, TANKEXPLORED_PIC_CELL_HEIGHT,
					TANKEXPLORED_PIC_CELL_COUNT, &m_tankexplored_surface[0] );

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -