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

📄 gameapp.cpp

📁 坦克大战小游戏 控制说明: 玩家1相关控制: A/W/S/D:控制方向 F:开火 1 :玩家1复活 玩家2相关控制: UP/LEFT/RIGHT/DOWN:控制方
💻 CPP
字号:
//----------------------------------------------------------------------------
// 文件名: gameapp.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 <ddraw.h>
#include <dsound.h>
#include "dxtools.h"
#include "gameapp.h"

HWND main_window_handle; // 保存全局windows句柄便于DX工具库文件使用
HINSTANCE main_instance; // 保存全局windows实例便于DX工具库文件使用

static CGameApplication* g_pGameApp = NULL; //全局游戏应用程序对象指针,便于Windows消息处理

CGameApplication::CGameApplication( void )
{
	g_pGameApp = this;

	m_game_state = GAME_MENU;
} //end CGameApplication

CGameApplication::~CGameApplication( void )
{
	
} //end CGameApplication

LRESULT CALLBACK WndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
    return g_pGameApp->MsgProc( hWnd, uMsg, wParam, lParam );
} //end WndProc

HRESULT CGameApplication::Create( HINSTANCE hInstance , const TCHAR szGameName[] )
{
	//以下代码实现对Windows的创建
	WNDCLASSEX winclass; 
	HWND	   hwnd;

	//窗口类实例化
	winclass.cbSize         = sizeof(WNDCLASSEX);
	winclass.style			= CS_DBLCLKS | CS_OWNDC | CS_HREDRAW | CS_VREDRAW;
	winclass.lpfnWndProc	= WndProc;
	winclass.cbClsExtra		= 0;
	winclass.cbWndExtra		= 0;
	winclass.hInstance		= hInstance;
	winclass.hIcon			= LoadIcon(NULL, IDI_APPLICATION);
	winclass.hCursor		= LoadCursor(NULL, IDC_ARROW); 
	winclass.hbrBackground	= (HBRUSH)GetStockObject(BLACK_BRUSH);
	winclass.lpszMenuName	= NULL;
	winclass.lpszClassName	= szGameName;
	winclass.hIconSm        = LoadIcon(NULL, IDI_APPLICATION);

	//保存全局窗口实例
	main_instance = hInstance;
	
	//注册窗口类
	if (!RegisterClassEx(&winclass))
	{
		return(0);
	}

	//创建窗口
	if (!(hwnd = CreateWindowEx(NULL,                  // extended style
                            szGameName,     // class
						    szGameName, // title
						    WS_POPUP | WS_VISIBLE,
					 	    0,0,	  // initial x,y
						    SCREEN_WIDTH,SCREEN_HEIGHT,  // initial width, height
						    NULL,	  // handle to parent 
						    NULL,	  // handle to menu
						    hInstance,// instance of this application
						    NULL)))	// extra creation parms
	{
			return(0);
	}

	//保存全局窗口句柄
	main_window_handle = hwnd;

	//以下代码实现对DX接口的初始化
	//创建DX7.0接口对象
	if (FAILED(DirectDrawCreateEx(NULL, (void **)&lpdd, IID_IDirectDraw7, NULL)))
	{
		return(0);
	}

	//设置全屏方式协作级别
	if (FAILED(lpdd->SetCooperativeLevel(main_window_handle, 
                                      DDSCL_FULLSCREEN | DDSCL_ALLOWMODEX | 
                                      DDSCL_EXCLUSIVE | DDSCL_ALLOWREBOOT)))
	{
		return(0);
	}

	//设置显示模式为640x480x32
	if (FAILED(lpdd->SetDisplayMode(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP,0,0)))
	{
		return(0);
	}

	//清空设备表面描述结构
	memset(&ddsd,0,sizeof(ddsd)); 
	ddsd.dwSize = sizeof(ddsd);

	//设置启用后备缓冲表面参数
	ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
	ddsd.dwBackBufferCount = 1;

	//设置主显示表面参数
	ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_COMPLEX | DDSCAPS_FLIP;

	//创建主显示表面对象
	if (FAILED(lpdd->CreateSurface(&ddsd, &lpddsprimary, NULL)))
	{
		return(0);
	}

	//将主显示表面与后备缓冲表面建立关联
	ddsd.ddsCaps.dwCaps = DDSCAPS_BACKBUFFER;
	if (FAILED(lpddsprimary->GetAttachedSurface(&ddsd.ddsCaps, &lpddsback)))
	{
		return(0);
	}

	//加载图片、声音等相关资源文件
	if (!LoadResource())
	{
		return(0);	
	}

	m_game_state = GAME_MENU;
	
	return S_OK;
} //end Create

INT	CGameApplication::Run( void )
{
	MSG		msg;

	while(TRUE)
	{

       //测试消息队列中是否有消息,有的话读取出来进行相关处理
	   if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
	   { 
	      //如果消息为WM_QUIT则退出循环
          if (msg.message == WM_QUIT)
              break;
	
		  //判断是否是加速键消息,是则进行相关的处理
		  TranslateMessage(&msg);

		  //向WndProc发送消息
		  DispatchMessage(&msg);
	   }
 	    
	   //根据当前游戏状态进入相关处理,若不是既定状态值则退出循环
       switch (m_game_state)
	   {
		  case GAME_MENU:
			  
			   GameMenu();
			   
			   break;
		  case GAME_INTRO:
			
			   GameIntro();

			   break;
		  case GAME_OPTSETTING:
			  
			   GameOptsetting();
				
			   break;
		  case GAME_OUT:
	
			   GameOut();
			   
			   break;
		  case GAME_INIT:

			   GameInit();

			   break;
		  case GAME_START:
			  
			   GameStart();

			   break;
		  case GAME_RUNNING:

			   InputProcess();
			   DoAI();
			   DoPhysics();
			   DoLogic();
			   Draw();

			   break;
		  case GAME_LEVELUP:

			   GameLevelUp();

			   break;
		  case GAME_OVER:

			   GameOver();

			   break;
		  case GAME_RESTART:
			
			   GameRestart();

			   break;
		  default:
			   
			   PostMessage(main_window_handle,WM_QUIT,0,0);

			   break; 
	   }
       
	}

	Release();
    
	return (INT)msg.wParam;
} //end Run

INT	CGameApplication::Release( void )
{
	if ( NULL != lpddsback )
	{
	   lpddsback->Release();
	   lpddsback = NULL;
	}

    if ( NULL != lpddsprimary )
    {
	   lpddsprimary->Release();
	   lpddsprimary = NULL;
    }

    if ( NULL != lpdd )
    {
       lpdd->Release();
       lpdd = NULL;
    } 	

	GameShutDown();

	return(1);
} //end Release

LRESULT CGameApplication::MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
    return DefWindowProc( hWnd, uMsg, wParam, lParam );
} //end MsgProc

⌨️ 快捷键说明

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