【游戏开发】关于Direct X

QuickSDK | 2018-05-26 | 技术干货

1.DirectX的定义

首先,我们必须了解DirectX的定义。

DirectX,(Direct eXtension,简称DX)是由微软公司创建的多媒体编程接口。由C++编程语言实现,遵循COM。被广泛使用于Microsoft Windows、Microsoft Xbox和Microsoft Xbox 360电子游戏开发,并且只能支持这些平台。最新版本为DirectX 11,创建在最新的Windows 7上。

Microsoft DirectX 是这样一组技术:它们旨在使基于Windows 的计算机成为运行和显示具有丰富多媒体元素(例如全色图形、视频、3D 动画和丰富音频)的应用程序的理想平台。

DirectX 包括安全和性能更新程序,以及许多涵盖所有技术的新功能。应用程序可以通过使用DirectX API 来访问这些新功能。

Direct X主要用于游戏开发,但其中部分用于开发其他类型的软件,包括游戏虚拟角色、网络软件、与游戏无关的图形软件。

Direct X通过和底层硬件打交道,从而获取软件的最大性能。

 

2.必要的工具和开发环境

要进行游戏的开发,我们必须拥有一套最新的DirectX SDK(软件开发包)。我们可以从微软的官方下载站进行下载然后安装,这里贴出地址,http://msdn.microsoft.com/zh-cn/directx/aa937788.aspx。当然我们还要拥有开发环境,我们选择Microsoft公司的Visual Studio 2010。

 

3.引擎设计概述

游戏引擎是一系列高级代码,我们可以以它为基础开发自己的游戏。现代的游戏引擎已经对使用他的人隐藏了底层实现的细节和规范。例如,可以在OpenGL和Direct3D的基础上开发渲染引擎,这样,引擎用户就不需要知道使用的是哪一个渲染引擎,尽管也用到了一些底层的东西。

游戏引擎包括:渲染引擎,物理引擎,声音引擎等。游戏引擎本身只是一个由更小的引擎组成的集合。游戏引擎或它涵盖的内容并没有一个精确的定义。

对于视频游戏而言,它的游戏引擎至少要包含渲染引擎和输入引擎,这是必须的,否则,就不能称其为交互式游戏。

游戏程序员和游戏引擎程序员完成的是两种不同的工作。游戏程序员只与开发游戏的游戏引擎打交道,而游戏引擎程序员要开发出其他人用于开发游戏的引擎。

 

4.游戏引擎中的几个关键系统

游戏引擎中的几个关键系统有:游戏渲染系统,输入系统,声音系统,物理系统,动画系统,人工智能(AI)系统等。

 

5. DirectX API函数

DirectX的API主要由DirectGraphics,DirectInput,DirectPlay,DirectMusic,DirectSound组成。每个API之间相互独立,负责完成DirectX内核中不同的功能。DirectX中每个API都可以通过硬件加速,这意味着这些API可以直接和运行软件的底层硬件对话。下面是各种API函数的概要解释。

 

DirectGraphics:

DirectGraphics为负责向屏幕渲染二维图形和三维图形的DirectX API,也就是众所周知的Direct3D。

 

DirectInput:

DirectInput是可以直接使用所有与计算机关联的输入设备的DirectX API。这些设备包括键盘,鼠标和游戏控制器设备。

 

DirectPlay:

DirectPlay是控制Direct中网络功能的Direct API。DirectPlay可以让应用程序对机器进行网络功能设置,从而可以通过和其他网络玩家交流。

 

DirectMusic:

DirectMusic是负责普通声音处理的DirectX API。

 

DirectSound:

DirectSound是负责高级声音处理的DirectX API。

 

6.动手写一个窗口

在Windows中使用Direct3D创建Win32窗口非常简单。要创建一个Win32窗口就必须拥有一个WinMain()函数(这不是废话是什么)。我们可以在MSDN中查到WinMain()的标准句法

1.  //空的WinMain()函数

2.   

3.  #include

4.  int WINAPI WinMain(HINSTANCE hInstance,

5.                      HINSTANCE hPrevInstanace,

6.                    PSTR szCmdLine,

7.                      int iCmdShow)

8.  {

9.    return 0;

10.}

11.

12./*

13.

14.WinMain函数包括4个参数:

15.1.程序实例的句柄(类似追踪定位的指针)

16.2.程序先前的实例

17.3.传递给程序的命令行参数指针

18.4.窗口的显示方式

19.

20.*/

 

