VC++游戏开发随记之三十二Word格式文档下载.docx

上传人:b****5 文档编号:18783233 上传时间:2023-01-01 格式:DOCX 页数:16 大小:299.87KB
下载 相关 举报
VC++游戏开发随记之三十二Word格式文档下载.docx_第1页
第1页 / 共16页
VC++游戏开发随记之三十二Word格式文档下载.docx_第2页
第2页 / 共16页
VC++游戏开发随记之三十二Word格式文档下载.docx_第3页
第3页 / 共16页
VC++游戏开发随记之三十二Word格式文档下载.docx_第4页
第4页 / 共16页
VC++游戏开发随记之三十二Word格式文档下载.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

VC++游戏开发随记之三十二Word格式文档下载.docx

《VC++游戏开发随记之三十二Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《VC++游戏开发随记之三十二Word格式文档下载.docx(16页珍藏版)》请在冰豆网上搜索。

VC++游戏开发随记之三十二Word格式文档下载.docx

在早期的版本中,DirectXSDK是以COM接口的方式提供给开发者的,把功能相似的函数封装在一个COM接口中。

随着微软.NET战略的实施,从DirectX9.0开始,除了COM接口的方式,DirectX开发接口还可以以.NET类库的形式提供给我们。

所以,目前DirectX开发游戏或者三维图形程序时就有了两种选择:

1.采用COM接口的方式。

2.采用.NET类库的方式。

先来讲讲DirectX的第一套开发方案,也就是采用COM接口。

COM接口与C、C++甚至VisualBasic编程语言都是可以擦出火花的。

尤其是C++,与COM接口配合使用有非常高的契合度,显然C++/COM接口搭档是目前使用最广泛的DirectX开发方式。

对于第二种开发方案,DirectX配合.NET类库的方式,可以配合C#、MannagedC++等编程语言进行开发。

尤其是C#与.NET配合DirectX,这样可以充分发挥.NET类库提供的强大功能,例如数据库的开发、底层通信功能的支持等等。

对于开发一些性能要求不高的游戏或者三维图形程序时,C#与.NET配合DirectX可能比C++与COM接口配DirectX来得更合适。

但是对于大型游戏开发,执行效率永远都是要放在第一位的。

一谈到执行效率,这可是C/C++的长处。

所以,在高性能游戏的开发领域,C/C++就显得比任何编程语言都要高贵与雍容。

所以,毋庸多言,C++与COM接口配DirectX,是目前99%大型游戏采用的开发方案,也是我们主要讲解的方向。

Direct3D作为DirectX的绝对主力,是微软与OpenGL在3D图形领域抗衡的正面武器。

每次DirectX升级之时,微软都会单独针对Direct3D这款API进行大量更新,使其拥有更强大的功能,更完善的使用体验。

因为Direct3D主攻3D图形与3D游戏,可谓DirectX中撑场面的API,自然我们在后续讲解中要将更多的重心放在它之上。

下面我们就来迈出介绍Direct3D的第一步,讲解Direct3D程序开发和运行密切相关的一些知识。

先来看一张结构图,这是Direct3D,GDI/GDI+与应用程序,显卡之间交互关系的一张简明扼要的结构图:

1.关于结构图的解释

如图,Win32应用程序可以使用Direct3D以及GDI/GDI+两套图形库完成与显卡的交互。

当然,能与显卡交互的方式不只有这两种,方法多得是,这里我们只需要暂时知道有这两种就可以了。

我们可以看到,与Direct3D和GDI/GDI+处于同一层次,也就是说,Direct3D和GDI/GDI+都可以通过图形设备驱动程序接口(DDI)访问图形硬件,也就是显卡。

但不同于GDI/GDI+这对“屌丝”设备的是,“高富帅”Direct3D可是有一个牛逼闪闪的“后台”的,那就是硬件抽象层(HAL)。

Direct3D可以使用硬件抽象层(HAL)通过图形设备驱动程序接口(DDI)来访问显卡,从而可以充分地发挥显卡的潜在性能,绘制出高性能高质量的精美图形来。

如果我们的显卡支持Direct3D的话,HAL就存在于我们的计算机中,而需要运行DirectX9.0开发的应用程序的话,我们的显卡驱动程序需要至少支持DirectX7.0版本以上的DDI才可以,不过在如今支持DirectX11显卡烂大街的时代,这显然不会是什么问题。

2.关于硬件抽象层HAL

大多数基于Direcr3DAPI设计开发的三维图形程序都运行于硬件抽象层(HardwareAbstractionLayer),也就是HAL之上。

