注册 | 登录

游侠NETSHOW论坛





游侠NETSHOW论坛 游侠NETSHOW论坛 游侠汉化区 BlankDTX9Window - DirectX9c 程序的模板
查看: 3006|回复: 4
打印 上一主题 下一主题

[原创] BlankDTX9Window - DirectX9c 程序的模板 [复制链接]

天邈汉化组技术

战略游戏工作组专长成就勋章

帖子
606
精华
2
积分
983
金钱
4366
荣誉
28
人气
1
评议
0
跳转到指定楼层
楼主
发表于 2009-3-12 20:38:29 |只看该作者 |倒序浏览
这篇文章的内容是 DirectX 编程中最简单的,在这里拿出来是因为,在游戏汉化中有必要知道一些 DirectX 编程知识.
注释比较详尽,有不妥支持还望前辈们指正.
  1. //DTXWindow.h
  2. /**
  3. * 程序名: DirectX9 空白实例
  4. * 版本: 1.0
  5. * 作者: Suwnayking
  6. * Blog: http://sunwayking.cnblogs.com/
  7. * QQ: 410109674
  8. * Email: sunwayking@163.com
  9. * 制作日期: 2009-03-12    18:32:03
  10. * 功能描述:
  11. +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  12. 1. 适合做为任何 DirectX9 游戏或程序的编写起点;
  13. 2. 附带了详尽的注释,适合Win32编程初学者和DirectX编程初学者自学.
  14. +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  15. * 版权信息: 本代码开源,转载请注明作者及出处,谢谢!
  16. **/

  17. // define 定义
  18. #define CLASS_NAME "BlankDTX9Window"
  19. #define WINDOW_NAME "BlankDTX9Window"
  20. #define WINDOW_WIDTH    640
  21. #define WINDOW_HEIGHT   480

  22. // 引用头文件
  23. #include<d3d9.h>
  24. #include<d3dx9.h>

  25. // 引用库文件
  26. #pragma comment(lib, "d3d9.lib")
  27. #pragma comment(lib, "d3dx9.lib")

  28. // 应用程序句柄
  29. HINSTANCE hInstance=NULL;
  30. // 主窗口句柄
  31. HWND hWnd=NULL;
  32. // 定义Direct3D 对象
  33. LPDIRECT3D9 g_D3D = NULL;
  34. // 定义Direct3D 设备
  35. LPDIRECT3DDEVICE9 g_D3DDevice = NULL;
  36. // 定义D3DXFONT 对象(字体对象),和一个RECT对象(描述文本的绘制区域)
  37. LPD3DXFONT g_Font=NULL;
  38. RECT g_FontPosition={0,0,0,0};


  39. // 预声明各个函数
  40. LRESULT WINAPI WndProc(HWND,UINT,WPARAM,LPARAM);
  41. BOOL InitializeD3D(HWND,BOOL);
  42. void RenderScene();
  43. void DisposeD3D();
  44. BOOL InitializeObjects();
