VC++游戏开发随记之三十二Word格式文档下载.docx
《VC++游戏开发随记之三十二Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《VC++游戏开发随记之三十二Word格式文档下载.docx(16页珍藏版)》请在冰豆网上搜索。
在早期的版本中,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
=
0
};
//用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()