31. //鼠标滚轮,为观察点收缩操作
32. fPosZ += g_diMouseState.lZ * 0.02f; 33. 34.
35. // 平移物体
36. if (g_pKeyStateBuffer[DIK_A] & 0x80) fPosX -= 0.005f; 37. if (g_pKeyStateBuffer[DIK_D] & 0x80) fPosX += 0.005f; 38. if (g_pKeyStateBuffer[DIK_W] & 0x80) fPosY += 0.005f; 39. if (g_pKeyStateBuffer[DIK_S] & 0x80) fPosY -= 0.005f; 40. 41. 42. 43.
44. D3DXMatrixTranslation(&g_matWorld, fPosX, fPosY, fPosZ); 45. 46. 47. 48.
49. // 按住鼠标右键并拖动,为旋转操作
50. static float fAngleX = 0.15f, fAngleY = -(float)D3DX_PI ; 51. if (g_diMouseState.rgbButtons[1] & 0x80) 52. {
53. fAngleX += g_diMouseState.lY * -0.01f; 54. fAngleY += g_diMouseState.lX * -0.01f; 55. }
56. // 旋转物体
57. if (g_pKeyStateBuffer[DIK_UP] & 0x80) fAngleX += 0.005f;
58. if (g_pKeyStateBuffer[DIK_DOWN] & 0x80) fAngleX -= 0.005f;
59. if (g_pKeyStateBuffer[DIK_LEFT] & 0x80) fAngleY -= 0.005f;
60. if (g_pKeyStateBuffer[DIK_RIGHT] & 0x80) fAngleY += 0.005f;
61. 62. 63. 64.
65. D3DXMATRIX Rx, Ry;
66. D3DXMatrixRotationX(&Rx, fAngleX); 67. D3DXMatrixRotationY(&Ry, fAngleY); 68. 69.
70. g_matWorld = Rx * Ry * g_matWorld;
71. g_pd3dDevice->SetTransform(D3DTS_WORLD, &g_matWorld); 72. Matrix_Set(); 73. }
嗯,讲解完成,下面我们就贴出完整的详细注释的demo的源代码:
[cpp] view plaincopyprint?
1. //***************************************************************
************************** 2. //
3. //【Visual C++】游戏开发笔记系列配套源码 四十二 浅墨DirectX教程之十 游戏
输入控制利器 : DirectInput专场 4. // VS2010版
5. // 2012年 1月27日 Create by 浅墨 6. //图标及图片素材: 《仙剑奇侠传五前传》 瑕 7. //此刻心情:既然选择了远方,便只顾风雨兼程 8. //
9. //***************************************************************
************************** 10. 11.
12. //**************************************************************
*************************** 13. // Desc: 宏定义部分
14. //**************************************************************
***************************
15. #define SCREEN_WIDTH 800 //为窗口宽度定义的
宏,以方便在此处修改窗口宽度
16. #define SCREEN_HEIGHT 600 //为窗口高度定
义的宏,以方便在此处修改窗口高度
17. #define WINDOW_TITLE _T(\【Visual C++游戏开发笔记】博文配套demo之
四十二 浅墨DirectX教程之十 游戏输入控制利器 : DirectInput专场\为窗口标题定义的宏
18. #define DIRECTINPUT_VERSION 0x0800 //指定DirectInput版本,防止
DIRECTINPUT_VERSION undefined警告
19. #define SAFE_RELEASE(p) { if(p) { (p)->Release(); (p)=NULL; } }
//自定义一个SAFE_RELEASE()宏,便于COM资源的释放
20. #define SAFE_DELETE(p) { if(p) { delete (p); (p)=NULL; } } 21.
22.
23. //**************************************************************
*************************** 24. // Desc: 头文件定义部分
25. //**************************************************************
*************************** 26. #include
30. #include
文件,注意这里没有8 31. 32. 33. 34.
35. //**************************************************************
*************************** 36. // Desc: 库文件定义部分
37. //**************************************************************
*************************** 38. #pragma comment(lib,\ 39. #pragma comment(lib,\
40. #pragma comment(lib, \使用DirectInput必须包含
的头文件,注意这里有8
41. #pragma comment(lib,\ 42. #pragma comment(lib, \ 43. 44. 45. 46. 47.
48. //**************************************************************
*************************** 49. // Desc: 全局变量声明部分
50. //**************************************************************
***************************
51. LPDIRECT3DDEVICE9 g_pd3dDevice = NULL; //Direct3D设备对象 52. LPD3DXFONT g_pTextFPS =NULL; //
字体COM接口
53. LPD3DXFONT g_pTextAdaperName = NULL; //
显卡信息的2D文本
54. LPD3DXFONT g_pTextHelper = NULL; // 帮助信
息的2D文本
55. LPD3DXFONT g_pTextInfor = NULL; // 绘制信
息的2D文本
56. float g_FPS = 0.
0f; //一个浮点型的变量,代表帧速率
57. wchar_t g_strFPS[50]={0}; //包含帧速率的字符数
组
58. wchar_t g_strAdapterName[60]={0}; //包含显卡名称的字
符数组 59.
60. LPDIRECTINPUT8 g_pDirectInput = NULL; // 61. LPDIRECTINPUTDEVICE8 g_pMouseDevice = NULL; 62. DIMOUSESTATE g_diMouseState = {0}; 63. LPDIRECTINPUTDEVICE8 g_pKeyboardDevice = NULL; 64. char g_pKeyStateBuffer[256] = {0}; 65. D3DXMATRIX g_matWorld; //世界矩阵 66.
67. LPD3DXMESH g_pMesh = NULL; // 网格的对象
68. D3DMATERIAL9* g_pMaterials = NULL; // 网格的材质信息 69. LPDIRECT3DTEXTURE9* g_pTextures = NULL; // 网格的纹理信息 70. DWORD g_dwNumMtrls = 0; // 材质的数目 71.
72. //**************************************************************
*************************** 73. // Desc: 全局函数声明部分
74. //**************************************************************
***************************
75. LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wPa
ram, LPARAM lParam );
76. HRESULT Direct3D_Init(HWND hwnd,HINSTANCE hInstance)
;
77. HRESULT Objects_Init();
78. void Direct3D_Render( HWND hwnd); 79. void Direct3D_Update( HWND hwnd); 80. void Direct3D_CleanUp( ); 81. float Get_FPS(); 82. void Matrix_Set();
83. BOOL Device_Read(IDirectInputDevice8 *pDIDevice, void* pBuffer,
long lSize) ; 84. 85.
86. //**************************************************************
***************************
87. // Name: WinMain( )
88. // Desc: Windows应用程序入口函数
89. //**************************************************************
***************************
90. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nShowCmd) 91. { 92.
93. //开始设计一个完整的窗口类
94. WNDCLASSEX wndClass = { 0 }; //用WINDCLASSEX
定义了一个窗口类,即用wndClass实例化了WINDCLASSEX,用于之后窗口的各项初始化
95. wndClass.cbSize = sizeof( WNDCLASSEX ) ; //设置结构体的字节
数大小
96. wndClass.style = CS_HREDRAW | CS_VREDRAW; //设置窗口的样式 97. wndClass.lpfnWndProc = WndProc; //设置指向窗口过程
函数的指针
98. wndClass.cbClsExtra = 0; 99. wndClass.cbWndExtra = 0; 100. 101.
wndClass.hInstance = hInstance; //指定包含窗口 wndClass.hIcon=(HICON)::LoadImage(NULL,_T(\),IMA
过程的程序的实例句柄。
GE_ICON,0,0,LR_DEFAULTSIZE|LR_LOADFROMFILE); //从全局的::LoadImage函数从本地加载自定义ico图标 102. 103.
wndClass.hCursor = LoadCursor( NULL, IDC_ARROW ); //指 wndClass.hbrBackground=(HBRUSH)GetStockObject(GRAY_BRUSH)定窗口类的光标句柄。
; //为hbrBackground成员指定一个灰色画刷句柄 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114.
wndClass.lpszMenuName = NULL; //用一 wndClass.lpszClassName = _T(\);
if( !RegisterClassEx( &wndClass ) ) //设计完窗 return -1;
HWND hwnd = CreateWindow( _T(\), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, SC SCREEN_HEIGHT, NULL, NULL, hInstance, NULL );
个以空终止的字符串,指定菜单资源的名字。
//用一个以空终止的字符串,指定窗口类的名字。
口后,需要对窗口类进行注册,这样才能创建该类型的窗口
WINDOW_TITLE, //喜闻乐见的创建窗口函数CreateWindow REEN_WIDTH,