复制代码
  1. //DTXWindow.cpp
  2. /**
  3.   * 程序名: DirectX9 空白实例
  4.   * 版本: 1.0
  5.   * 作者: Suwnayking
  6.   * Blog: http://sunwayking.cnblogs.com/
  7.   * QQ: 410109674
  8.   * Email: sunwayking@163.com
  9.   * 制作日期: 2009-03-12    18:32:03
  10.   * 功能描述:
  11.   +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  12.   1. 适合做为任何 DirectX9 游戏或程序的编写起点;
  13.   2. 附带了详尽的注释,适合Win32编程初学者和DirectX编程初学者自学.
  14.   +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  15.   * 版权信息: 本代码开源,转载请注明作者及出处,谢谢!
  16.   **/

  17. #include "DTXWindow.h"

  18. // Win 程序主函数(程序入口函数)
  19. int WINAPI WinMain(HINSTANCE hInst, HINSTANCE prevhInst, LPSTR cmdLine, int show)
  20. {
  21.     hInstance=hInst;// 保存应用程序句柄

  22.     WNDCLASSEX wc;// 声明窗体类并初始化
  23.     wc.cbSize=sizeof(WNDCLASSEX);// 通常情况下,只要将此参数设置为sizeof(WNDCLASSEX)即可,如果程序中用到了GetClassInfoEx函数,那么在使用前请一定先设置cbSize的值,
  24.     wc.style=CS_CLASSDC;// 指定一个样式,它的值可以是窗口样式的任意组合
  25.     wc.lpfnWndProc=WndProc;// 此参数为指定一个窗口过程的回调函数
  26.     wc.cbClsExtra=0;// 指定一个数值,记录窗口类额外的信息,默认为0
  27.     wc.cbWndExtra=0;// 指定一个数值,记录窗口实例的额外信息,默认为0;如果程序使用WNDCLASSEX注册一个从资源文件里创建的对话框,则此参数必须设置为DLGWINDOWEXTRA,这里我也将其设置为0
  28.     wc.hInstance=hInst;// 应用程序句柄
  29.     wc.hIcon=NULL;// 窗口类的图标,此参数ICON资源句柄,如果设置为NULL,操作系统将提供一个默认的图标,这里可以自己指定一个ICON,如LoadIcon(NULL,MAKEINTRESOURCE(IDI_QUESTION));
  30.     wc.hCursor=NULL;// 窗口类的鼠标样式,同样,该参数为指向CURSOR资源的句柄,如果为NULL,则当任何时候鼠标进入窗口区域时必须明确指定鼠标形状
  31.     wc.hbrBackground=NULL;// 背景刷的句柄,即可以指向物理笔刷又可以为一个颜色值,该值必须为标准系统颜色;当使用UnregisterClass函数注销一个窗口类的时候,系统会自动删除该类的笔刷,程序运行中不可删除.如果此成员值为NULL,那么在必要的时候客户端必须自己执行渲染.确认什么时候渲染背景,你可通过BeginPaint函数提取WM_E流氓软件王EBKGND 消息或测试PAINTSTRUCT结构中fE流氓软件王e的值
  32.     wc.lpszMenuName=NULL;// 指向一个以NULL结尾的字符串,同资源中的名字一样,作为窗口菜单的名字.如果要使用整型ID标识菜单,可以使用MAKEINTRESOURCE定义一个宏.如果它的值为NULL,那么该类创建的窗口将都没有默认的菜单
  33.     wc.lpszClassName=CLASS_NAME;// 窗口类的名字,我们可以随便取,值类型为一个字符串
  34.     wc.hIconSm=NULL;// 在任务栏时的图标,值设置同hIcon

  35.     // 注册窗体类
  36.     RegisterClassEx(
  37.         &wc
  38.         );

  39.     // 创建窗体
  40.     hWnd=CreateWindow(
  41.         CLASS_NAME,
  42.         WINDOW_NAME,
  43.         WS_OVERLAPPEDWINDOW,
  44.         100,
  45.         100,
  46.         WINDOW_WIDTH,
  47.         WINDOW_HEIGHT,
  48.         NULL,
  49.         NULL,
  50.         hInst,
  51.         NULL
  52.         );// 保存主窗口句柄

  53.     // 初始化D3D
  54.     if(FAILED(InitializeD3D(hWnd,FALSE)))
  55.         return 0;

  56.     // 显示窗体
  57.     ShowWindow(
  58.         hWnd,
  59.         SW_SHOWDEFAULT
  60.         );
  61.     // 刷新窗体
  62.     UpdateWindow(
  63.         hWnd
  64.         );

  65.     MSG msg;
  66.     ZeroMemory(
  67.         &msg,
  68.         sizeof(MSG)
  69.         );
  70.     while(msg.message!=WM_QUIT)
  71.     {
  72.         if (PeekMessage(// 从消息队列中获取下一条消息
  73.             &msg,
  74.             NULL,
  75.             0,
  76.             0,
  77.             PM_REMOVE
  78.             ))
  79.         {
  80.             TranslateMessage(// 转换消息
  81.                 &msg
  82.                 );
  83.             DispatchMessage(// 将消息发送到消息过程函数
  84.                 &msg
  85.                 );
  86.         }
  87.         else
  88.         {
  89.             // 绘制并显示D3D场景
  90.             RenderScene();
  91.         }
  92.     }

  93.     // 释放所有D3D对象
  94.     void DisposeD3D();

  95.     UnregisterClass(
  96.         CLASS_NAME,
  97.         wc.hInstance
  98.         );
  99. }

  100. // 窗体过程函数
  101. LRESULT WINAPI WndProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
  102. {
  103.     switch(msg)
  104.     {
  105.     case WM_DESTROY:
  106.         PostQuitMessage(
  107.             0
  108.             );
  109.         return 0;
  110.         break;
  111.     }
  112.     return DefWindowProc(
  113.         hWnd,
  114.         msg,
  115.         wParam,
  116.         lParam
  117.         );
  118. }

  119. // 初始化D3D设备
  120. BOOL InitializeD3D(HWND hWnd,BOOL bFullscreen)
  121. {
  122.     D3DDISPLAYMODE displaymode;

  123.     // 创建D3D对象
  124.     g_D3D=Direct3DCreate9(
  125.         D3D_SDK_VERSION
  126.         );
  127.     if (g_D3D==NULL)
  128.     {
  129.         return FALSE;
  130.     }

  131.     // 获取桌面显示模式
  132.     if (FAILED(g_D3D->GetAdapterDisplayMode(
  133.         D3DADAPTER_DEFAULT,
  134.         &displaymode
  135.         )))
  136.     {
  137.         return FALSE;
  138.     }

  139.     // 设置用来创建D3D设备的结构体
  140.     D3DPRESENT_PARAMETERS d3dpp;
  141.     ZeroMemory(
  142.         &d3dpp,
  143.         sizeof(D3DPRESENT_PARAMETERS
  144.         ));

  145.     if (bFullscreen)
  146.     {
  147.         d3dpp.Windowed=FALSE;
  148.         d3dpp.BackBufferWidth=WINDOW_WIDTH;
  149.         d3dpp.BackBufferHeight=WINDOW_HEIGHT;
  150.     }
  151.     else
  152.     {
  153.         d3dpp.Windowed=TRUE;
  154.     }
  155.     d3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD;
  156.     d3dpp.BackBufferFormat=displaymode.Format;

  157.     // 创建D3D设备
  158.     if(FAILED(g_D3D->CreateDevice(
  159.         D3DADAPTER_DEFAULT,
  160.         D3DDEVTYPE_HAL,
  161.         hWnd,
  162.         D3DCREATE_HARDWARE_VERTEXPROCESSING,
  163.         &d3dpp,
  164.         &g_D3DDevice
  165.         )))
  166.     {
  167.         return FALSE;
  168.     }

  169.     if(FAILED(InitializeObjects()))
  170.     {
  171.         return FALSE;
  172.     }

  173.     return TRUE;
  174. }

  175. // 绘制并显示场景
  176. void RenderScene()
  177. {
  178.     // 清除后台缓冲
  179.     g_D3DDevice->Clear(
  180.         0,
  181.         NULL,
  182.         D3DCLEAR_TARGET,
  183.         D3DCOLOR_XRGB(255,255,255),
  184.         1.0f,
  185.         0
  186.         );

  187.     // 初始化场景,开始绘制
  188.     g_D3DDevice->BeginScene();

  189.     // TODO: 写入自己的场景绘制代码
  190.     // 设置文本绘制位置,并绘制文本
  191.     g_FontPosition.top = 150;
  192.     g_Font->DrawText(
  193.         NULL,
  194.         "~DirectX 9.0c~",
  195.         -1,
  196.         &g_FontPosition,
  197.         DT_CENTER,
  198.         D3DCOLOR_XRGB(0,0,0)
  199.         );

  200.     // 结束场景,停止绘制
  201.     g_D3DDevice->EndScene();

  202.     // 显示场景
  203.     g_D3DDevice->Present(
  204.         NULL,
  205.         NULL,
  206.         NULL,
  207.         NULL
  208.         );
  209. }

  210. // 释放D3D对象
  211. void DisposeD3D()
  212. {
  213.     if (g_D3DDevice!=NULL)
  214.     {
  215.         g_D3DDevice->Release();
  216.     }
  217.     if (g_D3D!=NULL)
  218.     {
  219.         g_D3D->Release();
  220.     }
  221.     if (g_Font!=NULL)
  222.     {
  223.         g_Font->Release();
  224.     }
  225.     g_D3DDevice=NULL;
  226.     g_D3D=NULL;
  227.     g_Font=NULL;
  228. }

  229. // 初始化D3D对象
  230. BOOL InitializeObjects()
  231. {
  232.     // 创建D3D字体对象
  233.     if (FAILED(D3DXCreateFont(g_D3DDevice,
  234.         36,
  235.         0,
  236.         0,
  237.         1,
  238.         FALSE,
  239.         DEFAULT_CHARSET,
  240.         OUT_TT_ONLY_PRECIS,
  241.         DEFAULT_QUALITY,
  242.         DEFAULT_PITCH | FF_DONTCARE,
  243.         "微软雅黑",
  244.         &g_Font
  245.         )))
  246.     {
  247.         return FALSE;
  248.     }

  249.     // 设置文本绘制的区域
  250.     GetClientRect(hWnd,&g_FontPosition);
  251.     return TRUE;
  252. }