使用HAL的好处,是既能充分利用系统硬件的加速功能,又隐藏了硬件相关的设备特性。

这就是说,Direct3D利用HAL实现了设备无关的特性,通过Direct3D可以编写出与设备无关的高效代码。

硬件抽象层是由硬件制造商提供的特定于硬件的接口,Direct3D利用该接口实现了对显示硬件的直接访问。

所以,应用程序永远不需要访问HAL,直接与Direct3DAPI打交道就可以了。

HAL可以是显卡的一部分,也可以是和显卡驱动程序相互关联的单独动态链接库(DLL)。

HAL仅仅是与设备相关的代码,对于硬件不支持的功能,它并不提供软件模拟。

在DirectX9.0中,针对同一种显示设备,HAL提供3种顶点处理模式:

软件顶点处理、硬件顶点处理和混合顶点处理。

还有,纯硬件设备是HAL的变体,纯硬件设备类型仅支持硬件顶点处理。

3.关于参考光栅设备REF

万事还是有个特殊的,是吧。

有时候,Direct3D提供的某些功能不被我们的显卡支持,但是我们偏偏想去使用这些功能的话,就可以使用一下Direct3D的辅助设备,也就是参考光栅设备(ReferenceRasterizerDevice,REF)。

这种REF设备可以以软件运算的方式完全支持Direct3DAPI。

借助REF设备,我们可以在代码中使用那些不为当前硬件所支持的特性,并对这些特征进行测试。

扯了那么多空话,无非能使大家对DirectX有些更深刻的认识,不过落到实处,还是需要在敲代码上下功夫。

俗话说,千里之堤,溃于蚁穴,为了后面更好地演示与学习我们关于DirectX的各项功能,首先需要有一个很好的Win32应用程序框架。

这是浅墨敲出来的一个详细注释的Win32应用程序的源代码,文章稍后会把详细注释的源代码贴出来,先给大家看一个大概的框架一览:

为了演示DirectX各项功能的方便性,与代码的易读性,目前我们并没有以类为载体。

我们的想法是,当后面需要构建功能复杂的程序的时候,再转向面向对象的思想。

我们之后学习的关于Direct3D的编程,简单点说,只需:

1.在Direct3D_Init(HWNDhwnd)函数里完成Direct3D的相关初始化

2.在 

Direct3D_Render()函数里完成渲染。

3.Direct3D_CleanUp()函数里完成资源的清理。

这三步就可以了。

下面我们就来贴出详细注释的源代码:

[cpp] 

viewplaincopyprint?

1.//***************************************************************************************** 

2.// 

3.//【Visual 

C++】游戏开发笔记系列配套源码 

三十二 

浅墨DirectX提高班 

之 

Win32窗口的创建 

4.// 

Note_Code_32 

5.// 

VS2010版 

6.// 

2012年 

11月07日 

Create 

by 

浅墨 

7.//图标素材:

古剑奇谭 

风雪晴 

8.//此刻心情:

多年以后,当你回忆往昔,唯一让你觉得真实,和骄傲的,是你现在昂首挺胸、用力走过的人生。

9.// 

10.//***************************************************************************************** 

11. 

12. 

13. 

14. 

15.//***************************************************************************************** 

16.// 

Desc:

头文件定义部分 

17.//***************************************************************************************** 

18.#include 

<

d3d9.h>

19. 

20. 

21. 

22.//***************************************************************************************** 

23.// 

宏定义部分 

24.//***************************************************************************************** 

25.#define 

SCREEN_WIDTH 

800 

//为窗口宽度定义的宏,以方便在此处修改窗口宽度 

26.#define 

SCREEN_LEIGHT 

600 

//为窗口高度定义的宏,以方便在此处修改窗口高度 

27.#define 

WINDOW_TITLE 

L"

【Visual 

C++游戏开发笔记】博文配套demo之三十二 

Win32窗口的创建"

//为窗口标题定义的宏 

28.#define 

SAFE_RELEASE(p) 

if(p) 

(p)->

Release();

(p)=NULL;

//定义一个安全释放宏,便于后面COM接口指针的释放 

29. 

30. 

31. 

32.//***************************************************************************************** 

33.// 

全局变量声明部分 

34.// 

35.//***************************************************************************************** 

36. 

37. 

38. 

39.//***************************************************************************************** 

40.// 

全局函数声明部分 

41.// 

42.//***************************************************************************************** 

43.LRESULT 

CALLBACK 

WndProc( 

HWND 

hwnd, 

UINT 

message, 

WPARAM 

wParam, 

LPARAM 

lParam 

);

