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

📄 tankfighting.cpp

📁 坦克大战小游戏 控制说明: 玩家1相关控制: A/W/S/D:控制方向 F:开火 1 :玩家1复活 玩家2相关控制: UP/LEFT/RIGHT/DOWN:控制方
💻 CPP
📖 第 1 页 / 共 3 页
字号:
//----------------------------------------------------------------------------
// 文件名: 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 + -