用DirectX进行游戏程序设计.doc_第1页
用DirectX进行游戏程序设计.doc_第2页
用DirectX进行游戏程序设计.doc_第3页
用DirectX进行游戏程序设计.doc_第4页
用DirectX进行游戏程序设计.doc_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

我们的精彩,全因您的参与 中国游戏开发者.CN用DirectX进行游戏程序设计1.第1章:DirectX简介1.1说明虽然这篇文章中的例子用Visal C/C+ MFC开发的,但是我们要注意到, MFC掩藏了许多更好的内容。1.2什么是DirectX?DirectX是MicroSoft提出的解决游戏开发者如何在Win95之下开发最佳游戏的问题解决方案。游戏通常需要计算机的强大绘图能力,这时候Windows95成了个障碍。DirectX是在游戏程序设计方面提供大量功能的API(应用程序编程接口),当然在其它方面也很有用。DirectX主要由五个部分组成,如下所示:1.2.1.DirectX组件l DirectDraw 2维图形处理能力,表面,双缓冲,等等l Direct3D 是相对扩展功能的3D图形程序设计API。l DirectSound 声音;3D声音l DirectPlay简化网络游戏的开发l DirectInput处理各种外围设备输入1.3.DirectX性能和硬件加速尽管Direct3D的软件性能并不差,但是DirectX是为硬件加速设计的。这意味着图形卡商能制造出以硬件支持DirectDraw和Direct3D的图形卡,并提供有关图形卡的驱动程序。这将使图形卡执行绘图功能而CPU被解放了出来做其它的事情。典型的Direct3D加速器需要至少2或4兆或者更多的显存来储存位图(计算机图形由象素组成)、纹理、精灵、覆盖图(overlay)和其它东西。DirectDraw和Direct3D在硬件上建立了一个相对容易访问的层叫作“硬件抽象层”(HAL)。假如有一个图形卡不提供以上功能。一个相应的软件执行程序将提供“硬件仿真层”(HEL)。2.第2章:调色板,编写游戏的概念,双缓冲等2.1显示模式屏幕模式是指用多少位储存屏幕上每像素颜色。自然地,被用于每一个象素的位越多,同时显示的颜色就越多;但是也就有更多数据移入显存用来更新屏幕。l 1,2,4和8位“索引”方式(8位这种称呼更流行,比256色模式更为人所知)l 16-位(64K色)高彩色模式l 24-位(16.7M色)真彩色模式l 32-位RGBA方式。前3字节与24-位方式相同;A字节用于阿尔法-通道,提供了象素不透明性的信息。这些模式在下列分辨率是典型的,有效的:l 320x240l 640x400l 640x480l 800x600l 1024x768l 1280x1024l 1600x1200320x200和640x480作为游戏中两个常用的模式,显示器通常的高/宽比是4/3。宽度上像素的数目是高度上像素数目的4/3倍。像素的宽/高比为1,这就是说,一个方向上的100个像素的物理长度和垂直方向上100个象素相同。320x200没有这种性质。320x200像素实际上在宽度上被拉长了。2.2颜色理论每一种可视的颜色可由不同大小的三种基本颜色红(R)、绿(G)、蓝(B)组成。这被称为RGB系统。红,绿和蓝色的值是在0到255色正常范围内。所以纯粹明亮的红色是RGB(255,0,0),紫色是RGB(255,0,255),灰色是RGB(150,150,150),黑色是(255,255,255),等等。2.2.1.高彩色和真彩色模式在高彩色和真彩色模式下,屏幕上像素把它们相应的RGB值存入显示存储器。例如,如果屏幕左上顶角的像素是绿色,那么(在真彩色模式)显存的前三个字节是0、255和0。在高彩模式中,RGB值指定分别使用5位、6位和5位用于红、绿、蓝。所以上述例子中显存的前两个字节是二进制的00000111和11100000。2.2.2.基于调色板(或“索引”)的模式在这类模式中最通常的是8位,程序员有28=256种不同的颜色同时显示在屏幕上。256色的RGB值都储存在RGB的记录表格内,每个值3字节长。按这种方式,每一个像素可以在显存内占用一个字节,这个字节的值是一个指定了表格(调色板)内的一个索引,它被用于查找RGB值以在屏幕上产生像素。围绕调色板创建应用程序是一件痛苦的事,但使用调色板有几个优势,如下:l 屏幕的内容占用更少显存l 程序在显存中绘制,在屏幕上显示能更快,因为传送更少的字节。l 其它的令人感兴趣的技巧,例如,调色板可以是动画的,亦即在查询表的RGB值被改动,但没有改变在显存里的字节。这将改变屏幕上的颜色。2.2.3.ModeXModeX是一种特殊的模式,显存中的内容(比如说,显示在屏幕上的)存储为某些复杂的平滑格式。DirectDraw知道怎样写ModeX表面,但 Windows GDI不能。所以试图混合DirectDraw ModeX和 GDI时,要小心设置。DirectDraw设置为全屏模式时,可以选择是否用DirectDraw创建ModeX面。2.3.你写游戏需要知道的一些编写游戏的概念2.3.1.位图和精灵位图在计算机里是以像素值数组储存的图像。基本上,在计算机里位图可以是任何图片。精灵类似于位图,不过它通常指有透明区的位图。精灵在游戏中是一种重要的元件。它们被广泛使用,例如鼠标光标是一种精灵,DOOM中的怪物也是一种精灵。它们是有透明区的平面图形并总是面朝你。2.3.2.双缓冲和页面翻转双缓冲是一种极好的技术,它对在你的程序中完成快速平滑的动画非常重要。这并不是你完成程序所须唯一的东西,但它却是较重要的一个。基本上,它是这样工作的:你的游戏把用户想在屏幕上看到的东西画到离屏表面(亦即后台表面)上。这么做的结果是用户不会看到在绘制屏幕时出现的各种讨厌的人为现象(象闪烁)。现在,图像已经准备好给用户看(亦即渲染结束)。这时有两个基本的方法把图像从离屏表面上取出放在屏幕上。一是把内容从离屏表面复制显存上。二是使用硬件页面翻转,这意味着你要命令图像硬件从显存中不同的点开始刷新屏幕典型的是,你让它指向你的离屏表面。现在显存中的一个区域成为你的离屏表面,当你画完后,页面翻转完成了。这种技术的问题是可能产生图形撕裂。由于显示器屏幕图像的刷新相当频繁,基本上是每秒70次(70Hz)。假设按照通常的方法从上往下画,当屏幕上画到了一半时,你又决定命令画别的东西(用上述两种方法中任一种),这时候就会发生图形撕裂:屏幕下半部分以新的图像绘制,这就是图形撕裂,或图形剪切。有一种解决方案,就是以屏幕刷新率来定时控制页面翻转。2.4.裁剪和DirectDraw裁剪器裁剪是用来防止绘图程序画出屏幕或其它矩形边框区(如窗口的边缘)的一项技术。若没有执行裁剪,通常会画得一团糟。在DirectDraw里,举例子说,在用窗口模式时,正常的DirectDraw应用绘图只能画自己窗口,但Windows给了DirectDraw画屏幕任意处的权力。为了避免画到窗口外,DirectX选用了一个附属于DirectDraw表面的对象-“clipper(裁剪器)”来防止这一点。2.5. DirectDraw表面DirectDraw使用“表面”访问显存或内存的任何区域,(通常)这用于存储位图、纹理图、精灵、当前屏幕或窗口的内容。DirectDraw也提供用于覆盖的专用精灵类。覆盖是通常指一个包含有透明区位图的表面覆盖到一个场景上。例如,赛车游戏可能使用一个图像覆盖驾驶员控制舱和窗框。由于DirectDraw必须与GDI共享资源,DirectDraw表面使用的内存/显存在一些情况下可能被丢失。因此应用程序必须定期检查,防止这样的事发生。如果已经发生则还原之。2.6. DirectX 返回值和错误检查DirectX 函数返回 HRESULT作为错误代码。由于DirectX对象基于COM 体系结构,正确的检查DirectX 函数失败的方法是向使用带有HRESULT参数的宏SUCCEEDED()和FAILED()。它不仅仅检查这些(例如,它不仅仅检查DirectDrawHRESULT是否为DD_OK,对COM对象来说,使用多重返回值作为成功值是可能的。2.7. DirectX 调试当你安装 DirectX SDK 你将选择是否向安装发行版的函数库,或者调试版。调试版实际上为Visual C+的TRACE输出窗口写诊断的信息,这是非常有用的。如果你主要玩DirectX游戏,那么安装发行版。如果你主要想做DirectX开发,安装调试版。3.第3章:简单的DirectDraw示例3.0.内容3.1.在Visual C/C+ 下设置DirectX 3.2. DirectDraw示例3.3.设置共用的变量;Globals.h 和Globals.cpp 3.4.初始化 DirectDraw系统3.5.设置屏幕模式3.6.创建表面3.7.创建裁剪3.8.综合3.9.还原丢失的表面3.10.渲染循环3.11.HeartBeat(心跳)函数3.12.翻转表面3.13.追踪DirectDraw错误3.1.在Visual C/C+ 下设置DirectX 首先,必须设置路径,使Visual C/C+能查找DirectX头文件和库文件。1. 打开工具/选项/对话框。2. 从下拉列表中选择library directories,加入 DX SDK库的路径,例如d:dxsdksdklib 3. 从下拉列表中选择include directories,加入DX SDK头文件路径,例如d:dxsdksdkinclude。如果你打算使用在示例里的DX 实用域名,那么要加入 samplesmisc 目录,例如d:dxsdksdksamplesmisc。 注意:如果你的DirectX SDK 版本在Visual C/C+(4.2/5.0/6.0)之后,那么DirectX SDK的头文件路径必须是位於缺省的 VC +的include之前,这样编译程序首先搜索 DirectX SDK 目录。其理由是 VC + 4.2/5.0/6.0 也包含DirectX SDK在内,但是它们并不能同在它们之后发行的DirectX SDK一起工作。为了使用DirectDraw你必须说明DirectDraw程序应包含哪一些库文件,对Direct3D也是这样。要在Build/Settings/Link和在Object/Library modules box加入ddraw.lib(使用DirectDraw),和 d3drm.lib( Direct3D保留模式),等等。3.2.DirectDraw示例开始DirectDraw应用程序的通用例程如下:1. 设立全局变量2. 初始化DirectDraw对象3. 设立协作级和必需的显示模式(在后面解释这一点)4. 创建前、后翻转表面;需要的话,还有裁剪器5. 如果你使用窗口模式,还要选用裁剪器6. 执行翻转。如果是全屏方式,只要直接翻转就可以了。如果在窗口方式,你需要从后台表面向主表面blit每个帧。3.3.设置全局变量:Globals.h 和Globals.cpp我们的的DirectDraw应用程序需要许多全局变量。首先,我们需要用于访问 DirectDraw对象的变量。我们也需要一个叫作bFullScreen布尔变量来确认是否是全屏模式。然后我们需要二个DirectDrawSurface 变量用于形成双缓冲表面翻转结构的主表面和后台表面。在窗口模式下,我们需要裁剪器对象选用到主表面,以防止DirectDraw画到窗口的外面。如果用256颜色模式,我们需要一个结构来存储调色板。然后,我们需要 HWND对象让裁剪器知道它应该剪切的窗口边界。最后,一旦DirectDraw应用程序被初始化我们需要一个布尔变量来启动和停止它的动画。创建全局变量的目的是用来访问DirectDraw对象,还有一个布尔变量来追踪我们是否在全屏模式下。这些全局变量同全局函数一样,我把它们放到一个叫做Globals.cpp的独立文件中,加入到Visual C/C+ project中。他们也可以是某个类的成员,但是为了更容易的访问,我选择了使它们全局化,以易于被整个模块所访问。把DX素材同其它程序分隔开,使它们易于被非MFC应用程序使用。LPDIRECTDRAWpDD; / DirectDrawobjectLPDIRECTDRAWSURFACE pDDSPrimary; / DirectDrawprimary surfaceLPDIRECTDRAWSURFACE pDDSBack; / DirectDrawback surfaceLPDIRECTDRAWPALETTE pDDPal; / Palette (coming sometime soonish)LPDIRECTDRAWCLIPPER pClipper; / Clipper for windowed modeHWND ddWnd; / Handle of windowBOOL bFullScreen; / are we in fullscreen mode?BOOL bAnimating; / are we animating?同时建立一个函数来初始化这些变量:void InitDirectXGlobals() pDD = NULL; pDDSPrimary = NULL; pDDSBack = NULL; pDDPal = NULL; pClipper = NULL; bFullScreen = FALSE; bAnimating = FALSE;这是我的Globals.h 和 Globals.cpp文件的通常布局:Globals.h#ifndef _GLOBALS_H_#define _GLOBALS_H_include extern LPDIRECTDRAWpDD;.extern void InitDirectXGlobals();.#endifGlobals.cpp#include stdafx.h#include #include #include Globals.hLPDIRECTDRAWpDD;.void InitDirectXGlobals()pDD = NULL;.3.4初始化DirectDraw系统我们需要一个例程来初始化DirectDraw系统。在你每次从全屏模式转换到窗口模式时,DirectDraw系统都要初始化。DirectDrawCreate函数被调用来创建DirectDraw对象。BOOL InitDDraw() HRESULT hr; / 创建 DirectDraw对象,第一个NULL意味着使用当前显示模式 / 最后的参数一定是NULL hr = DirectDrawCreate(NULL, &pDD, NULL);if (FAILED(hr) TRACE(Unable to create DDraw objectn); return FALSE; / DirectDraw对象初始化成功3.5设置屏幕模式SetCooperativeLevel函数用来告诉系统是否运行在全屏模式或窗口模式下。我们必需独占DirectDraw设备,然后设置显示模式。在窗口模式下,我们把cooperative level设置为normal。BOOL SetMode() HRESULT hr; if (bFullScreen) / 设置 cooperative level 我们才可使用全屏模式 hr = pDD-SetCooperativeLevel(AfxGetMainWnd()-GetSafeHwnd(), DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN | DDSCL_NOWINDOWCHANGES); if (FAILED(hr) pDD-Release(); return FALSE; / 设置 640x480x256 全屏模式 hr = pDD-SetDisplayMode(640, 480, 8); if (FAILED(hr) TRACE(Error setting display mode: %dn, int(LOWORD(hr); pDD-Release(); return FALSE; else / 设置 DDSCL_NORMAL使用窗口模式 hr = pDD-SetCooperativeLevel(AfxGetMainWnd()-GetSafeHwnd(), DDSCL_NORMAL); / Success return TRUE;3.6创建表面初始化之后,我们需要创建翻转(flipping)结构。无论如何,我们需要创建一个每个人都能看到的主表面,以及一个“后台”表面。所有的绘图过程都是在后台表面完成的。当完成绘图后,我们必须使我们所绘制的东西可视。在全屏模式下,我们需要调用程序Flip,它将把当前后台表面加入主表面,反之亦然。在窗口模式下,我们事实上翻转表面:复制后台缓冲中在窗口里的内容到主缓冲。换句话说,我们“blit”后台表面到主表面。这里有一些创建表面的代码。但这些代码忽略了全屏模式,只满足窗口模式的需要。UINT CreatePrimarySurface() DDSURFACEDESC ddsd; / 描述我们需要的表面结构 HRESULT hr; / 保存函数调用的返回值 / 调节全屏模式,把 DDSURFACEDESC结构的所有内容清零 memset(&ddsd, 0, sizeof(ddsd); / 结构的第一个参数必须包含结构的大小 ddsd.dwSize = sizeof(ddsd); / dwFlags参数通知 DirectDraw 哪一个 DDSURFACEDESC 域包含有效的值 ddsd.dwFlags = DDSD_CAPS; ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE; / 创建主表面 hr = pDD-CreateSurface(&ddsd, &pDDSPrimary, NULL); if (FAILED(hr) TRACE(Error: pDD-CreateSurface (primary)n); TraceErrorDD(hr); pDD-Release(); pDD = NULL; return 1; / 现在创建后缓冲 ddsd.dwFlags = DDSD_WIDTH | DDSD_HEIGHT | DDSD_CAPS; / 设置我们的离屏表面为 320x240 ddsd.dwWidth = 320; ddsd.dwHeight = 240; / 创建离屏表面 ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN; hr = pDD-CreateSurface(&ddsd, &pDDSBack, NULL); if (FAILED(hr) TRACE(Error: CreateSurface (back)n); TraceErrorDD(hr); return 2; / success return 0;3.7 创建裁剪器我们已创建了表面,我们需要创建裁剪器(如果我们运行在窗口模式),然后在主表面选用裁剪器。这防止DirectDraw画到窗口客户区的外面。UINT CreateClipper() HRESULT hr; / 使用DirectDraw创建裁剪器 hr = pDD-CreateClipper(0, &pClipper, NULL); if (FAILED(hr) TRACE(Error: CreateClippern); TraceErrorDD(hr); return 1; / 给裁剪器分配HWND ddWnd = AfxGetMainWnd()-GetSafeHwnd(); hr = pClipper-SetHWnd(0, ddWnd); if (FAILED(hr) TRACE(Error: SetHWndn); TraceErrorDD(hr); return 2; / 给主表面选用裁剪器 hr = pDDSPrimary-SetClipper(pClipper); if (FAILED(hr) TRACE(Error: SetClippern); TraceErrorDD(hr); return 3; / success return 0;3.8综合现在有了这些初始函数。我们需要实际调用它们,因此问题在于,在哪调用它们?对MFC应用程序来说,是在应用程序的InitInstance例程。BOOL CDirectDrawApp:InitInstance()#ifdef _AFXDLL Enable3dControls();#else Enable3dControlsStatic();#endif LoadStdProfileSettings(0); CSingleDocTemplate* pDocTemplate; pDocTemplate = new CSingleDocTemplate( IDR_MAINFRAME, RUNTIME_CLASS(CDirectDrawDoc), RUNTIME_CLASS(CMainFrame), RUNTIME_CLASS(CDirectDrawView); AddDocTemplate(pDocTemplate); CCommandLineInfo cmdInfo; ParseCommandLine(cmdInfo); if (!ProcessShellCommand(cmdInfo) return FALSE; InitDirectXGlobals(); TRACE(%pn, AfxGetMainWnd(); InitDDraw(); SetMode(); TRACE(Calling CreatePrimarySurfacen); CreatePrimarySurface();TRACE(Calling CreateClippern); CreateClipper(); /开始动画 bAnimating = TRUE; return TRUE;3.9还原丢失的表面只要出现所有的设定初值不够用的情况,我们就要确认DirectDraw表面有没有“丢失”。 因为必需与Windows GDI共享资源,约束在DirectDraw表面的内存在某种情况下会被释放。因此在每次渲染的时候,我们首先必需检查我们的表面是否已丢失,若已丢失就还原。这些用IsLost函数完成。/ 检查与表面相关联的内存是否已丢失,若必要的话就还原。BOOL CheckSurfaces() / 检查主表面 if (pDDSPrimary) if (pDDSPrimary-IsLost() = DDERR_SURFACELOST) pDDSPrimary-Restore(); return FALSE; return TRUE;3.10渲染循环现在我们得到了大多数通用的初始化值,我们需要设立渲染循环。基本上,这是游戏主循环,即所谓的HeartBeat(心跳)函数。HeartBeat 函数在空闲时间进行处理;所以我们需要屏蔽应用程序的OnIdle 函数。使用ClassWizard 或toolbar wizard为你的主应用程序类的空闲时间处理创建一个句柄。在这里我假设你知道一点点关于MFC知识。注意:即使你的程序没有获得当前的焦点,你的应用程序OnIdle句柄也在被调用,但我们不能让你的应用程序做任何事除非它有当前的焦点。这就是为什么我们使用bAnimating的原因;当我们接收到带错误参数的WM_ACTIVATE(应用程序?)消息时,我们设它为FALSE。仅当我们设置了DirectDraw和表面等等之后,我们设这变量为TRUE。BOOL CDirectDrawApp:OnIdle(LONG lCount) CWinApp:OnIdle(lCount); / 调用前一个缺省句柄 if (bAnimating) / heartbeat函数 HeartBeat(); / 防止闪烁 Sleep(50); / 请求更多的空闲时间,这样我们能开始下一个渲染循环 return TRUE;3.11 HeartBeat函数让我们来看HeartBeat函数。BOOL CDirectDrawApp:HeartBeat() / RGB格式的颜色块变量 static r = 0; static g = 100; static b = 150; r+; g += 3; b += 2; if (r 255) r = 0; if (g 255) g = 0; if (b 255) b = 0; / 目的矩形在我们的320x240离屏表面 CRect rc(10,30,100,70); / 使用blit绘制这个矩形 / 这个结构描述了如何blit DDBLTFX fx; / Zero out all fields of the blit effects structure memset(&fx, 0, sizeof(fx); /dwSize必须包含结构的大小 fx.dwSize = sizeof(DDBLTFX); / 设置绘制到矩形上的颜色 fx.dwFillColor = RGB(r,g,b); / Blit. 要注意,我们blit到后缓冲 HRESULT hr; hr = pDDSBack-Blt(&rc, NULL, NULL, DDBLT_COLORFILL | DDBLT_WAIT, &fx); if (FAILED(hr) TRACE(Error blitting: ); TraceErrorDD(hr); return FALSE; / 调用翻转表面例程 FlipSurfaces(); /没有大的错误 return TRUE;要注意Blt参数DDBLT_WAIT。若表面忙,那么DirectDraw返回一个错误,不执行blit,并通过DDBLT_WAIT选项通知DirectDraw等待,直到表面有效,再进行blit操作。3.12翻转表面现在看一下执行表面翻转的程序。UINT FlipSurfaces() HRESULT hr; /源和目的矩形 RECT rcSrc; RECT rcDest; POINT p; / 确认没有丢失表面 CheckSurfaces(); / if were windowed do the blit, else just Flip if (!bFullScreen) / find out where on the primary surface our window lives p.x = 0; p.y = 0; :ClientToScreen(ddWnd, &p); :GetClientRect(ddWnd, &rcDest); OffsetRect(&rcDest, p。x, p。y); SetRect(&rcSrc, 0, 0, 320, 240); hr = pDDSPrimary-Blt(&rcDest, pDDSBack, &rcSrc, DDBLT_WAIT, NULL); else hr = pDDSPrimary-Flip(NULL, DDFLIP_WAIT); / success! return 0;3.13追踪DirectDraw错误这里是一个非常有用的用于DirectX应用程序的调试函数,叫作TraceErrorDD: void TraceErrorDD(HRESULT hErr) switch (hErr) case DDERR_ALREADYINITIALIZED:TRACE(DDERR_ALREADYINITIALIZED); break;case DDERR_CANNOTATTACHSURFACE:TRACE(DDERR_CANNOTATTACHSURFACE); break;case DDERR_CANNOTDETACHSURFACE:TRACE(DDERR_CANNOTDETACHSURFACE); break;case DDERR_CURRENTLYNOTAVAIL:TRACE(DDERR_CURRENTLYNOTAVAIL); break;case DDERR_EXCEPTION:TRACE(DDERR_EXCEPTION); break;case DDERR_GENERIC:TRACE(DDERR_GENERIC); break;case DDERR_HEIGHTALIGN:TRACE(DDERR_HEIGHTALIGN); break;case DDERR_INCOMPATIBLEPRIMARY:TRACE(DDERR_INCOMPATIBLEPRIMARY); break;case DDERR_INVALIDCAPS:TRACE(DDERR_INVALIDCAPS); break;case DDERR_INVALIDCLIPLIST:TRACE(DDERR_INVALIDCLIPLIST); break;case DDERR_INVALIDMODE:TRACE(DDERR_INVALIDMODE); break;case DDERR_INVALIDOBJECT:TRACE(DDERR_INVALIDOBJECT); break;case DDERR_INVALIDPARAMS:TRACE(DDERR_INVALIDPARAMS); break;case DDERR_INVALIDPIXELFORMAT:TRACE(DDERR_INVALIDPIXELFORMAT); break;case DDERR_INVALIDRECT:TRACE(DDERR_INVALIDRECT); break;case DDERR_LOCKEDSURFACES:TRACE(DDERR_LOCKEDSURFACES); break;case DDERR_NO3D:TRACE(DDERR_NO3D); break;case DDERR_NOALPHAHW:TRACE(DDERR_NOALPHAHW); break;case DDERR_NOCLIPLIST:TRACE(DDERR_NOCLIPLIST); break;case DDERR_NOCOLORCONVHW:TRACE(DDERR_NOCOLORCONVHW); break;case DDERR_NOCOOPERATIVELEVELSET:TRACE(DDERR_NOCOOPERATIVELEVELSET); break;case DDERR_NOCOLORKEY:TRACE(DDERR_NOCOLORKEY); break;case DDERR_NOCOLORKEYHW:TRACE(DDERR_NOCOLORKEYHW); break;case DDERR_NODIRECTDRAWSUPPORT:TRACE(DDERR_NODIRECTDRAWSUPPORT); break;case DDERR_NOEXCLUSIVEMODE:TRACE(DDERR_NOEXCLUSIVEMODE); break;case DDERR_NOFLIPHW:TRACE(DDERR_NOFLIPHW); break;case DDERR_NOGDI:TRACE(DDERR_NOGDI); break;case DDERR_NOMIRRORHW:TRACE(DDERR_NOMIRRORHW); break;case DDERR_NOTFOUND:TRACE(DDERR_NOTFOUND); break;case DDERR_NOOVERLAYHW:TRACE(DDERR_NOOVERLAYHW); break;case DDERR_NORASTEROPHW:TRACE(DDERR_NORASTEROPHW); break;case DDERR_NOROTATIONHW:TRACE(DDERR_NOROTATIONHW); break;case DDERR_NOSTRETCHHW:TRACE(DDERR_NOSTRETCHHW); break;case DDERR_NOT4BITCOLOR:TRACE(DDERR_NOT4BITCOLOR); break;case DDERR_NOT4BITCOLORINDEX:TRACE(DDERR_NOT4BITCOLORINDEX); break;case DDERR_NOT8BITCOLOR:TRACE(DDERR_NOT8BITCOLOR); break;case DDERR_NOTEXTUREHW:TRACE(DDERR_NOTEXTUREHW); break;case DDERR_NOVSYNCHW:TRACE(DDERR_NOVSYNCHW); break;case DDERR_NOZBUFFERHW:TRACE(DDERR_NOZBUFFERHW); break;case DDERR_NOZOVERLAYHW:TRACE(DDERR_NOZOVERLAYHW); break;case DDERR_OUTOFCAPS:TRACE(DDERR_OUTOFCAPS); break;case DDERR_OUTOFMEMORY:TRACE(DDERR_OUTOFMEMORY); break;case DDERR_OUTOFVIDEOMEMORY:TRACE(DDERR_OUTOFVIDEOMEMORY); break;case DDERR_OVERLAYCANTCLIP:TRACE(DDERR_OVERLAYCANTCLIP); break;case DDERR_OVERLAYCOLORKEYONLYONEACTIVE:TRACE(DDERR_OVERLAYCOLORKEYONLYONEACTIVE); break;case DDERR_PALETTEBUSY:TRACE(DDERR_PALETTEBUSY); break;case DDERR_COLORKEYNOTSET:TRACE(DDERR_COLORKEYNOTSET); break;case DDERR_SURFACEALREADYATTACHED:TRACE(DDERR_SURFACEALREADYATTACHED); break;case DDERR_SURFACEALREADYDEPENDENT:TRACE(DDERR_SURFACEALREADYDEPENDENT); break;case DDERR_SURFACEBUSY:TRACE(DDERR_SURFACEBUSY); break;case DDERR_CANTLOCKSURFACE:TRACE(DDERR_CANTLOCKSURFACE); break;case DDERR_SURFACEISOBSCURED:TRACE(DDERR_SURFACEISOBSCURED); break;case DDERR_SURFACELOST:TRACE(DDERR_SURFACELOST); break;case DDERR_SURFACENOTATTACHED:TRACE(DDERR_SURFACENOTATTACHED); break;case DDERR_TOOBIGHEIGHT:TRACE(DDERR_TOOBIGHEIGHT); break;case DDERR_TOOBIGSIZE:TRACE(DDERR_TOOBIGSIZE); break;case DDERR_TOOBIGWIDTH:TRACE(DDERR_TOOBIGWIDTH); break;case DDERR_UNSUPPORTED:TRACE(DDERR_UNSUPPORTED); break;case DDERR_UNSUPPORTEDFORMAT:TRACE(DDERR_UNSUPPORTEDFORMAT); break;case DDERR_UNSUPPORTEDMASK:TRACE(DDERR_UNSUPPORTEDMASK); break;case DDERR_VERTICALBLANKINPROGRESS:TRACE(DDERR_VERTICALBLANKINPROGRESS); break;case DDERR_WASSTILLDRAWING:TRACE(DDERR_WASSTILLDRAWING); break;case DDERR_XALIGN:TRACE(DDERR_XALIGN); break;case DDERR_INVALIDDIRECTDRAWGUID:TRACE(DDERR_INVALIDDIRECTDRAWGUID); break;case DDERR_DIRECTDRAWALREADYCREATED:TRACE(DDERR_DIRECTDRAWALREADYCREATED);

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论