| 网站首页 | 文章中心 | 电子书下载 | 矢量图库 | 视频教程 | 素材下载 | 程序代码下载 | JS代码 | 论坛 | 
常用软件类:
|杀毒安全 |联络聊天 |网络软件 |多媒体类 |系统工具 |图形图像 |系统工具 |应用软件 |行业软件
开发设计类:
|动画制作 |图像处理 |3D设计 |操作系统 |站长学院 |网络相关 |WEB设计 |数据库类 |程序开发
C语言 DirectX游戏开发入门
作者:佚名    文章来源:不详    点击数:    更新时间:2006-9-8
  Pitch:这个需要好好解释一下。lPitch表示从画面一行行首数据到下一行行首数据的距离,以字节为单位。例如,640×480×16,每一行有640个象素,每个象素需要两个字节装颜色的信息,所以pitch应该是1280个字节,对不对?可能有一些显示卡要多于1280,这每行多于的内存没有装置任何的图形数据,但是防备有些显示卡不能在线性内存模式显示图形,你还是把多于地放在那吧。这种情况很少发生,但你最好还是考虑在内。

  · LPVOID lpSurface:指向表面内存开始地址的指针。不管你使用什么显示模式,你都可以用DirectDraw创建的线性地址模式操作表面象素。要想这样,你必须锁住表面,但这已经超出我们现在所学的了。

  · DWORD dwBackBufferCount:后缓冲区的数目。以后我们会在提到它。

  · DWORD ddckCKDestBlt,ddckCKSrcBlt:前者为描述位转换操作的目标颜色值,后者是源颜色值。我们将在以后的文章中具体介绍。

  · DDPIXELFORMAT ddpfPixelFormat:这个结构包含了描述显示模式的象素格式标识符。以后会具体介绍,现在就不多说了。

  · DDSCAPS2 ddsCaps:这是最后一个重要的结构。它是一个充满控制标志的结构。感谢菩萨,这是一个小结构,结构成员中只有一个很重要。让我们看一看:

typedef struct _DDSCAPS2{
 DWORD dwCaps;
 DWORD dwCaps2;
 DWORD dwCaps3;
 DWORD dwCaps4;
} DDSCAPS2, FAR* LPDDSCAPS2;


最重要的就是dwCaps了。第三个和第四个成员从来没有用过,是为将来准备的。总之,dwCaps可以使用如下的值,当然可以用“|”组合。以下是最为常用的,其它的你若有兴趣,自己查好了。

  · DDSCAPS_BACKBUFFER:指出这个表面是需要表面切换结构的后缓冲区。

  · DDSCAPS_COMPLEX:是一个复杂表面,由主表面,一个或多个粘贴表面组成,通常是为了页面切换。

  · DDSCAPS_FLIP:指出这个表面是表面切换结构的一部分。前缓冲区紧跟着一个或多个建立好的后缓冲区。

  · DDSCAPS_FRONTBUFFER:是关于表面切换结构的前缓冲区。

  · DDSCAPS_LOCALVIDMEM:指出在true、local video memory【不知怎么翻译】中建立表面。如果使用该标志,必须也同时使用DDSCAPS_VIDEOMEMORY标志,但不能同DDSCAPS_NONLOCALVIDMEM标志同时使用。

  · DDSCAPS_MODEX:指出这个表面是Mode X模式(320×200或320×240)的表面。

  · DDSCAPS_NONLOCALVIDMEM:指出表面建立在non-local video memory【不知怎么翻译】中。如果定义该标志,必须也同时使用DDSCAPS_VIDEOMEMORY标志。但是不能同DDSCAPS_LOCALVIDMEM同时使用。

  · DSCAPS_OFFSCREENPLAIN:这是一个简单的离屏表面。

  · DDSCAPS_OWNDC:这个表面将具有长周期的设备上下文。

  · DDSCAPS_PRIMARYSURFACE:主表面。

  · DDSCAPS_STANDARDVGAMODE:是标准的VGA模式表面。不能同DDSCAPS_MODEX同用。

  · DDSCAPS_SYSTEMMEMORY:建立在系统内存里的表面。

  · DDSCAPS_VIDEOMEMORY:这个表面建立在显示内存里。

  天啊,终于介绍完了这个结构。现在我们准备建立表面吧。第一步当然是填充DDSURFACEDESC2结构。Microsoft推荐大家当你使用一个结构之前,你应该把它先初始化为0。有鉴于此,我经常使用这样一个宏:

#define INIT_DXSTRUCT(dxs) { ZeroMemory(&dxs, sizeof(dxs)); dds.dwSize = sizeof(dxs); }


  它可以用于任何一个DirectX结构,因为它们都有dwSize成员,所以这是很方便的。如果你以前从来没有看过ZeroMemory()这个函数,它只是由函数memset()扩充来的宏,在Windows的头文件中用#define定义好了,所以你不需要用#indlude添加任何东西就可以用它。
初始化了结构之后,你得根据实际情况设置表面了。对于主表面,你需要ddsCaps和dwBackBufferCount,对于离屏缓冲区,你也需要dwHeight和dwWidth,但不需要dwBackBufferCount。对于一些表面你可能还需要颜色值,但我们不把它弄得太复杂了。填充完结构后,你需要调用IDirectDraw7::CreateSurface()函数,原形是这样:

HRESULT CreateSurface(
 LPDDSURFACEDESC2 lpDDSurfaceDesc,
 LPDIRECTDRAWSURFACE7 FAR *lplpDDSurface,
 IUnknown FAR *pUnkOuter
);


  这些参数的意义可能你也能猜出个大概了,毕竟我们已经习惯了这些疯狂的DirectX素材:

  · LPDDSURFACEDESC2 lpDDSurfaceDesc:表示要创建表面的描述结构。当然是个指针了。

  · LPDIRECTDRAWSURFACE7 FAR *lplpDDSurface:为指向表面指针的指针。此参数在此函数调用成功后填充。为什么要使用指向指针的指针呢?这是因为我们的任务就是分配一片表面内存区域,这样只能使用指针(表面指针)作为操作该表面内存区域的标志,返回值应该是该指针值而不是该指针所表示的内容(具体的表面)。当我们使用函数参数传递该值时,又只能使用指针(即指针的指针)修改表面指针的内容而不是表面指针所代表的表面内存区域。(理论复杂,使用简单,不明白不要太在意)

  · IUnknown FAR *pUnkOuter:看过这个模式吧,无论何时调用pUnkOuter,都是关于COM应用的,我们不想在这儿浪费时间,设置为NULL好了。

  来个实例吧,你会明白一切的。希望在实例里,我们要

上一页  [1] [2] [3] [4] [5] [6] [7] 下一页


相关文章