3D游戏引擎一 win32编程

Windows程序一般都等待用户进行一些操作,然后响应并采取行动。

一般来说,对win32的程序的操作都会转换为系统事件队列中的消息,如按键消息WM_KEYDOWN,WM_MOUSECLICK等传递键盘以及鼠标的操作消息。系统消息传递给程序的本地事件队列,然后在传递给WinProc()函数进行主窗口的消息处理,处理完消息后,程序转到WinMain()主函数中,而此时一般主函数依然在进行消息循环,于是又等待新的消息并执行。

win32的程序都是有winmain开始,最简单的一个win32程序,从空项目开始:

#define WIN32_LEAN_AND_MEAN
#include <Windows.h>

int WINAPI WinMain(HINSTANCE hinstance,
				   HINSTANCE hprevinstance,
				   LPSTR lpcmdline,
				   int ncmdshow)
{
	MessageBoxA(NULL,"TRY A TRY","MY TRY",
		MB_OK | MB_ICONEXCLAMATION );
	return (0);

}

winMain 函数

MessageBox()函数

SDK中一个简单的提示声音的函数 MessageBeep(UINT utype),参数值utype常用的有 MB_OK 系统默认声音,当然如果你将计算机系统中的系统声音设置为无声,就听不到声音的。

从一个空项目开始创建一个完整的Windows程序的步骤:

创建一个Windows类。

创建一个事件处理程序WinProc

向Windows注册创建的Windows类:定义了Windows类后,还要通过注册,让Windows操作系统知道这个类,注册通过函数 RegisterClassEx()来完成,接收一个指向Windows类的指针作为参数。调用政策函数之前,Windows系统还不知道有这个类,因此不能使用新的类名来引用它,而是用但钱储存的类的实际数据结构来进行注册。

使用Windows类创建一个窗口

创建一个主事件循环,用于接收Windows消息并将其发送给事件处理程序。

最后,一个简单的空白win32项目代码如下:

//不加载MFC
#define WIN32_LEAN_AND_MEAN
#include <Windows.h>
#include <windowsx.h>

//Windows类类名常量
const char* MYCLASSNAME = "WINCLASS";

//消息处理函数
LRESULT CALLBACK WndProc(HWND hwnd,
						 UINT msg,
						 WPARAM wParam,
						 LPARAM lParam)
{
	PAINTSTRUCT ps;
	HDC hdc;
	switch(msg){
	case WM_CREATE:
		{
			//初始化代码
		}break;
	case WM_PAINT:
		{
			hdc = BeginPaint(hwnd,&ps);
			//重绘
			EndPaint(hwnd,&ps);
		}break;
	case WM_DESTROY:
		{
			//释放资源,关闭应用程序
			PostQuitMessage(0);
		}break;
	default:
		return (DefWindowProc(hwnd,msg,wParam,lParam));
	}
	return (0);
}

//主函数
int WINAPI WinMain(HINSTANCE hInstance,
				   HINSTANCE hprevInstance,
				   LPSTR lpcmdline,
				   int ncmdshow)
{
	WNDCLASSEX wcex;//创建的窗口类
	HWND hwnd;//窗口句柄
	MSG msg;//消息

	//设置窗口类
	wcex.cbSize = sizeof(WNDCLASSEX);
	wcex.style			= CS_HREDRAW | CS_VREDRAW;
	wcex.lpfnWndProc	= WndProc;
	wcex.cbClsExtra		= 0;
	wcex.cbWndExtra		= 0;
	wcex.hInstance		= hInstance;
	wcex.hIcon			= LoadIcon(NULL,IDI_APPLICATION);
	wcex.hCursor		= LoadCursor(NULL, IDC_ARROW);
	wcex.hbrBackground	= (HBRUSH)(COLOR_WINDOW+1);
	wcex.lpszMenuName	= NULL;
	wcex.lpszClassName	= MYCLASSNAME;
	wcex.hIconSm		= LoadIcon(NULL,IDI_APPLICATION);

	//注册窗口类
	if(!RegisterClassEx(&wcex)){
		return (0);
	}

	//创建窗口
	if( !( hwnd = CreateWindowEx(NULL,MYCLASSNAME, "MY", WS_OVERLAPPEDWINDOW | WS_VISIBLE,
      0, 0, 400, 500, NULL, NULL, hInstance, NULL) ) )
	{
		return(0);
	}

	//进入主循环
	while( GetMessage(&msg,NULL,0,0) ){
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}

	//返回到操作系统
	return msg.wParam;

}