1.  //WinMain()函数内部创建窗口

2.   

3.  #include

4.   

5.  //消息过程函数

6.  LRESULT WINAPI MsgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam){

7.    switch (msg)

8.    {

9.   

10.    //销毁信息

11.  case WM_DESTROY:

12.

13.        //让程序知道要退出

14.         PostQuitMessage(0);

15.

16.         return 0;

17.         break;

18.  }

19.

20.    //为所有信息提供默认处理机制

21.  return DefWindowProc(hWnd, msg, wParam, lParam);

22.}

23.int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstanace,

24.  PSTR szCmdLine,int iCmdShow)

25.{

26.    //创建类型为WEDCLASSEX的窗口类对象

27.  WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0, 0, hInstance, NULL,

28.         NULL, NULL, NULL, "AppClass", NULL };

29.

30.    //注册窗口类

31.  RegisterClassEx(&wc);

32.

33.    //创建窗口

34.  HWND hWnd = CreateWindow("AppClass", "Window Title", WS_OVERLAPPEDWINDOW,

35.         100, 100, 640, 480, NULL, NULL, hInstance, NULL);

36.

37.    //在屏幕上显示该窗口  

38.  ShowWindow(hWnd, SW_SHOWDEFAULT);

39.

40.    //更新窗口

41.  UpdateWindow(hWnd);

42.

43.    //声明消息

44.  MSG msg;

45.

46.    //清空消息缓存

47.  ZeroMemory(&msg, sizeof(msg));

48.

49.    //消息循环直到退出

50.  while (msg.message != WM_QUIT)

51.  {

52.        //从消息队列中获取下一条消息

53.          if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))

54.         {

55.            //获取消息,并将其转换成字符消息

56.                 TranslateMessage(&msg);

57.            //将转换的消息发送给消息过程函数

58.                 DispatchMessage(&msg);

59.         }

60.         else

61.         {

62.

63.         }

64.  }

65.    //取消对窗口类的注册

66.  UnregisterClass("AppClass", wc.hInstance);

67.}

1.  //初始化Direct3D

2.   

3.  //InitializeD3D()函数的参数:1.窗口句柄  2.标识窗口是否全屏的标识符

4.  bool InitializeD3D(HWND hWnd, bool fullscreen)

5.  {

6.      //声明显卡信息变量

7.    D3DDISPLAYMODE displayMode;

8.   

9.      //Direct3DCreate9()函数:创建一个Direct3D接口对象,并返回该对象

10.  g_D3D = Direct3DCreate9(D3D_SDK_VERSION);

11.

12.  if (g_D3D == NULL)return false;

13.

14.    //GetAdapterDisplayMode()函数:返回当前显卡信息

15.  if (FAILED(g_D3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &displayMode)))

16.         return false;

17.

18.    //D3DPRESENT_PARAMETERS:用于定义Direct3D窗口的显示信息

19.  D3DPRESENT_PARAMETERS d3dpp;

20.

21.    //清空显示信息

22.  ZeroMemory(&d3dpp, sizeof(d3dpp));

23.

24.    //是否全屏

25.  if (fullscreen)

26.  {

27.        //全屏非窗口

28.         d3dpp.Windowed = FALSE;

29.

30.        //窗口宽度

31.         d3dpp.BackBufferWidth = 640;

32.

33.        //窗口高度

34.         d3dpp.BackBufferHeight = 480;

35.  }

36.  else

37.

38.        //窗口非全屏

39.         d3dpp.Windowed = TRUE;

40.   

41.    //处理交换结果

42.  d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;

43.

44.    //管理缓存深度or模板缓存

45.  d3dpp.BackBufferFormat = displayMode.Format;

46.   

47.    //CreateDevice()函数:1.正在使用的显卡 2.设备类型 3.当前窗口 4.顶点运算类型 5.指定到一个                D3DPRESENT_PARAMETERS的结构体 6.返回设备的指针

48.  if (FAILED(g_D3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,

49.         D3DCREATE_HARDWARE_VERTEXPROCESSING, &d3dpp,

50.         &g_D3DDevice)))return false;

51.

52.  return true;

53.}

1.  //在屏幕上绘制一个空白屏

2.  void RenderScene()

3.  {

4.      //清空后台缓存

5.    g_D3DDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);

6.   

7.      //开始渲染

8.    g_D3DDevice->BeginScene();

9.   

10.    //结束渲染

11.  g_D3DDevice->EndScene();

12.

