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

2014-11-24 08:06:28 · 作者: · 浏览: 2
M_KEYDOWN: //按键消息 wnd.OnKeyDown(wParam); return 0; case WM_PAINT: //窗口Paint消息:绘制窗口客户区 wnd.OnPaint(); return 0; case WM_DESTROY: //窗口销毁消息:释放内存 wnd.OnDestroy(); return 0; } return DefWindowProc(hwnd, msg, wParam, lParam); }

注:此时,我们使用的是一般的消息循环

看着这些代码,你是否觉得和我原先的MFC代码以及风格很相似呢?呵呵:)

ok,来看看运行效果吧:

data-cke-saved-src=https://www.cppentry.com/upload_files/article/49/1_kbb0k__.png

有心的朋友可能已经发现在我封装的CCWindow类中有两个消息循环成员函数:

1>RunMsgLoop() —— 一般的消息循环:GetMessage

2>RunMsgLoop(void (*Display)(), int) —— 更有效的消息循环:PeekMessage

注:如果不熟悉这GetMessage、PeekMessage两个API函数的区别,请查阅MSDN

这个一般的消息循环的实例已经在刚刚这个实例中用到,下面就用第二个:更有效的消息循环

这个更有效的消息循环有两个好处:(1)效率好 (2)我们可以省略计时器的设定

1、所谓效率好,就是程序能利用其空闲的时候——没有消息处理的情况下,来执行一些操作(例如:贴图==)

2、由于利用的是程序没有消息路由的空闲时间来处理一些操作,即只要没有消息,我们就能执行自己想要的代码,那么我们便可以通过Sleep这个函数来模拟计时器的效果——让这些操作的执行能有一个有序的时间间隔

那么这个有效的消息循环,如何使用呢?

你需要自行写一个函数void Display(),然后让这个消息循环执行这个现实函数就ok了

还是来看看代码吧:(我是实现的功能,很simple:不断绘制一些随机位置、大小、颜色的矩形)

/*--------------------------------------
		消息循环(更好的消息循环)
			PeekMessage()
		@Display:执行函数
		@interval:函数执行的时间间隔
--------------------------------------*/
int CCWindow::RunMsgLoop(void (*Display)(), int interval)
{
	MSG	msg;
	ZeroMemory(&msg, sizeof(MSG));

	//获取运行到此处时的时间
	int last = GetTickCount();

	//如果不是退出消息
	while(msg.message != WM_QUIT)
	{
		//如果有消息
		if(PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
		{
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
		//否则, 空闲的时候执行响应函数(大多数是绘制函数)
		else
		{
			//如果窗口客户区大小不为0就是显示(有可能窗口是在最小化)
			if(m_rect.Width() && 
			   m_rect.Height())
			{
				Display();//执行函数
				Sleep(interval);//当前线程睡眠一会儿
			}
		}
	}

	return msg.wParam;
}

在WinMain调用这个更有效的消息循环:

	/*进入消息循环
		1. 使用更好的消息循环wnd.RunMsgLoop(Display, 100)
		2. 使用一般的消息循环wnd.RunMsgLoop()
	*/
	return wnd.RunMsgLoop();

实现效果:

data-cke-saved-src=https://www.cppentry.com/upload_files/article/49/1_z5bo1__.png

可见一些随机的矩形在不断地绘制,还是很漂亮吧:》

四、你想要的开源源代码

(不知是不是csdn资源管理服务器抽风了,上传的资源半个小时过了都没显示出来。但我现在实在是太困,所以很抱歉,只能等待明天了……)

希望大家帮我多测试一下BCF哈,有什么bug请及时告诉我,我将尽快纠正

另外,还欢迎大家和我交流,留下你想说的话(不喜勿碰^_^),因为你们的支持是我继续努力开源的动力:)

……

……

一不留神,时间飞逝,现在都凌晨1点多了——但愿我夜以继日的无私奉献,能帮助到和我有共同兴趣爱好的有志青年,让我们一起踏上美好的游戏编程之旅,扬帆起航,实现我们共同的梦想……

电脑屏幕前的你,晚安,BlueCoder也晚安,BCF,加油,哈哈……

data-cke-saved-src=https://www.cppentry.com/upload_files/article/49/1_s0it0__.jpg