D3D初学入门一(配置开发环境及绘制D3D窗口)

  最近一直接触的都是C#的东东,好久没写C++代码了,怕手生忘记了,打算写写C++的代码。写什么好呢?想来想去,以前的工作学过接触了些OpenGL,那我就学习一下D3D吧。原以为D3D的中文入门资料会很多的,结果找了半天也没找到合适的。哎,随便将就着学吧。

  既然是来兴趣学一下,我可不想去下个超大的DirectX安装包,所以首先,当然得找到lib库和头文件啦,我在GameRes游戏开发资源网上找到了,只有3.2M,呵呵,够小吧。地址如下:

  DirectX9.0C SDK library

  下载下来解压后,假设解压到d:/codelib/dx9csdk下吧, 首先得把INC和lib目录加到VC的搜索路径上去。

  我用VS2005, 选择菜单Tools - Option - Projects and Solutions - VC++ Directories

  如图:

  D3D初学入门一(配置开发环境及绘制D3D窗口)_第1张图片

  然后,接下来就可以开始写代码了。

  我们采用Win32API来创建窗口,为了重用代码,创建窗口使用了我博客里介绍的一个类KWindow,请见:

  一个基于Win32的完全面向对象的窗口类

  我们新建一个类,叫做KD3DWindow把,从KWindow继承。

  其UML图如下所示:

