您好,欢迎访问三七文档
游戏引擎•游戏分游戏引擎和游戏资源两部分。–游戏资源包括图像、声音、动画等部分–引擎则是按游戏设计的要求顺序调用这些资源。•游戏引擎是一个为运行某一类游戏的机器所设计的能够被机器识别的代码集合,它从各方面控制着游戏的运行。•游戏引擎是用于控制所有游戏功能的主程序,从计算碰撞、物理系统和物体的相对位置到接受玩家的输入等。游戏引擎框架•一个游戏基本上是一个连续的循环,完成逻辑动作,并在屏幕上显示图像,通常是每秒30帧,和影片的播放类似。•游戏引擎的框架结构游戏引擎游戏初始化游戏循环游戏结束游戏引擎初始化游戏参数初始化游戏交互游戏逻辑资源释放中止程序GameEngine游戏引擎类•GameEngine.h•在GameEngin类的定义中,首先声明了类的成员变量,用于存储游戏引擎的一些重要信息,主要由两类变量组成:初始化时的参数变量、循环时所需要的变量。–静态引擎指针–程序实例句柄和窗口句柄–窗口属性相关成员–程序循环相关成员•有些特殊的函数方法不能在游戏引擎类中实现,而必须是外部函数,如WinMain、WindowProc•还有一些函数是游戏特有的,必须在设计游戏程序时,由程序开发者自行设计,如游戏参数初始化、游戏逻辑实现、游戏画面绘制等。游戏引擎的初始化•游戏引擎的构造•游戏窗口创建WinMain函数•定义WinMain函数1.先调用游戏初始化函数创建游戏引擎,并对游戏框架进行初始化。2.进入消息循环,在消息循环中使用PeekMessage来接收消息。目的是即使没有消息循环,游戏循环也会继续执行,而不是等待。•timeGetTime()函数–返回自Windows系统开机以来所经过的时间,时间单位为1ms,为DWORD类型,最大为232,约为49.7天。–该函数在mmsystem.h中声明,在库winmm.lib中实现,所以需要:#include“mmsystem.h”–#progmacomment(lib,”winmm.lib”)消息处理•与一般应用程序类似,基本都是在标准windows消息处理函数中进行处理。下面按消息功能的不同介绍:•游戏参数初始化•游戏引擎构造完成并创建窗口(产生消息WM_CREATE)后,需要进行游戏参数的初始化,包含对游戏变量的初始化、进行资源分配、从磁盘装载游戏数据(由GameStart函数完成)。游戏画面渲染•渲染方式分两种:–在游戏循环中绘制–响应WM_PAINT时绘制•在游戏循环中绘制:可用于绘制游戏中不需要随时保持,而是随循环执行而改变的动态内容。优点:响应速度快,缺点:画面不能持久。•响应WM_PAINT时绘制是窗口程序常用的方法,这种方式有系统维护。在程序中需要进行绘图时,可调用InvalidateRect方法进行重绘。–BOOLInvalidateRect(HWNDhWnd,constRECT*lpRect,BOOLbErase)–hWnd是要重绘的窗口句柄;lpRect是要重绘的矩形指针,若为NULL,则重绘整个窗口;bErase表示在重绘前是否发送WM_ERASEBKGND消息,以擦除相应区域原来的内容,如果为TRUE在擦除。–注意:只是增加重绘区域,在下次WM_PAINT的时候才执行,若要立即执行,可使用UpdateWindow()。–UpdateWindow()用于向窗口发送WM_PAINT消息,在发送前会判断有无可绘制的客户区域,若没有,则不发送消息。BOOLUpdateWindow(HWNDhWnd)游戏交互•鼠标的操作与一般windows应用程序类似,基本是单击、双击、右击和拖拽等操作,在标准消息中进行处理。•键盘消息的处理不同,游戏程序对键盘信息处理的实时性要求很高,不能依赖标准消息。游戏暂停•游戏运行中,有时需要暂时离开游戏窗口。•在windows程序设计中,离开一个窗口而打开另一个窗口时,将使原程序窗口产生一个失去焦点消息WM_KILLFOCUS,再次回到窗口时会产生一个得到焦点消息WM_SETFOCUS。游戏结束与资源释放•在游戏者发出退出游戏程序的指令后,会产生WM_CLOSE、WM_DESTROY、WM_QUIT.•发生WM_CLOSE消息时,程序窗口开未关闭,知识通知程序要关闭窗口了,有时,需要中止窗口的关闭,继续执行程序。•WM_DESTROY消息发生时,程序窗口已经销毁,程序的结束已不可逆转。此时,需要在程序完全退出前进行资源的释放。游戏屏幕设置1、DEVMODE结构•DEVMODE数据结构中包含了有关设备初始化和打印机环境的信息•dmSize指定了DEVMODE结构的大小,以字节为单位,不包括dmDriverData(与设备有关)成员。如果应用程序仅操作数据中与驱动程序无关的部分,它就可以使用这个成员以确定该结构的长度。•dmFields指定了DEVMODE结构的其余成员中哪些已被初始化。•dmDisplayFrequency指定了显示设备的特定模式所使用的以赫兹为单位的频率(每秒的周期数)。•dmBitsPerPel指定了显示设备的颜色分辨率,以像素的位数为单位。例如,16色使用4位,256色使用8位,而65536色使用16位。•dmPelsWidth指定了可见设备表面的以像素为单位的宽度。dmPelsHeight指定了可见设备表面的以像素为单位的高度。游戏屏幕设置(续)•GetSystemMetrics()用于得到被定义的系统数据或者系统配置信息•intWINAPIGetSystemMetrics(__inintnIndex);•下面是GetSystemMetrics函数参数nIndex的定义:–SM_CXBORDER,SM_CYBORDER返回以像素值为单位的Windows窗口边框的宽度和高度–SM_CYFULLSCREEN全屏幕窗口的窗口区域的宽度和高度–SM_CXSCREEN,SM_CYSCREEN以像素为单位计算的屏幕尺寸。•#include“winuser.h”#pragmacomment(lib,”user32.lib”)游戏屏幕设置(续)•intGetDeviceCaps(HDChDC,intnIndex)–与GetSystemMetrics功能相近,用于检索指定设备的信息而不是系统信息。–HORZSIZE物理显示宽度(以毫米为单位)–VERTSIZE物理显示高度(以毫米为单位)–HORZRES显示宽度(用像素表示)。–VERTRES显示高度(用光栅线表示)。–LOGPIXELSX沿显示宽度方向,每一逻辑单位的像素数–LOGPIXELSY沿显示高度方向,每一逻辑单位的像素数–BITSPIXEL每一像素的颜色字节数•#include“wingdi.h”#pragmacomment(lib,”gdi32.lib”)游戏屏幕设置(续)•EnumDisplaySettings函数得到显示设备的一个图形模式设备,通过对该函数一系列的调用可以得到显示设备所有的图形模式信息。•BOOLEnumDisplaySettings(LPCTSTRlpszDeviceName,DWORDiModeNum,LPDEVMODElpDevMode);•lpszDeviceName:指向一个以null的结尾的字符串,该字符串指定了显示设备。此函数将获得该显示设备的图形模式信息。该参数可以为NULL。NULL值表明调用线程正运行在计算机的当前显示设备上。iModeNum:表明要检索的信息类型,该值可以是一个图形模式索引,也可以是下列一值:–ENUM_CURRENT_SETTINGS:检索显示设备的当前设置。–ENUM_REGISTRY_SETTINGS:检索当前存储在注册表中的显示设备的设置。–图形模式索引值从零开始,要得到一个显示设备的所有图形模式信息,可以一系列地调用EnumDisplaySettings函数,并且iModeNum显为一个非零值时,则函数返回的信息是最近一次使用iModeNum置为零调用该函数时存储的信息。•lpDevMode:DEVMODE结构的指针,该结构存储指定图形模式的信息,在调用EnumDisplaySettings之前,设置dmSize为sizeof(DEVMODE),并且以字节为单位,设置dmDriveExtra元素为接收专用驱动数据可用的附加空间。游戏屏幕设置(续)•ChangeDisplaySettings函数把缺省显示设备的设置改变为由lpDevMode设定的图形模式•LONGChangeDisplaySettings(LPDEVMODElpDevMode,DWORDdwflags);–lpDevMode:指向一个描述转变图表的DEVMODE的指针。DEVMODE的dmSize参数必须依DEVMODE结构的大小、字节进行初始化,dmDriveExtra参数必须初始化来显示DEVMODE随后的驱动数据的字节数,另外还可以选用以下参数:–dmBitsPerPel每个像素的位数,dmPelsWidth像素宽度,dmPelsHeight像度高度,dmDisplayFlage模式标志。–dmDisplayFrequency模式频率。–dmposition在多显示配置中设备的位置。–除了设置好DEVMOD结构中诸多元素的值之外,还必须要正确地设置dmFields元素中的标志。这些标志表明了DEVMODE结构中哪个元素在改变显示设置时使用了。如果在dmFields中没有设置正确的位,那么显示设置将不会发生变化。小结•在游戏设计中,通过调用游戏引擎框架,不用再考虑游戏设计中的窗口实现、信息管理等事务,而只需要专注于具体游戏的初始化、逻辑、交互、渲染等内容,极大方便了游戏程序的设计。
本文标题:1-2游戏引擎框架
链接地址:https://www.777doc.com/doc-5553329 .html