[VC++游戏开发]用C++来架构一个适合windows游戏编程的框架――取名为BCF(一)

2014-11-24 08:06:28 · 作者: · 浏览: 0

一、序言

众所周知:

MFC适合桌面应用的开发,而不太适合windows游戏编程,因为它封装了很多我们游戏编程中所不需要的东西,这些东西在一定程度上都影响着GDI的效率,略显冗余了。但是MFC有丰富的类库,这在写代码时又能提供很大的方便……

再来看看Win32 SDK,接近底层,效率肯定好,但是却没有MFC那样的类库,写代码着实不太方便……

这样一想,我就有个问题了:在接下来的游戏效果模拟中,是继续使用MFC,还是专用Win32SDK呢?或者还有什么更好的方法?……

这么一想,嘿,一个idea就诞生了:用C++来自行架构一个适合windows游戏编程的框架,使它既能使用MFC类库,效率又更好

这个框架如何架构呢?请继续阅读下面的内容吧^_^

二、架构的一个简易框架,MFC类库、效率都能兼顾

我的架构思路:

1>将窗口创建过程(设计窗口类结构体实例、注册窗口类、创建窗口、显示窗口、消息循环)以及消息响应函数都封装在一个名为CCWindow的C++类中

2>在Main.cpp源文件中就实现WinMain以及窗口过程

由于我的开源框架的源代码中有详尽的注释,F话就不多说了,直接贴上源代码:

StdAfx.h头文件:这是使用MFC类库所必须添加的头文件

/***
*
*	StdAfx.h
*	包含一些用到的类库所在的头文件
*
***/

#pragma once

#define _AFXDLL//动态添加MFC类库
#include 
    
     //定义最高版本windows

#include 
     
       // MFC封装的核心组件和标准组件 #include 
      
        //CImage类包含的头文件 #include 
       
         //播放媒体(音乐)所需包含的头文件 #pragma comment(lib, winmm.lib)//添加媒体库 #pragma comment(linker,/manifestdependency: ype='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*')
       
      
     
    

CWindow.h头文件(CCWindow类的定义)

#pragma once
#includeStdAfx.h
#include
    
     

class CCWindow
{
//==================成员====================
private:
	WNDCLASS	m_wndclass; //窗口类结构体实例
public:
	HWND		m_hwnd;		//窗口句柄
	CImage		m_img;		//背景图片
	CRect		m_rect;		//窗口户区大小

//=============窗口创建相关的成员函数=============
public:
	//设计窗口类
	bool InitWndClass(
					HINSTANCE hInstance,	//实例句柄
					WNDPROC	  wpWndProc,	//窗口过程
					LPCTSTR	  lpWndName,	//窗口名称
					LPCTSTR   lpIconPath);	//图标路径

	//设计窗口类
	bool InitWndClass(WNDCLASS);
	
	//注册窗口类
	ATOM RegisterWndClass();

	//创建窗口(默认居中)
	void Create(
			LPCTSTR lpClassName,	//窗口类名称
			LPCTSTR lpWndName,	//窗口标题名称
			DWORD	dwStyle,		//窗口风格
			int		nWidth,			//窗口宽度
			int     nHeight);		//窗口高度

	//显示窗口
	void Show(int);

	//一般的消息循环
	int RunMsgLoop();

	//更高效的消息循环
	int RunMsgLoop(void (*Display)(), int);

//================消息响应函数================
public:
	//注:在这里添加需要响应的消息处理函数的声明

public:
	//构造函数
	CCWindow(void);
	//析构函数
	~CCWindow(void);
};
    

CWindow.cpp(CCWindow类的成员函数实现)

#include CWindow.h


CCWindow::CCWindow(void)
{
}

CCWindow::~CCWindow(void)
{
}

/*------------------------------
	*功能:设计窗口类
	*@hInstance:	实例句柄
	*@WndProc:		窗口过程
	*@WndName:		窗口名称
	*@IconPath:		图标路径
 -----------------------------*/
bool CCWindow::InitWndClass(HINSTANCE hInstance,//实例句柄
							WNDPROC WndProc,	//窗口过程
							LPCTSTR WndName,	//窗口名称
							LPCTSTR IconPath)	//图标路径
{
	ZeroMemory(&m_wndclass, sizeof(WNDCLASS));

	m_wndclass.style			= CS_HREDRAW | CS_VREDRAW;
	m_wndclass.lpfnWndProc		= WndProc;
	m_wndclass.hInstance		= hInstance;
	m_wndclass.cbClsExtra		= 0;
	m_wndclass.cbWndExtra		= 0;
	m_wndclass.hIcon			= 
		static_cast
    
     (LoadImage(NULL, IconPath, IMAGE_ICON,
						0, 0, LR_DEFAULTSIZE | LR_LOADFROMFILE));
	m_wndclass.hCursor			= ::LoadCursor(NULL, 
     IDC_ARROW);
	m_wndclass.hbrBackground	= 
		static_cast
     
      (GetStockObject(WHITE_BRUSH)); m_wndclass.lpszMenuName = NULL; m_wndclass.lpszClassName = WndName; return true; } /*-------------