但这为一般程序的基本结构,对于游戏,要构建一个实时事件循环,使其既能进行游戏逻辑处理,例如一个Game_main()函数,又能实时检测消息队列中的消息并处理。

这里就要构建一个实时事件循环,使用函数PeekMessage ()  来检测消息队列中是否有消息。如果有,对其进行处理,否则继续处理其他游戏逻辑并重复循环。PeekMessage 函数原型如下:

BOOL PeekMessage(
LPMSG IpMsg, //消息 的指针
HWND hWnd,//窗口句柄
UINT wMSGfilterMin,//第一条消息
UINT wMsgFilterMax,//最后一条消息
UINT wRemoveMsg//删除标记
);

一般第一条消息和最后一条消息都设为0,而删除标记有三种:

PM_NOREMOVE

PeekMessage处理后,消息不从队列里除掉。

PM_REMOVE

PeekMessage处理后,消息从队列里除掉。

PM_NOYIELD

此标志使系统不释放等待调用程序空闲的线程。可将PM_NOYIELD随意组合到PM_NOREMOVE或PM_REMOVE。

PM_NOREMOVE或PM_REMOVE是主要的标记,若使用不删除消息,就要配合GetMessage()来获得消息进行处理。若使用PM_REMOVE,则直接使用PeekMessage获得消息,对应的实时事件循环代码如下:

	while(true){
		//使用peekMessage获得消息,若没有直接进游戏逻辑
		if(PeekMessage(&msg,hwnd,0,0,PM_REMOVE)){
			if(msg.message == WM_QUIT)//如果消息为WM_QUIT,则结束主循环
				break;
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
		//主游戏处理逻辑
		Game_Main();
	}

这里主游戏处理逻辑必须有返回,即生成一个动画帧或执行了一段游戏逻辑后必须返回。

时间: 2024-10-08 13:24:28

3D游戏引擎一 win32编程的相关文章

吴涛作品介绍-易语言和VOLCANO 3D游戏引擎

易语言 易语言是一个自主开发,适合国情,不同层次不同专业的人员易学易用的汉语编程语言.易语言降低了广大电脑用户编程的门槛,可以通过使用本语言极其快速地进入Windows程序编写的大门. VOLCANO 3D 游戏引擎 VOLCANO是一款MMORPG(大型多人在线角色扮演)3D网络游戏的开发引擎,用作支持用户快速并简单地开发具有真实游戏环境和丰富游戏玩点的游戏. 易语言 易语言是一个自主开发,适合国情,不同层次不同专业的人员易学易用的汉语编程语言.易语言降低了广大电脑用户编程的门槛,尤其是根本不

Top 10:HTML5、JavaScript 3D游戏引擎和框架

由于很多人都在用JavaScript.HTML5和WebGL技术创建基于浏览器的3D游戏,所有JavaScript 3D游戏引擎是一个人们主题.基于浏览器的游戏最棒的地方是平台独立,它们能在iOS.Android.Windows或其他任何平台上运行. 有很多的JavaScript能够用于创建基于浏览器.使用HTML5和WebGL的3D游戏.然后,选择一个合适的游戏引擎是一个不小的挑战,它有时能帮你完成项目或突破项目瓶颈. 为了让你的选择变的容易,我们已经通过分析大多数JavaScript 3D游

HTML5、JavaScript 3D游戏引擎和框架

由于很多人都在用JavaScript.HTML5和WebGL技术创建基于浏览器的3D游戏,所有JavaScript 3D游戏引擎是一个人们主题.基于浏览器的游戏最棒的地方是平台独立,它们能在iOS.Android.Windows或其他任何平台上运行. 有很多的JavaScript能够用于创建基于浏览器.使用HTML5和WebGL的3D游戏.然后,选择一个合适的游戏引擎是一个不小的挑战,它有时能帮你完成项目或突破项目瓶颈. 为了让你的选择变的容易,我们已经通过分析大多数JavaScript 3D游

Java 3D游戏引擎——JME(java Monkey Engine)

转自:http://bbs.gameres.com/forum.php?mod=viewthread&tid=180732 JME(java Monkey Engine),一个非常棒的Java 3D游戏引擎 一直以来,由于性能等原因,Java并不是3D图形应用的主流平台,但随着各种新技术的出现,这种情况有了很大改变.从开始的JIT.Static compilers,到现代的HotSpot技术,使Java程序的运行效率越来越高,目前已经接近于C++程序.此外,通过JNI技术,Java程序可以调用任

3D游戏引擎系列九

笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,国家专利发明人;已出版书籍:<手把手教你架构3D游戏引擎>电子工业出版社和<Unity3D实战核心技术详解>电子工业出版社等. CSDN课程视频网址:http://edu.csdn.net/lecturer/144 Phong 着色法是结合了多边形物体表面反射光的亮度,并以特定位置的表面法线作为像素参考值,以插值方式来估计其周围位置像素的色值.与Gouraud着色法比较,Phong着色法的效

3D游戏引擎StingRay:支持实时多平台研发

欢迎来到unity学习.unity培训.unity企业培训教育专区,这里有很多U3D资源.U3D培训视频.U3D教程.U3D常见问题.U3D项目源码,[狗刨学习网]unity极致学院,致力于打造业内unity3d培训.学习第一品牌. [狗刨学习网]报道/之前<Autodesk将推跨平台3D游戏引擎StingRay>一文发布之后,业内很多童鞋表示关注.就在北京时间3月5日凌晨的发布活动上,Autodesk透露了3D引擎StingRay的进一步消息,据该公司透露,这款引擎采用了Bitsquid引擎

手把手教你架构3D游戏引擎

最近利用空闲的时间写了一本针对程序员开发3D游戏引擎的书籍,<手把手教你架构3D游戏引擎> 电子工业出版社,里面涉及到向量变换,矩阵变换,固定流水线的实现.给读者揭秘引擎的底层封装实现,对于学习者非常容易上手,可以做到举一反三,再学习其它引擎就会得心应手.目前在天猫,京东等各大网站有售,网址: https://detail.tmall.com/item.htm?spm=a220m.1000858.1000725.2.FFMx82&id=542498976531&areaId=3

3D游戏引擎〇 开始

游戏循环: 初始化:执行一些基本的初始化操作,如内存分配,资源获取,从磁盘加载数据等. 进入游戏循环:进入主游戏循环,用户不断地执行动作,知道退出主循环为止. 读取玩家输入:处理玩家输入,或将其存储到缓存区中,供AI和游戏逻辑使用. 执行AI和游戏逻辑:这部分为游戏代码的主体部分,将执行AI,物理系统,和通用系统逻辑,并根据结果在屏幕上绘制下一帧. 渲染下一帧:首先游戏绘制的下一帧图像在离频offscreen缓存中绘制,然后进行一系列的渲染.在基于3D软件的引擎中,由一个非常复杂的3D图形流水线

Babylonjs 初级教程---微软的基于webgl的H5 3D游戏引擎

Babylon.js 页面图像库 游戏创建系统! Hi!欢迎阅读 Babylon.js 初级教程, 这是后面学习最棒的基于Javascript的网页图形库框架所需必备知识的一个基础介绍. 你想知道什么是框架么?  你可以把框架认为成 建筑里的脚手架, 它支撑你围绕它创建新东西而不必为底层细节操心. Babylon.js构造里一个复杂的系统, 让网页图形库更容易使用. 我们希望以一种非常快速的方式教给你大量的信息.  通常这里的任务都有多于一种方式达成.  我希望你自己去发现其它的方式.  根据对