13.    //显示渲染结果

14.  g_D3DDevice->Present(NULL, NULL, NULL, NULL);

15.}

1.  //释放所有Direct3D对象

2.  void Shutdown()

3.  {

4.      //释放Direct3D设备对象

5.    if (g_D3DDevice != NULL)g_D3DDevice->Release();

6.   

7.      //释放Direct3D对象

8.    if (g_D3D != NULL)g_D3D->Release();

9.   

10.    //分别将两个对象指向空

11.  g_D3DDevice = NULL;

12.  g_D3D = NULL;

13.}

1.  //完整代码如下:

2.   

3.  #include

4.  #include

5.   

6.  #pragma comment (lib,"d3d9.lib")

7.  #pragma comment (lib,"d3dx9.lib")

8.   

9.  #define WINDOW_CLASS "UGPDX"

10.#define WINDOW_NAME "Blank D3D Window"

11.

12.bool InitializeD3D(HWND hWnd, bool fullscreen);

13.void RenderScene();

14.void Shutdown();

15.

16.LPDIRECT3D9 g_D3D = NULL;

17.LPDIRECT3DDEVICE9 g_D3DDevice = NULL;

18.

19.LRESULT WINAPI MsgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam){

20.  switch (msg)

21.  {

22.  case WM_DESTROY:

23.         PostQuitMessage(0);

24.         return 0;

25.         break;

26.  case WM_KEYUP:

27.         if (wParam==VK_ESCAPE)

28.                 PostQuitMessage(0);

29.         break;

30.  }

31.  return DefWindowProc(hWnd, msg, wParam, lParam);

32.}

33.

34.int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstanace,

35.  PSTR szCmdLine,int iCmdShow)

36.{

37.  WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0, 0, hInstance, NULL,

38.         NULL, NULL, NULL, "AppClass", NULL };

39.  RegisterClassEx(&wc);

40.  HWND hWnd = CreateWindow("AppClass", "Window Title", WS_OVERLAPPEDWINDOW,

41.         100, 100, 640, 480, NULL, NULL, hInstance, NULL);

42.  ShowWindow(hWnd, SW_SHOWDEFAULT);

43.  UpdateWindow(hWnd);

44.  MSG msg;

45.  ZeroMemory(&msg, sizeof(msg));

46.  while (msg.message != WM_QUIT)

47.  {

48.         if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))

49.         {

50.                 TranslateMessage(&msg);

51.                 DispatchMessage(&msg);

52.         }

53.         else

54.         {

55.

56.         }

57.  }

58.  UnregisterClass("AppClass", wc.hInstance);

59.}

60.

61.bool InitializeD3D(HWND hWnd, bool fullscreen)

62.{

63.  D3DDISPLAYMODE displayMode;

64.  g_D3D = Direct3DCreate9(D3D_SDK_VERSION);

65.  if (g_D3D == NULL)return false;

66.  if (FAILED(g_D3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &displayMode)))

67.         return false;

68.  D3DPRESENT_PARAMETERS d3dpp;

69.  ZeroMemory(&d3dpp, sizeof(d3dpp));

70.  if (fullscreen)

71.  {

72.         d3dpp.Windowed = FALSE;

73.         d3dpp.BackBufferWidth = 640;

74.         d3dpp.BackBufferHeight = 480;

75.  }

76.  else

77.         d3dpp.Windowed = TRUE;

78.  d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;

79.  d3dpp.BackBufferFormat = displayMode.Format;

80.  if (FAILED(g_D3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,

81.         D3DCREATE_HARDWARE_VERTEXPROCESSING, &d3dpp,

82.         &g_D3DDevice)))return false;

83.  return true;

84.}

85.

86.void RenderScene()

87.{

88.  g_D3DDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);

89.  g_D3DDevice->BeginScene();

90.  g_D3DDevice->EndScene();

91.  g_D3DDevice->Present(NULL, NULL, NULL, NULL);

92.}

93.

94.void Shutdown()

95.{

96.  if (g_D3DDevice != NULL)g_D3DDevice->Release();

97.  if (g_D3D != NULL)g_D3D->Release();

98.  g_D3DDevice = NULL;

99.  g_D3D = NULL;

100. }

 

--------------------- 本文来自 一汐 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/qq_23996157/article/details/82858154?utm_source=copy

商务合作

李先生:13880511661

市场合作

赵先生:15390049857

技术支持

彭女士:18202818615

官方技术交流群

QQ群:608554925