📄 tankfighting.cpp
字号:
m_tankexplored_vec.push_back( lpExplored );
m_cur_tankexplored_count++;
sound_fx[m_tank_explored_sound_id].dsbuffer->Play(0,0,0);
}
//玩家坦克子弹与电脑坦克相撞情况,电脑坦克被击毁
else if ( slug_geometry.m_style == GS_PLAYER_SLUG &&
dest_geometry.m_style == GS_COMPUTER_TANK )
{
m_cur_computer_count--;
m_total_computer--;
m_total_score += 20;
if ( m_total_computer == 0 )
{
sound_fx[m_mission_acom_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;
}
}
//删除电脑坦克对象
for ( it_computer = m_computer_vec.begin();
it_computer != m_computer_vec.end(); it_computer++ )
{
if ( dest_geometry.m_lpBoundingBox == &(*it_computer)->GetBoundingBox() )
{
//产生一个爆破对象
lpExplored = new CExplored();
if ( NULL == lpExplored )
{
PostMessage(main_window_handle,WM_QUIT,0,0);
return(0);
}
lpExplored->Create( (*it_computer)->GetPosition(),
TANKEXPLORED_PIC_CELL_WIDTH, TANKEXPLORED_PIC_CELL_HEIGHT,
TANKEXPLORED_PIC_CELL_COUNT, &m_tankexplored_surface[0] );
m_tankexplored_vec.push_back( lpExplored );
m_cur_tankexplored_count++;
sound_fx[m_tank_explored_sound_id].dsbuffer->Play(0,0,0);
//删除电脑坦克对象
delete (*it_computer);
m_computer_vec.erase(it_computer);
break;
}
}
}
return(1);
}
INT CMyGameApplication::DoLogic( void )
{
POINT pos;
CComputerTank *lpTemp_computer;
GEOMETRY temp_geometry;
//判断电脑坦克是否被击毁完,击毁完则认为玩家胜利
if ( m_total_computer <= 0 )
{
if ( ! m_bGameStop )
{
m_bGameStop = TRUE;
}
DDraw_Draw_Surface(m_game_acom_surface,120,208,
GAME_ACOM_PIC_WIDTH, GAME_ACOM_PIC_HEIGHT, lpddsback,1);
while (FAILED(lpddsprimary->Flip(NULL, DDFLIP_WAIT)));
m_game_state = GAME_LEVELUP;
}
//若电脑坦克未被击毁完,判断是否有坦克被击毁灭,根据总数情况,生成新的电脑坦克
else if ( m_cur_computer_count < m_show_computer_count
&& m_total_computer >= m_show_computer_count )
{
for ( int i=0; i<m_show_computer_count-m_cur_computer_count; i++ )
{
int kind = rand()%(TANK_KIND_NUM-1) + 1;
lpTemp_computer = new CComputerTank();
if ( NULL == lpTemp_computer )
{
PostMessage(main_window_handle,WM_QUIT,0,0);
return(0);
}
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 ( !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_show_computer_count;
}
//判断玩家坦克数量是否被击毁完,击毁完则认为玩家失败
if ( m_total_player <= 0 )
{
if ( ! m_bGameStop )
{
m_bGameStop = TRUE;
}
DDraw_Draw_Surface(m_game_fail_surface,120,208,
GAME_FAIL_PIC_WIDTH, GAME_FAIL_PIC_HEIGHT, lpddsback,1);
while (FAILED(lpddsprimary->Flip(NULL, DDFLIP_WAIT)));
m_game_state = GAME_OVER;
}
//若未被击毁完,判断玩家当前是否死亡,死亡的话则将玩家坦克重新设置
else if ( m_bPlayerDie)
{
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.SetPosition(pos) )
{
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);
m_bPlayerDie = FALSE;
}
return(1);
}
int CMyGameApplication::ReleaseObjects( void )
{
vector<CBarrier *>::iterator it_barrier;
vector<CSlug *>::iterator it_slug;
vector<CComputerTank *>::iterator it_computer;
vector<CExplored *>::iterator it_explored;
while ( m_geometry_vec.begin() != m_geometry_vec.end() )
{
m_geometry_vec.pop_back();
}
for ( it_barrier = m_barrier_vec.begin();
it_barrier != m_barrier_vec.end(); it_barrier++ )
{
delete (*it_barrier);
}
while ( !m_barrier_vec.empty() )
{
m_barrier_vec.pop_back();
}
for ( it_slug = m_slug_vec.begin();
it_slug != m_slug_vec.end(); it_slug++ )
{
delete (*it_slug);
}
while ( ! m_slug_vec.empty() )
{
m_slug_vec.pop_back();
}
for ( it_computer = m_computer_vec.begin();
it_computer != m_computer_vec.end(); it_computer++ )
{
delete (*it_computer);
}
while ( ! m_computer_vec.empty() )
{
m_computer_vec.pop_back();
}
for ( it_explored = m_tankexplored_vec.begin();
it_explored != m_tankexplored_vec.end(); it_explored++ )
{
delete (*it_explored);
}
while ( ! m_tankexplored_vec.empty() )
{
m_tankexplored_vec.pop_back();
}
return(1);
}
INT CMyGameApplication::GameLevelUp( void )
{
POINT pos;
GEOMETRY temp_geometry;
CComputerTank *lpTemp_computer;
if ( KEYDOWN(VK_ESCAPE) )
{
ShowCursor(TRUE);
ReleaseObjects();
m_game_state = GAME_MENU;
return(0);
}
if ( !KEYDOWN(VK_RETURN) )
{
return(0);
}
//清空当前所有动态对象
ReleaseObjects();
m_cur_computer_count = 0;
m_cur_slug_count = 0;
m_cur_tankexplored_count = 0;
//过关后,局数增加
m_game_level++;
//障碍物减少1
m_barrier_count--;
if ( m_barrier_count < 0)
{
m_barrier_count = 0;
}
//电脑坦克总数增加5个
m_total_computer = 10 + 5*(m_game_level-1);
//可显示电脑数目增加1个
m_show_computer_count++;
//过三关奖励玩家一辆坦克
if ( 0 == (m_game_level-1) % 2 )
m_total_player++;
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;
lpTemp_computer = new CComputerTank();
if ( NULL == lpTemp_computer )
{
PostMessage(main_window_handle,WM_QUIT,0,0);
return(0);
}
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 ( !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);
}
INT CMyGameApplication::GameOver( void )
{
if ( KEYDOWN(VK_ESCAPE) )
{
ShowCursor(TRUE);
ReleaseObjects();
m_game_state = GAME_MENU;
return(0);
}
if ( ! KEYDOWN(VK_RETURN) )
{
return(0);
}
m_game_state = GAME_RESTART;
}
INT CMyGameApplication::GameRestart( void )
{
ReleaseObjects();
DDraw_Draw_Surface(m_background_surface_game,0,0, SCREEN_WIDTH, SCREEN_HEIGHT, lpddsback,0);
while (FAILED(lpddsprimary->Flip(NULL, DDFLIP_WAIT)));
m_game_state = GAME_INIT;
return(1);
}
INT CMyGameApplication::GameShutDown( void )
{
int i, j;
ReleaseObjects();
//清除资源
if ( NULL != m_background_surface_menu )
{
m_background_surface_menu->Release();
m_background_surface_menu = NULL;
}
if ( NULL != m_background_surface_game )
{
m_background_surface_game->Release();
m_background_surface_game = NULL;
}
for (i=0; i<MENU_ITEM_NUM; i++)
{
if ( NULL != m_menuitem_surface[i] )
{
m_menuitem_surface[i]->Release();
m_menuitem_surface[i] = NULL;
}
}
for (i=0; i<TANK_KIND_NUM; i++)
{
for (j=0; j<TANK_PIC_CELL_COUNT; j++)
{
if ( NULL != m_tank_surface[i][j] )
{
m_tank_surface[i][j]->Release();
m_tank_surface[i][j] = NULL;
}
}
}
for (i=0; i<SLUG_PIC_CELL_COUNT; i++)
{
if ( NULL != m_slug_surface[i] )
{
m_slug_surface[i]->Release();
m_slug_surface[i] = NULL;
}
}
for (i=0; i<BARRIER_PIC_COUNT; i++)
{
if ( NULL != m_barrier_surface[i] )
{
m_barrier_surface[i]->Release();
m_barrier_surface[i] = NULL;
}
}
for (i=0; i<TANKEXPLORED_PIC_CELL_COUNT; i++)
{
if ( NULL != m_tankexplored_surface[i] )
{
m_tankexplored_surface[i]->Release();
m_tankexplored_surface[i] = NULL;
}
}
if ( NULL != m_game_fail_surface )
{
m_game_fail_surface->Release();
m_game_fail_surface = NULL;
}
if ( NULL != m_game_acom_surface )
{
m_game_acom_surface->Release();
m_game_acom_surface = NULL;
}
return(1);
}
int CMyGameApplication::IntToStr(char destStr[], int dest_maxlen, int num)
{
BOOL bShowMinus = FALSE;
char *p1 = NULL, *p2 = NULL;
char chr = 0;
int num_count = 0;
int num_temp = 0;
if ( NULL == destStr )
{
return(0);
}
if ( dest_maxlen <= 0 )
{
return(0);
}
if ( num < 0 )
{
bShowMinus = TRUE;
}
num_temp = abs(num);
do
{
num_count++ ;
num_temp /= 10;
} while (num_temp != 0);
if ( bShowMinus )
{
num_count++ ;
}
if ( dest_maxlen < num_count+1 )
{
return(0);
}
if ( bShowMinus )
{
num_count--;
*(destStr++) = '-';
}
for ( int i=num_count-1; i>=0; i--)
{
*(destStr++) = '0' + (int)( abs(num)/pow(10, i) ) % 10;
}
*destStr = '\0';
return(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -