📄 tankfighting.cpp
字号:
//----------------------------------------------------------------------------
// 文件名: TankFighting.cpp
//
// 描述:用于坦克大战应用程序实现
//
// 作者:朱波 创建日期:2007-03-19
//----------------------------------------------------------------------------
#include <windows.h> // include important windows stuff
#include <windowsx.h>
#include <mmsystem.h>
#include <iostream.h> // include important C/C++ stuff
#include <conio.h>
#include <stdlib.h>
#include <malloc.h>
#include <memory.h>
#include <string.h>
#include <stdarg.h>
#include <stdio.h>
#include <math.h>
#include <io.h>
#include <fcntl.h>
#include <sys/timeb.h>
#include <time.h>
#include <vector>
#include <string>
using namespace std;
#include <ddraw.h>
#include <dsound.h>
#include "gameapp.h"
#include "dxtools.h"
#include "TankFighting.h"
GAMESTATE Menu_Item[] = { GAME_START, GAME_INTRO, GAME_OPTSETTING, GAME_OUT};
INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, INT )
{
CMyGameApplication gameApp;
if( FAILED( gameApp.Create( hInst, "TankFighting" ) ) )
{
return 0;
}
return gameApp.Run();
} //end WinMain
LRESULT CMyGameApplication::MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
switch (uMsg)
{
case WM_MOUSEMOVE:
{
m_mouse_x = (int)LOWORD(lParam);
m_mouse_y = (int)HIWORD(lParam);
m_mouse_button = (int)wParam;
return(0);
}
break;
case WM_LBUTTONDOWN:
{
m_mouse_x = (int)LOWORD(lParam);
m_mouse_y = (int)HIWORD(lParam);
m_mouse_button = (int)wParam;
return(0);
}
break;
case WM_RBUTTONDOWN:
{
m_mouse_x = (int)LOWORD(lParam);
m_mouse_y = (int)HIWORD(lParam);
m_mouse_button = (int)wParam;
return(0);
}
break;
default:
break;
}
return DefWindowProc( hWnd, uMsg, wParam, lParam );
} //end MsgProc
CMyGameApplication::CMyGameApplication( void )
{
int i, j;
m_mouse_x = 0;
m_mouse_y = 0;
m_mouse_button = 0;
m_cur_time = 0;
m_pre_time = 0;
m_background_surface_menu = NULL;
m_background_surface_game = NULL;
m_cur_menuitem = GAME_START;
for ( i = 0; i < MENU_ITEM_NUM*2; i++)
{
m_menuitem_surface[i] = NULL;
}
for ( i = 0; i < TANK_KIND_NUM; i++)
{
for ( j = 0; j < TANK_PIC_CELL_COUNT; j++)
{
m_tank_surface[i][j] = NULL;
}
}
for ( i = 0; i < SLUG_PIC_CELL_COUNT; i++)
{
m_slug_surface[i] = NULL;
}
for ( i = 0; i < BARRIER_PIC_COUNT; i++)
{
m_barrier_surface[i] = NULL;
}
for ( i = 0; i< TANKEXPLORED_PIC_CELL_COUNT; i++)
{
m_tankexplored_surface[i] = NULL;
}
m_game_fail_surface = NULL;
m_game_acom_surface = NULL;
m_mission_fail_sound_id = -1;
m_mission_acom_sound_id = -1;
m_tank_explored_sound_id = -1;
m_tank_fire_sound_id = -1;
m_bGameStop = FALSE;
m_barrier_count = 0;
m_cur_geometry_count = 0;
m_cur_computer_count = 0;
m_cur_barrier_count = 0;
m_cur_slug_count = 0;
m_cur_tankexplored_count = 0;
m_total_computer = 0;
m_total_player = 0;
m_total_score = 0;
m_game_level = 1;
m_show_computer_count = 5;
m_bPlayerDie = FALSE;
}
CMyGameApplication::~CMyGameApplication( void )
{}
INT CMyGameApplication::LoadResource( void )
{
char temp_buffer[60];
int i, j;
//加载Menu背景图片
if (!Load_Bitmap_File(&bitmap_temp,"pic\\menu_background.bmp"))
{
return(0);
}
if(!(m_background_surface_menu = DDraw_Create_Surface(SCREEN_WIDTH, SCREEN_HEIGHT, 0, -1)))
{
return(0);
}
Scan_Bitmap24_Surface(m_background_surface_menu, bitmap_temp, 0, 0, 0,
0, SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_WIDTH, SCREEN_WIDTH, -1);
Unload_Bitmap_File(&bitmap_temp);
//加载Menu_Item图片
for(i=0; i<MENU_ITEM_NUM*2; i++)
{
if(i%2==0)
sprintf(temp_buffer,"pic\\menu_item0%d%c.bmp",i/2,'a');
else
sprintf(temp_buffer,"pic\\menu_item0%d%c.bmp",i/2,'b');
if (!Load_Bitmap_File(&bitmap_temp, temp_buffer) )
{
return(0);
}
if(!(m_menuitem_surface[i] = DDraw_Create_Surface(SCREEN_WIDTH, MENU_ITEM_HEIGHT, 0, 0)))
{
return(0);
}
Scan_Bitmap24_Surface(m_menuitem_surface[i], bitmap_temp, 0, 0, 0,
0, MENU_ITEM_WIDTH, MENU_ITEM_HEIGHT, SCREEN_WIDTH, MENU_ITEM_WIDTH, -1);
Unload_Bitmap_File(&bitmap_temp);
}
m_cur_menuitem = GAME_START;
//加载游戏运行时背景图片
if (!Load_Bitmap_File(&bitmap_temp,"pic\\game_background.bmp"))
{
return(0);
}
if(!(m_background_surface_game = DDraw_Create_Surface(SCREEN_WIDTH, SCREEN_HEIGHT, 0, -1)))
{
return(0);
}
Scan_Bitmap24_Surface(m_background_surface_game, bitmap_temp, 0, 0, 0,
0, SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_WIDTH, SCREEN_WIDTH, -1);
Unload_Bitmap_File(&bitmap_temp);
//加载坦克图片
for (i=0; i<TANK_KIND_NUM; i++)
{
sprintf(temp_buffer, "pic\\TANK%d.bmp", i);
if (!Load_Bitmap_File(&bitmap_temp, temp_buffer) )
{
return(0);
}
for (j=0; j<TANK_PIC_CELL_COUNT; j++)
{
if(!(m_tank_surface[i][j] = DDraw_Create_Surface(SCREEN_WIDTH, TANK_PIC_CELL_HEIGHT, 0, _RGB32BIT(0,0,255,0))))
{
return(0);
}
Scan_Bitmap24_Surface(m_tank_surface[i][j], bitmap_temp, 0, 0, j*(TANK_PIC_CELL_WIDTH+1)+1,
0, TANK_PIC_CELL_WIDTH, TANK_PIC_CELL_HEIGHT, SCREEN_WIDTH, SCREEN_WIDTH, -1);
}
Unload_Bitmap_File(&bitmap_temp);
}
//加载障碍物图片
for (i=0; i<BARRIER_PIC_COUNT; i++)
{
sprintf(temp_buffer, "pic\\BARRIER%d.bmp", i);
if (!Load_Bitmap_File(&bitmap_temp, temp_buffer) )
{
return(0);
}
if(!(m_barrier_surface[i] = DDraw_Create_Surface(SCREEN_WIDTH, BARRIER_PIC_HEIGHT, 0, _RGB32BIT(0,0,255,0))))
{
return(0);
}
Scan_Bitmap24_Surface(m_barrier_surface[i], bitmap_temp, 0, 0, 0,
0, BARRIER_PIC_WIDTH, BARRIER_PIC_HEIGHT, SCREEN_WIDTH, SCREEN_WIDTH, -1);
Unload_Bitmap_File(&bitmap_temp);
}
//加载子弹图片
for (i=0; i<SLUG_PIC_CELL_COUNT; i++)
{
if (!Load_Bitmap_File(&bitmap_temp, "pic\\SLUG.bmp") )
{
return(0);
}
if(!(m_slug_surface[i] = DDraw_Create_Surface(SCREEN_WIDTH, SLUG_PIC_CELL_HEIGHT, 0, _RGB32BIT(0,0,255,0))))
{
return(0);
}
Scan_Bitmap24_Surface(m_slug_surface[i], bitmap_temp, 0, 0, i*(SLUG_PIC_CELL_WIDTH+1)+1,
0, SLUG_PIC_CELL_WIDTH, SLUG_PIC_CELL_HEIGHT, SCREEN_WIDTH, SCREEN_WIDTH, -1);
Unload_Bitmap_File(&bitmap_temp);
}
//加载爆破图片
for (i=0; i<TANKEXPLORED_PIC_CELL_COUNT; i++)
{
if (!Load_Bitmap_File(&bitmap_temp, "pic\\TANKEXPLORED.bmp") )
{
return(0);
}
if(!(m_tankexplored_surface[i] = DDraw_Create_Surface(SCREEN_WIDTH, TANKEXPLORED_PIC_CELL_HEIGHT, 0, _RGB32BIT(0,0,255,0))))
{
return(0);
}
Scan_Bitmap24_Surface(m_tankexplored_surface[i], bitmap_temp, 0, 0, i*(TANKEXPLORED_PIC_CELL_WIDTH+1)+1,
0, TANKEXPLORED_PIC_CELL_WIDTH, TANKEXPLORED_PIC_CELL_HEIGHT, SCREEN_WIDTH, SCREEN_WIDTH, -1);
Unload_Bitmap_File(&bitmap_temp);
}
//加载任务失败提示图片
if (!Load_Bitmap_File(&bitmap_temp,"pic\\mission_fail.bmp"))
{
return(0);
}
if(!(m_game_fail_surface = DDraw_Create_Surface(SCREEN_WIDTH, GAME_FAIL_PIC_HEIGHT, 0, _RGB32BIT(0,0,255,0))))
{
return(0);
}
Scan_Bitmap24_Surface(m_game_fail_surface, bitmap_temp, 0, 0, 0,
0, GAME_FAIL_PIC_WIDTH, GAME_FAIL_PIC_HEIGHT, SCREEN_WIDTH, GAME_FAIL_PIC_WIDTH, -1);
Unload_Bitmap_File(&bitmap_temp);
//加载任务完成提示图片
if (!Load_Bitmap_File(&bitmap_temp,"pic\\mission_acom.bmp"))
{
return(0);
}
if(!(m_game_acom_surface = DDraw_Create_Surface(SCREEN_WIDTH, GAME_ACOM_PIC_HEIGHT, 0, _RGB32BIT(0,0,255,0))))
{
return(0);
}
Scan_Bitmap24_Surface(m_game_acom_surface, bitmap_temp, 0, 0, 0,
0, GAME_ACOM_PIC_WIDTH, GAME_ACOM_PIC_HEIGHT, SCREEN_WIDTH, GAME_ACOM_PIC_WIDTH, -1);
Unload_Bitmap_File(&bitmap_temp);
//声音相关处理
// create a directsound object
if (DirectSoundCreate(NULL, &lpds, NULL)!=DS_OK )
return(0);
// set cooperation level
if (lpds->SetCooperativeLevel(main_window_handle,DSSCL_NORMAL)!=DS_OK)
return(0);
// clear array out
memset(sound_fx,0,sizeof(pcm_sound)*MAX_SOUNDS);
// initialize the sound fx array
for (int index=0; index<MAX_SOUNDS; index++)
{
// test if this sound has been loaded
if (sound_fx[index].dsbuffer)
{
// stop the sound
sound_fx[index].dsbuffer->Stop();
// release the buffer
sound_fx[index].dsbuffer->Release();
} // end if
// clear the record out
memset(&sound_fx[index],0,sizeof(pcm_sound));
// now set up the fields
sound_fx[index].state = SOUND_NULL;
sound_fx[index].id = index;
} // end for index
if ( ( m_mission_fail_sound_id = DSound_Load_WAV("sound\\mission_fail.wav") ) == -1 )
{
return(0);
}
if ( ( m_mission_acom_sound_id = DSound_Load_WAV("sound\\mission_acom.wav") ) == -1 )
{
return(0);
}
if ( ( m_tank_explored_sound_id = DSound_Load_WAV("sound\\tank_explored.wav") ) == -1 )
{
return(0);
}
if ( ( m_tank_fire_sound_id = DSound_Load_WAV("sound\\tank_fire.wav") ) == -1 )
{
return(0);
}
return(1);
} //end LoadResource
INT CMyGameApplication::GameMenu( void )
{
int index;
//处理键盘输入
if (KEYDOWN(VK_UP))
{
for (index=0;Menu_Item[index]!=m_cur_menuitem;index++){}
if(index>0)
{
index--;
m_cur_menuitem=Menu_Item[index];
m_mouse_x=0;
m_mouse_y=0;
}
}
if (KEYDOWN(VK_DOWN))
{
for (index=0;Menu_Item[index]!=m_cur_menuitem;index++){}
if(index<MENU_ITEM_NUM-1)
{
index++;
m_cur_menuitem=Menu_Item[index];
m_mouse_x=0;
m_mouse_y=0;
}
}
if (KEYDOWN(VK_RETURN))
{
m_game_state = m_cur_menuitem;
}
//处理鼠标输入
for (index=0; index<MENU_ITEM_NUM; index++)
{
if (m_mouse_x>=MENU_ITEM_STARTX+30 && m_mouse_x<MENU_ITEM_STARTX+200-40 &&
m_mouse_y>=MENU_ITEM_STARTY+index*MENU_ITEM_HEIGHT && m_mouse_y<MENU_ITEM_STARTY+(index+1)*MENU_ITEM_HEIGHT )
{
m_cur_menuitem=Menu_Item[index];
break;
}
}
if ((m_mouse_button & MK_LBUTTON)&& m_mouse_x>=MENU_ITEM_STARTX+30 && m_mouse_x<MENU_ITEM_STARTX+200-40 &&
m_mouse_y>=MENU_ITEM_STARTY+index*MENU_ITEM_HEIGHT && m_mouse_y<MENU_ITEM_STARTY+(index+1)*MENU_ITEM_HEIGHT )
{
m_mouse_button = 0;
m_game_state = m_cur_menuitem;
}
//绘制Menu背景图片
DDraw_Draw_Surface(m_background_surface_menu, 0, 0,
SCREEN_WIDTH, SCREEN_HEIGHT, lpddsback,0);
//绘制Menu_Item
int temp=0;
for ( index = 0; index<MENU_ITEM_NUM; index++ )
{
if ( Menu_Item[index] == m_cur_menuitem )
temp=2*index+1;
else
temp=2*index;
DDraw_Draw_Surface(m_menuitem_surface[temp], MENU_ITEM_STARTX,
MENU_ITEM_STARTY + index*MENU_ITEM_HEIGHT,
MENU_ITEM_WIDTH, MENU_ITEM_HEIGHT, lpddsback, 1);
}
//将后备缓冲表面切换到主显示表面显示
while (FAILED(lpddsprimary->Flip(NULL, DDFLIP_WAIT)));
Sleep(100);
return(1);
} //end GameMenu
INT CMyGameApplication::GameStart()
{
ShowCursor( FALSE );
m_game_state=GAME_INIT;
return(1);
} //end GameStart
INT CMyGameApplication::GameIntro( void )
{
m_game_state = GAME_MENU;
return(1);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -