📄 tankfighting.cpp
字号:
} //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 + -