复制代码
作者: Sunwayking

参考资料:
DirectX SDK Document
Ultimate Game Programming with DirectX  (American)Allen Sherrod


PS: 代码大家将就的看吧,语法没加高亮,大家累眼了.如果想要看有语法高亮的代码请到 我的cnblogs 去看: http://www.cnblogs.com/Sunwayking/articles/1409930.html

[ 本帖最后由 sunwayking 于 2009-3-12 20:55 编辑 ]
爱机:
CPU: intel Q9450
主板: 玩家国度II NF790i Ultra
内存: DDR3 4GB
显卡: Geforce 9800GTX SLI

使用道具 举报

天邈汉化组技术

战略游戏工作组专长成就勋章

帖子
606
精华
2
积分
983
金钱
4366
荣誉
28
人气
1
评议
0
沙发
发表于 2009-3-12 20:57:36 |只看该作者
这个空白实例跟《Ultimate Game Programming with DirectX》上的99%是一样的.
爱机:
CPU: intel Q9450
主板: 玩家国度II NF790i Ultra
内存: DDR3 4GB
显卡: Geforce 9800GTX SLI

使用道具 举报

天邈汉化组特邀
Left ④ Dead☆最爱WitchのAK-47
空军士官

帖子
2418
精华
1
积分
1599
金钱
4766
荣誉
19
人气
0
评议
0

板凳
发表于 2009-3-13 23:34:47 |只看该作者
哈哈,程序跟openGL空白窗口很是想象啊。。。。

原来不当斑竹。。。这个地方都不给放图片了啊。。。。

使用道具 举报

天邈汉化组技术

战略游戏工作组专长成就勋章

帖子
606
精华
2
积分
983
金钱
4366
荣誉
28
人气
1
评议
0
地板
发表于 2009-3-13 23:47:51 |只看该作者

回复 #3 萧萧风兮 的帖子

呵呵,据说DTX比openGL麻烦点.
爱机:
CPU: intel Q9450
主板: 玩家国度II NF790i Ultra
内存: DDR3 4GB
显卡: Geforce 9800GTX SLI

使用道具 举报

新秀主力组织后卫 火箭

帖子
628
精华
0
积分
335
金钱
983
荣誉
2
人气
0
评议
0
5#
发表于 2009-6-12 18:20:55 |只看该作者
太牛X了···膜拜····
I believe I can fly.I believe I can touch the sky!

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

手机版|Archiver|游侠NETSHOW论坛 ( 苏ICP备2023007791号 )

GMT+8, 2025-9-29 04:49 , Processed in 0.338078 second(s), 12 queries , Gzip On, Memcache On.

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

分享到