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); }
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();
}
这里主游戏处理逻辑必须有返回,即生成一个动画帧或运行了一段游戏逻辑后必须返回。
3D游戏引擎一 win32编程的更多相关文章
- 转载:[转]如何学好3D游戏引擎编程
[转]如何学好3D游戏引擎编程 Albert 本帖被 gamengines 从 游戏引擎(Game Engine) 此文为转载,但是值得一看. 此篇文章献给那些为了游戏编程不怕困难的热血青年,它的 ...
- 棒!使用.NET Core构建3D游戏引擎
原文地址:https://mellinoe.wordpress.com/2017/01/18/net-core-game-engine/ 作者:ERIC MELLINO 翻译:杨晓东(Savorboa ...
- 【直播预告】7月18日3D游戏引擎免费公开课答疑,參与送C币!
喜讯喜讯! 为了酬谢广大学员.CSDN学院特推出iOS和3D游戏引擎开发免费技术答疑公开课,让您度过一个充实的暑假~ 參与本次公开课,即有机会获得50C币! 答疑公开课时间:7月18日 晚7:30-9 ...
- 【直播预告】7月25日3D游戏引擎免费公开课答疑第三期,有奖问答!
喜讯喜讯! 为了酬谢广大学员.CSDN学院特推出iOS和3D游戏引擎开发免费技术答疑公开课.让您度过一个充实的暑假~ 參与本次公开课,进行有奖问答.即有机会获奖. 答疑公开课时间:7月25日 晚7:3 ...
- 排名前10的H5、Js 3D游戏引擎和框架
由于很多人都在用JavaScript.HTML5和WebGL技术创建基于浏览器的3D游戏,所有JavaScript 3D游戏引擎是一个人们主题.基于浏览器的游戏最棒的地方是平台独立,它们能在iOS.A ...
- Java 3D游戏引擎——JME(java Monkey Engine)
转自:http://bbs.gameres.com/forum.php?mod=viewthread&tid=180732 JME(java Monkey Engine),一个非常棒的Java ...
- 3D游戏引擎设计 实时计算机图形学的应用方法 第2版 pdf 带索引书签目录
3D游戏引擎设计 实时计算机图形学的应用方法 第2版 目录 第1章 概述1.1 图形硬件和游戏发展史1.2 本书版本与软件发展史1.3 章节导读 第2章 图形系统2.1 基础知识2.1.1 坐标系 ...
- 基于Java的开源3D游戏引擎jMonkeyEngine
jMonkeyEngine简介 jMonkeyEngine是一款纯Java语言编写的游戏引擎,继承了Java应用跨平台的特性,而且是开放源代码的,遵循BSD开源协议,BSD开源协议用一句简单的话概括就 ...
- 3D游戏引擎中常见的三维场景管理方法
对于一个有很多物体的3D场景来说,渲染这个场景最简单的方式就是用一个List将这些物体进行存储,并送入GPU进行渲染.当然,这种做法在效率上来说是相当低下的,因为真正需要渲染的物体应该是视椎体内的物体 ...
随机推荐
- jquery插件dataTables自增序号。
dataTables官网提供了一种方式,使用后没有达到预期效果(js报错),没有深究原因.如果需要,可以按照下面的方式来. $('#dataList').dataTable({ "langu ...
- 阿里云 centos vim 显示中文 乱码
开始以为是vim 设置编码的问题 :网上搜 改 .vimrc 无效!!! 后转战 是不是系统里面没有中文字体 1.先从你本机 C:\Windows\Fonts 拷贝或者网络上下载你想要安装的 ...
- nginx——rewrite模块
1.什么是Nginx的Rewrite规则? Rewrite主要的功能就是实现URL的重写,Nginx的Rewrite规则采用PCRE(Perl Compatible Regular Expressio ...
- java 多线程sleep和wait的区别
对于sleep()方法,我们首先要知道该方法是属于Thread类中的.而wait()方法,则是属于Object类中的. sleep()方法导致了程序暂停执行指定的时间,让出cpu该其他线程,但是他的监 ...
- UVa1605 - Building for UN(构造法)
UVA - 1605 Time Limit: 3000MS Memory Limit: Unknown 64bit IO Format: %lld & %llu Description ...
- [Usaco2006 Dec]Milk Patterns
[Usaco2006 Dec]Milk Patterns Description 农夫John发现他的奶牛产奶的质量一直在变动.经过细致的调查,他发现:虽然他不能预见明天 产奶的质量,但连续的若干天的 ...
- js/bat批处理调用谷歌浏览器chrome批量打开网页测试web性能
批处理批量打开网页 其实用java就可以搞定,但是这么一个轻巧的测试,js或者bat批处理去一次性打开几百个网页测试一下页面没必要上java 两者的区别,js的话,只能打开多个浏览器实例,不方便查看效 ...
- 转:USB主机控制器(Host Controller)--深入理解
1. 主机控制器(Host Controller) • UHCI: Universal Host Controller Interface (通用主机控制接口, USB1.0/1.1) • ...
- Iphone6 LightBlue测试BT4GMD-Q25P透传模块
安装LightBlue后,连接透传模块之后,显示如下: 注意:0xFF01是写通道,0xFF02是读通道 BLE透传模块与PL2303相连,在PC端用串口调试助手显示数据. 一.lightblue向B ...
- bootchart--检测linux启动性能的软件
bootchart--检测linux启动性能的软件 摘自http://www-128.ibm.com/developerworks/library/l-boot-faster/index.html?c ...