44.HRESULT 

Direct3D_Init(HWND 

hwnd);

45.void 

Direct3D_Render( 

46.void 

Direct3D_CleanUp( 

47. 

48. 

49. 

50.//***************************************************************************************** 

51.// 

Name:

WinMain( 

) 

52.// 

Windows应用程序入口函数 

53.//***************************************************************************************** 

54.int 

WINAPI 

WinMain(HINSTANCE 

hInstance, 

HINSTANCE 

hPrevInstance,LPSTR 

lpCmdLine, 

int 

nShowCmd) 

55.{ 

56. 

57. 

//开始设计一个完整的窗口类 

58. 

WNDCLASSEX 

wndClass 

};

//用WINDCLASSEX定义了一个窗口类 

59. 

wndClass.cbSize 

sizeof( 

;

//设置结构体的字节数大小 

60. 

wndClass.style 

CS_HREDRAW 

CS_VREDRAW;

//设置窗口的样式 

61. 

wndClass.lpfnWndProc 

WndProc;

//设置指向窗口过程函数的指针 

62. 

wndClass.cbClsExtra 

0;

63. 

wndClass.cbWndExtra 

64. 

wndClass.hInstance 

hInstance;

//指定包含窗口过程的程序的实例句柄。

65. 

wndClass.hIcon=(HICON):

:

LoadImage(NULL,L"

icon.ico"

IMAGE_ICON,0,0,LR_DEFAULTSIZE|LR_LOADFROMFILE);

//本地加载自定义ico图标 

66. 

wndClass.hCursor 

LoadCursor( 

NULL, 

IDC_ARROW 

//指定窗口类的光标句柄。

67. 

wndClass.hbrBackground=(HBRUSH)GetStockObject(GRAY_BRUSH);

//为hbrBackground成员指定一个灰色画刷句柄 

68. 

wndClass.lpszMenuName 

NULL;

//用一个以空终止的字符串,指定菜单资源的名字。

69. 

wndClass.lpszClassName 

ForTheDreamOfGameDevelop"

//用一个以空终止的字符串,指定窗口类的名字。

70. 

71. 

if( 

!

RegisterClassEx( 

&

//设计完窗口后,需要对窗口类进行注册,这样才能创建该类型的窗口 

72. 

return 

-1;

73. 

74. 

hwnd 

CreateWindow( 

WINDOW_TITLE, 

//喜闻乐见的创建窗口函数CreateWindow 

75. 

WS_OVERLAPPEDWINDOW, 

CW_USEDEFAULT, 

SCREEN_WIDTH, 

76. 

SCREEN_LEIGHT, 

NULL 

77. 

78. 

79. 

MoveWindow(hwnd,250,80,SCREEN_WIDTH,SCREEN_LEIGHT,true);

//调整窗口显示时的位置,使窗口左上角位于(250,80)处 

80. 

ShowWindow( 

nShowCmd 

//调用Win32函数ShowWindow来显示窗口 

81. 

UpdateWindow(hwnd);

//对窗口进行更新,就像我们买了新房子要装修一样 

82. 

83. 

//Direct3D资源的初始化 

84. 

Direct3D_Init 

(hwnd);

85. 

MessageBox(hwnd, 

DirectX,等着瞧吧,老夫随浅墨来降服你了~!

"

 

浅墨的消息窗口"

0);

//使用MessageBox函数,创建一个消息窗口 

86. 

//消息循环过程 

87. 

MSG 

msg 

//初始化msg 

88. 

while( 

msg.message 

WM_QUIT 

//使用while循环 

89. 

90. 

PeekMessage( 

msg, 

0, 

PM_REMOVE 

//查看应用程序消息队列,有消息时将队列中的消息派发出去。

91. 

92. 

TranslateMessage( 

//将虚拟键消息转换为字符消息 

93. 

DispatchMessage( 

//该函数分发一个消息给窗口程序。

94. 

95. 

else 

96. 

97. 

Direct3D_Render();

//进行渲染 

98. 

99. 

100. 

101. 

UnregisterClass(L"

wndClass.hInstance);

//程序准备结束,注销窗口类 

102. 

103.} 

104. 

105. 

106. 

107.//***************************************************************************************** 

108.// 

WndProc() 

109.// 

窗口过程函数WndProc,对窗口消息进行处理 

110.//***************************************************************************************** 

111.LRESULT 

112.{ 

113. 

switch( 

message 

//switch语句开始 

114. 

115. 

case 

WM_PAINT:

// 

客户区重绘消息 

116. 

Direct3D_Render()

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1