D3D初学入门一(配置开发环境及绘制D3D窗口)_第2张图片

  KWindow的内容请看我博客上的前一篇文章吧。

  KD3DWindow.h的内容如下所示:

  1. #include "KWindow.h"
  2. #include <D3D8.H>
  3. #pragma comment(lib, "D3d8.lib")   //链接库
  4. class KD3DWindow : public KWindow
  5. {
  6. private:
  7.     void OnKeyDown(WPARAM wParam, LPARAM lParam);
  8.     void OnDraw(HDC hDC);
  9.     void GetWndClassEx(WNDCLASSEX & wc);
  10.     
  11.     //D3D相关
  12.     void Render();
  13.     void Cleanup();
  14.     HRESULT InitD3D( HWND hWnd );
  15. public:   
  16.     KD3DWindow();
  17.     ~KD3DWindow();
  18.        virtual bool CreateEx(DWORD dwExStyle,
  19.         LPCTSTR lpszClass, LPCTSTR lpszName, DWORD dwStyle,
  20.         int x, int y, int nWidth, int nHeight, HWND hParent,
  21.         HMENU hMenu, HINSTANCE hInst);
  22. private:
  23.     LPDIRECT3D8             g_pD3D      ; // 用来创建D3D设备
  24.     LPDIRECT3DDEVICE8       g_pd3dDevice ; // D3D设备
  25. };

  KD3DWindow.cpp内容如下:

  1. // KD3DWindow.cpp: implementation of the KD3DWindow class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "KD3DWindow.h"
  6. //////////////////////////////////////////////////////////////////////
  7. // Construction/Destruction
  8. //////////////////////////////////////////////////////////////////////
  9. #include <windows.h>
  10. #include <assert.h>
  11. #include <tchar.h>
  12. #include "KWindow.h"
  13. const TCHAR szHint[]    = _T("Press ESC to quit.");
  14. void KD3DWindow::GetWndClassEx( WNDCLASSEX & wc )
  15. {
  16.     memset(& wc, 0, sizeof(wc));
  17.     
  18.     wc.cbSize        = sizeof(WNDCLASSEX);
  19.     wc.style         = 0;
  20.     wc.lpfnWndProc   = WindowProc;
  21.     wc.cbClsExtra    = 0;
  22.     wc.cbWndExtra    = 0;
  23.     wc.hInstance     = NULL;
  24.     wc.hIcon         = NULL;
  25.     wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
  26.     wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
  27.     wc.lpszMenuName  = NULL;
  28.     wc.lpszClassName = NULL;
  29.     wc.hIconSm       = NULL;
  30. }
  31. void KD3DWindow::OnDraw( HDC hDC )
  32. {
  33.     //先用D3D设备渲染
  34.     Render();
  35.     //用Windows API在屏幕上绘图
  36.     TextOut(hDC, 0, 0, szHint, lstrlen(szHint));
  37. }
  38. void KD3DWindow::OnKeyDown( WPARAM wParam, LPARAM lParam )
  39. {
  40.     if (wParam==VK_ESCAPE )
  41.     {
  42.         PostMessage(m_hWnd, WM_CLOSE, 0, 0);
  43.     }
  44. }
  45. // 初始化D3D
  46. HRESULT KD3DWindow::InitD3D( HWND hWnd )
  47. {
  48.     //如果还没有窗口,返回失败啦
  49.     if( m_hWnd == NULL)
  50.         return E_FAIL;
  51.     // 创建D3D对象
  52.     if( NULL == ( g_pD3D = Direct3DCreate8( D3D_SDK_VERSION ) ) )
  53.         return E_FAIL;
  54.     // 获取当前的显示模式
  55.     D3DDISPLAYMODE d3ddm;
  56.     if( FAILED( g_pD3D->GetAdapterDisplayMode( D3DADAPTER_DEFAULT, &d3ddm ) ) )
  57.         return E_FAIL;
  58.     D3DPRESENT_PARAMETERS d3dpp; 
  59.     ZeroMemory( &d3dpp, sizeof(d3dpp) );
  60.     d3dpp.Windowed = TRUE;              // 窗口模式
  61.     d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;   // 设置交换模式
  62.     d3dpp.BackBufferFormat = d3ddm.Format;      // 设置背景缓冲区格式为当前左面格式
  63.     // 创建D3D设备
  64.     // 第一个参数:使用默认的显卡
  65.     // 第二个参数:请求使用硬件抽象层(HAL)
  66.     // 第三个参数:窗口句柄
  67.     // 第四个参数:使用软件处理顶点
  68.     // 第五个参数:创建的参数
  69.     // 第六个参数:创建的D3D设备指针
  70.     if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, 
  71.                       D3DDEVTYPE_HAL, 
  72.                       hWnd,
  73.                       D3DCREATE_SOFTWARE_VERTEXPROCESSING,
  74.                       &d3dpp, 
  75.                       &g_pd3dDevice ) ) )
  76.     {
  77.         return E_FAIL;
  78.     }
  79.     return S_OK;
  80. }
  81. // 释放D3D
  82. void KD3DWindow::Cleanup()
  83. {
  84.     if( g_pd3dDevice != NULL) 
  85.         g_pd3dDevice->Release();
  86.     if( g_pD3D != NULL)
  87.         g_pD3D->Release();
  88. }
  89. // 渲染
  90. void KD3DWindow::Render()
  91. {
  92.     if( NULL == g_pd3dDevice )
  93.         return;
  94.     // 清除背景为兰色
  95.     g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,255), 1.0f, 0 );
  96.     // 绘制场景
  97.     g_pd3dDevice->BeginScene();
  98.     // 这里绘制你需要的东西
  99.     // 结束绘制
  100.     g_pd3dDevice->EndScene();
  101.     // 显示到屏幕上
  102.     g_pd3dDevice->Present( NULL, NULL, NULL, NULL );
  103. }
  104. KD3DWindow::KD3DWindow()
  105. {
  106. }
  107. KD3DWindow::~KD3DWindow()
  108. {
  109.     Cleanup();
  110. }
  111. bool KD3DWindow::CreateEx(DWORD dwExStyle,
  112.         LPCTSTR lpszClass, LPCTSTR lpszName, DWORD dwStyle,
  113.         int x, int y, int nWidth, int nHeight, HWND hParent,
  114.         HMENU hMenu, HINSTANCE hInst)
  115. {
  116.     //创建窗口
  117.     bool bRet = KWindow::CreateEx(dwExStyle,lpszClass,lpszName,dwStyle,x,y,nWidth,nHeight,hParent,hMenu,hInst);
  118.     //初始化D3D设备
  119.     if( InitD3D(m_hWnd) != S_OK)
  120.         bRet = false;
  121.     return bRet;
  122. }

  代码关键地方都有注释,也很好理解的。

  然后就是主函数如何调用了,请看:

  1. int APIENTRY WinMain(HINSTANCE hInstance,
  2.                      HINSTANCE hPrevInstance,
  3.                      LPSTR     lpCmdLine,
  4.                      int       nCmdShow)
  5. {
  6.     // TODO: Place code here.
  7.     KD3DWindow win;
  8.     //KHelloWindow win; 
  9.     win.CreateEx(0, _T("Hello"), _T("Hello"), WS_OVERLAPPEDWINDOW, GetSystemMetrics(SM_CXSCREEN)/4, GetSystemMetrics(SM_CYSCREEN)/4,
  10.         GetSystemMetrics(SM_CXSCREEN)/2,
  11.         GetSystemMetrics(SM_CYSCREEN)/2,
  12.         NULL, NULL, hInstance);
  13.     win.ShowWindow(nCmdShow);
  14.     win.UpdateWindow();
  15.     return win.MessageLoop();
  16. }

  编译运行后,可以看到程序既有D3D渲染的背景场景,也有Win32 GDI绘制的文字。如下所示:

D3D初学入门一(配置开发环境及绘制D3D窗口)_第3张图片

本文来自
http://blog.csdn.net/zxcred

你可能感兴趣的:(游戏,api,C#,null,UML,tools)