国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

DirectInput---輸入輸出控制利器

2019-11-10 23:09:25
字體:
來源:轉載
供稿:網友

D3DUtil.h

//=============================================================================// Desc: D3DUtil.h頭文件,用于公共輔助宏的定義// 2013年 2月03日 Create by 淺墨 //=============================================================================#PRagma once#ifndef HR#define HR(x) { hr = x; if( FAILED(hr) ) { return hr; } } //自定義一個HR宏,方便執行錯誤的返回#endif#ifndef SAFE_DELETE #define SAFE_DELETE(p) { if(p) { delete (p); (p)=NULL; } } //自定義一個SAFE_RELEASE()宏,便于指針資源的釋放#endif #ifndef SAFE_RELEASE #define SAFE_RELEASE(p) { if(p) { (p)->Release(); (p)=NULL; } } //自定義一個SAFE_RELEASE()宏,便于COM資源的釋放#endif

DirectInputClass.h

//=============================================================================// Name: DirectInputClass.h// Des: 封裝了DirectInput鍵盤輸入處理類的頭文件// 2013年 2月03日 Create by 淺墨 //=============================================================================#pragma once#include "D3DUtil.h"#define DIRECTINPUT_VERSION 0x0800#include <dinput.h>//DInputClass類定義開始class DInputClass{private: IDirectInput8 * m_pDirectInput; //IDirectInput8接口對象 IDirectInputDevice8 * m_KeyboardDevice; //鍵盤設備接口對象 char m_keyBuffer[256]; //用于鍵盤鍵值存儲的數組 IDirectInputDevice8 *m_MouseDevice; //鼠標設備接口對象 DIMOUSESTATE m_MouseState; //用于鼠標鍵值存儲的一個結構體public: HRESULT Init( HWND hWnd,HINSTANCE hInstance,DWord keyboardCoopFlags, DWORD mouseCoopFlags ); //初始化DirectInput鍵盤及鼠標輸入設備 void GetInput(); //用于獲取輸入信息的函數 bool IsKeyDown(int iKey); //判斷鍵盤上某鍵是否按下 bool IsMouseButtonDown(int button); //判斷鼠標按鍵是否被按下 float MouseDX(); //返回鼠標的X軸坐標值 float MouseDY(); //返回鼠標的Y軸坐標值 float MouseDZ(); //返回鼠標的Z軸坐標值public: DInputClass(void); //構造函數 ~DInputClass(void); //析構函數};

DirectInputClass.cpp

//=============================================================================// Desc: DirectInput鍵盤輸入處理類源文件// 2013年 2月03日 Create by 淺墨 //=============================================================================#include "DirectInputClass.h"http://-----------------------------------------------------------------------------// Desc: 構造函數//-----------------------------------------------------------------------------DInputClass::DInputClass(){ m_pDirectInput = NULL; m_KeyboardDevice = NULL; ZeroMemory(m_keyBuffer,sizeof(char)*256); m_MouseDevice= NULL; ZeroMemory(&m_MouseState, sizeof(m_MouseState));}//-----------------------------------------------------------------------------// Name:DInputClass::Init()// Desc: 初始化DirectInput鍵盤及鼠標輸入設備//-----------------------------------------------------------------------------HRESULT DInputClass::Init( HWND hWnd,HINSTANCE hInstance,DWORD keyboardCoopFlags, DWORD mouseCoopFlags ){ //-------------------------------------------------------------------------------------- // 【DirectInput使用五步曲第一步】:創設備,創建DirectInput接口和設備 //-------------------------------------------------------------------------------------- HRESULT hr; //初始化一個IDirectInput8接口對象 //hInstance: 當前創建的DirectInput的Windows程序句柄,填WinMain函數的參數中的實例句柄即可 //DIRECTINPUT_VERSION: 當前使用的DirectInput版本號 //IID_IDirectInput8: 接口的標志,通常為IID_IDirectInput8 //m_pDirectInput: 返回新創建的IDirectInput8對象指針 //NULL: 和COM對象接口相關的參數,通常為NULL HR(DirectInput8Create( hInstance, DIRECTINPUT_VERSION, IID_IDirectInput8, (void**)&m_pDirectInput, NULL )); //進行鍵盤設備的初始化 //GUID_SysKeyboard: 鍵盤的GUID //m_KeyboardDevice: 所創建的輸入設備對象的指針地址 //NULL: 接口參數,一般為NULL HR( m_pDirectInput->CreateDevice( GUID_SysKeyboard, &m_KeyboardDevice, NULL )); //創建設備 //-------------------------------------------------------------------------------------- // 【DirectInput使用五步曲第二步】:設格式,設置數據格式和協作級別 //-------------------------------------------------------------------------------------- //hWnd: 想要與當前設備相關聯的窗口句柄,且這個窗口屬于當前進程的頂級窗口 //keyboardCoopFlags: 當前設備的協作級別類型,前臺、后臺模式和共享、獨占模式等 //如取值為DISCL_FOREGROUND | DISCL_NONEXCLUSIVE,表示協作級別為 前臺模式|共享模式 HR( m_KeyboardDevice->SetCoOperativeLevel( hWnd, keyboardCoopFlags)); //設置協作級別 HR( m_KeyboardDevice->SetDataFormat( &c_dfDIKeyboard )); //設置數據格式,標準鍵盤結構 //-------------------------------------------------------------------------------------- // 【DirectInput使用五步曲第三步】:拿權力,獲取設備控制權 //-------------------------------------------------------------------------------------- HR( m_KeyboardDevice->Acquire( )); //獲得輸入設備的控制權 HR( m_KeyboardDevice->Poll( )); //輪詢,在合適的情況下讀取設備 //進行鼠標設備的初始化 HR( m_pDirectInput->CreateDevice( GUID_SysMouse, &m_MouseDevice, NULL )); HR( m_MouseDevice->SetCooperativeLevel( hWnd, mouseCoopFlags)); HR( m_MouseDevice->SetDataFormat( &c_dfDIMouse )); HR( m_MouseDevice->Acquire( )); HR( m_KeyboardDevice->Poll( )); return S_OK;}//-----------------------------------------------------------------------------// Name:DInputClass::GetInput()// Desc: 用于獲取輸入信息的函數//-----------------------------------------------------------------------------void DInputClass::GetInput(){ //-------------------------------------------------------------------------------------- // 【DirectInput使用五步曲第四步】:取按鍵,獲取按鍵情況并做響應 //-------------------------------------------------------------------------------------- //讀取設備信息 //sizeof(m_keyBuffer): 緩沖區的大小 //m_keyBuffer: 獲取當前設備狀態的結構體的地址值 HRESULT hr = m_KeyboardDevice->GetDeviceState(sizeof(m_keyBuffer), (void**)&m_keyBuffer); //獲取鍵盤輸入消息 if(hr) { m_KeyboardDevice->Acquire(); m_KeyboardDevice->GetDeviceState( sizeof(m_keyBuffer), (LPVOID)m_keyBuffer ); } hr = m_MouseDevice->GetDeviceState(sizeof(DIMOUSESTATE), (void**)&m_MouseState); //獲取鼠標輸入消息 if(hr) { m_MouseDevice->Acquire(); m_MouseDevice->GetDeviceState( sizeof(DIMOUSESTATE), (void**)&m_MouseState); }}//-----------------------------------------------------------------------------// Name:DInputClass::IsKeyDown()// Desc: 判斷鍵盤上某個鍵是否按下//-----------------------------------------------------------------------------//--------------------------------------------------------------------------------------// 【DirectInput使用五步曲第四步】:取按鍵,獲取按鍵情況并做響應//--------------------------------------------------------------------------------------bool DInputClass::IsKeyDown(int iKey){ if(m_keyBuffer[iKey] & 0x80) return true; else return false;}//-----------------------------------------------------------------------------// Name:DInputClass::IsMouseButtonDown()// Desc: 判斷鼠標上某鍵是否按下//-----------------------------------------------------------------------------//--------------------------------------------------------------------------------------// 【DirectInput使用五步曲第四步】:取按鍵,獲取按鍵情況并做響應//--------------------------------------------------------------------------------------bool DInputClass::IsMouseButtonDown(int button){ //rgbButtons[0]:鼠標左鍵 //rgbButtons[1]:鼠標右鍵 return (m_MouseState.rgbButtons[button] & 0x80) != 0;}//-----------------------------------------------------------------------------// Name:DInputClass::MouseDX// Desc: 返回鼠標指針的X軸坐標值//-----------------------------------------------------------------------------float DInputClass::MouseDX(){ return (float)m_MouseState.lX;}//-----------------------------------------------------------------------------// Name:DInputClass::MouseDY// Desc: 返回鼠標指針的Y軸坐標值//-----------------------------------------------------------------------------float DInputClass::MouseDY(){ return (float)m_MouseState.lY;}//-----------------------------------------------------------------------------// Name:DInputClass::MouseDZ// Desc: 返回鼠標指針的Z軸坐標值(滾輪)//-----------------------------------------------------------------------------float DInputClass::MouseDZ(){ return (float)m_MouseState.lZ;}//-----------------------------------------------------------------------------// Desc: 析構函數//-----------------------------------------------------------------------------DInputClass::~DInputClass(void){ //-------------------------------------------------------------------------------------- // 【DirectInput使用五步曲第五步】:釋對象,釋放控制權和接口對象 //-------------------------------------------------------------------------------------- if(m_KeyboardDevice != NULL) m_KeyboardDevice->Unacquire(); //釋放設備控制權 if(m_MouseDevice != NULL) m_MouseDevice->Unacquire(); SAFE_RELEASE(m_KeyboardDevice); //釋放設備接口對象 SAFE_RELEASE(m_MouseDevice); SAFE_RELEASE(m_pDirectInput);}

main.cpp

//-----------------------------------【程序說明】----------------------------------------------// 程序名稱::D3Ddemo9// 2013年4月 Create by 淺墨// 描述:游戲輸入控制利器 : 對DirectInput的封裝 示例程序// 圖標素材: 《暗黑破壞神》 //------------------------------------------------------------------------------------------------//-----------------------------------【宏定義部分】--------------------------------------------// 描述:定義一些輔助宏//------------------------------------------------------------------------------------------------#define WINDOW_WIDTH 800 //為窗口寬度定義的宏,以方便在此處修改窗口寬度#define WINDOW_HEIGHT 600 //為窗口高度定義的宏,以方便在此處修改窗口高度#define WINDOW_TITLE _T("【致我們永不熄滅的游戲開發夢想】對DirectInput的封裝 示例程序") //為窗口標題定義的宏//-----------------------------------【頭文件包含部分】---------------------------------------// 描述:包含程序所依賴的頭文件//------------------------------------------------------------------------------------------------ #include <d3d9.h>#include <d3dx9.h>#include <tchar.h>#include <time.h> #include "DirectInputClass.h"http://-----------------------------------【庫文件包含部分】---------------------------------------// 描述:包含程序所依賴的庫文件//------------------------------------------------------------------------------------------------#pragma comment(lib,"d3d9.lib")#pragma comment(lib,"d3dx9.lib")#pragma comment(lib, "dinput8.lib") // 使用DirectInput必須包含的頭文件,注意這里有8#pragma comment(lib,"dxguid.lib")#pragma comment(lib, "winmm.lib") //-----------------------------------【全局變量聲明部分】-------------------------------------// 描述:全局變量的聲明//------------------------------------------------------------------------------------------------LPDIRECT3DDEVICE9 g_pd3dDevice = NULL; //Direct3D設備對象LPD3DXFONT g_pTextFPS = NULL; //字體COM接口LPD3DXFONT g_pTextAdaperName = NULL; // 顯卡信息的2D文本LPD3DXFONT g_pTextHelper = NULL; // 幫助信息的2D文本LPD3DXFONT g_pTextInfor = NULL; // 繪制信息的2D文本float g_FPS = 0.0f; //一個浮點型的變量,代表幀速率wchar_t g_strFPS[50]={0}; //包含幀速率的字符數組wchar_t g_strAdapterName[60]={0}; //包含顯卡名稱的字符數組D3DXMATRIX g_matWorld; //世界矩陣DInputClass* g_pDInput = NULL; //一個DInputClass類的指針LPD3DXMESH g_pMesh = NULL; // 網格的對象D3DMATERIAL9* g_pMaterials = NULL; // 網格的材質信息LPDIRECT3DTEXTURE9* g_pTextures = NULL; // 網格的紋理信息DWORD g_dwNumMtrls = 0; // 材質的數目//-----------------------------------【全局函數聲明部分】-------------------------------------// 描述:全局函數聲明,防止“未聲明的標識”系列錯誤//------------------------------------------------------------------------------------------------LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam );HRESULT Direct3D_Init(HWND hwnd,HINSTANCE hInstance);HRESULT Objects_Init();void Direct3D_Render( HWND hwnd);void Direct3D_Update( HWND hwnd);void Direct3D_CleanUp( );float Get_FPS();void Matrix_Set();//-----------------------------------【WinMain( )函數】--------------------------------------// 描述:Windows應用程序的入口函數,我們的程序從這里開始//------------------------------------------------------------------------------------------------int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nShowCmd){ //【1】窗口創建四步曲之一:開始設計一個完整的窗口類 WNDCLASSEX wndClass = { 0 }; //用WINDCLASSEX定義了一個窗口類 wndClass.cbSize = sizeof( WNDCLASSEX ) ; //設置結構體的字節數大小 wndClass.style = CS_HREDRAW | CS_VREDRAW; //設置窗口的樣式 wndClass.lpfnWndProc = WndProc; //設置指向窗口過程函數的指針 wndClass.cbClsExtra = 0; //窗口類的附加內存,取0就可以了 wndClass.cbWndExtra = 0; //窗口的附加內存,依然取0就行了 wndClass.hInstance = hInstance; //指定包含窗口過程的程序的實例句柄。 wndClass.hIcon=(HICON)::LoadImage(NULL,L"icon.ico",IMAGE_ICON,0,0,LR_DEFAULTSIZE|LR_LOADFROMFILE); //本地加載自定義ico圖標 wndClass.hCursor = LoadCursor( NULL, IDC_ARROW ); //指定窗口類的光標句柄。 wndClass.hbrBackground=(HBRUSH)GetStockObject(GRAY_BRUSH); //為hbrBackground成員指定一個白色畫刷句柄 wndClass.lpszMenuName = NULL; //用一個以空終止的字符串,指定菜單資源的名字。 wndClass.lpszClassName = L"ForTheDreamOfGameDevelop"; //用一個以空終止的字符串,指定窗口類的名字。 //【2】窗口創建四步曲之二:注冊窗口類 if( !RegisterClassEx( &wndClass ) ) //設計完窗口后,需要對窗口類進行注冊,這樣才能創建該類型的窗口 return -1; //【3】窗口創建四步曲之三:正式創建窗口 HWND hwnd = CreateWindow( L"ForTheDreamOfGameDevelop",WINDOW_TITLE, //喜聞樂見的創建窗口函數CreateWindow WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, WINDOW_WIDTH, WINDOW_HEIGHT, NULL, NULL, hInstance, NULL ); //Direct3D資源的初始化,調用失敗用messagebox予以顯示 if (!(S_OK==Direct3D_Init (hwnd,hInstance))) { MessageBox(hwnd, _T("Direct3D初始化失敗~!"), _T("淺墨的消息窗口"), 0); //使用MessageBox函數,創建一個消息窗口 } //【4】窗口創建四步曲之四:窗口的移動、顯示與更新 MoveWindow(hwnd,250,80,WINDOW_WIDTH,WINDOW_HEIGHT,true); //調整窗口顯示時的位置,使窗口左上角位于(250,80)處 ShowWindow( hwnd, nShowCmd ); //調用ShowWindow函數來顯示窗口 UpdateWindow(hwnd); //對窗口進行更新,就像我們買了新房子要裝修一樣 //進行DirectInput類的初始化 g_pDInput = new DInputClass(); //DISCL_FOREGROUND | DISCL_NONEXCLUSIVE: 協作級別,前臺模式|共享模式 g_pDInput->Init(hwnd, hInstance, DISCL_FOREGROUND | DISCL_NONEXCLUSIVE, DISCL_FOREGROUND | DISCL_NONEXCLUSIVE); PlaySound(L"偽りの饗宴.wav", NULL, SND_FILENAME | SND_ASYNC|SND_LOOP); //循環播放背景音樂 //【5】消息循環過程 MSG msg = { 0 }; //初始化msg while( msg.message != WM_QUIT ) //使用while循環 { if( PeekMessage( &msg, 0, 0, 0, PM_REMOVE ) ) //查看應用程序消息隊列,有消息時將隊列中的消息派發出去。 { TranslateMessage( &msg ); //將虛擬鍵消息轉換為字符消息 DispatchMessage( &msg ); //該函數分發一個消息給窗口程序。 } else { Direct3D_Update(hwnd); //調用更新函數,進行畫面的更新 Direct3D_Render(hwnd); //調用渲染函數,進行畫面的渲染 } } //【6】窗口類的注銷 UnregisterClass(L"ForTheDreamOfGameDevelop", wndClass.hInstance); //程序準備結束,注銷窗口類 return 0; }//-----------------------------------【WndProc( )函數】--------------------------------------// 描述:窗口過程函數WndProc,對窗口消息進行處理//------------------------------------------------------------------------------------------------LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ) //窗口過程函數WndProc{ switch( message ) //switch語句開始 { case WM_PAINT: // 客戶區重繪消息 Direct3D_Render(hwnd); //調用Direct3D_Render函數,進行畫面的繪制 ValidateRect(hwnd, NULL); // 更新客戶區的顯示 break; //跳出該switch語句 case WM_KEYDOWN: // 鍵盤按下消息 if (wParam == VK_ESCAPE) // ESC鍵 DestroyWindow(hwnd); // 銷毀窗口, 并發送一條WM_DESTROY消息 break; case WM_DESTROY: //窗口銷毀消息 Direct3D_CleanUp(); //調用Direct3D_CleanUp函數,清理COM接口對象 PostQuitMessage( 0 ); //向系統表明有個線程有終止請求。用來響應WM_DESTROY消息 break; //跳出該switch語句 default: //若上述case條件都不符合,則執行該default語句 return DefWindowProc( hwnd, message, wParam, lParam ); //調用缺省的窗口過程來為應用程序沒有處理的窗口消息提供缺省的處理。 } return 0; //正常退出}//-----------------------------------【Direct3D_Init( )函數】----------------------------------// 描述:Direct3D初始化函數,進行Direct3D的初始化//------------------------------------------------------------------------------------------------HRESULT Direct3D_Init(HWND hwnd,HINSTANCE hInstance){ //-------------------------------------------------------------------------------------- // 【Direct3D初始化四步曲之一,創接口】:創建Direct3D接口對象, 以便用該Direct3D對象創建Direct3D設備對象 //-------------------------------------------------------------------------------------- LPDIRECT3D9 pD3D = NULL; //Direct3D接口對象的創建 if( NULL == ( pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) ) //初始化Direct3D接口對象,并進行DirectX版本協商 return E_FAIL; //-------------------------------------------------------------------------------------- // 【Direct3D初始化四步曲之二,取信息】:獲取硬件設備信息 //-------------------------------------------------------------------------------------- D3DCAPS9 caps; int vp = 0; if( FAILED( pD3D->GetDeviceCaps( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &caps ) ) ) { return E_FAIL; } if( caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT ) vp = D3DCREATE_HARDWARE_VERTEXPROCESSING; //支持硬件頂點運算,我們就采用硬件頂點運算,妥妥的 else vp = D3DCREATE_SOFTWARE_VERTEXPROCESSING; //不支持硬件頂點運算,無奈只好采用軟件頂點運算 //-------------------------------------------------------------------------------------- // 【Direct3D初始化四步曲之三,填內容】:填充D3DPRESENT_PARAMETERS結構體 //-------------------------------------------------------------------------------------- D3DPRESENT_PARAMETERS d3dpp; ZeroMemory(&d3dpp, sizeof(d3dpp)); d3dpp.BackBufferWidth = WINDOW_WIDTH; //后臺緩沖區寬度 d3dpp.BackBufferHeight = WINDOW_HEIGHT; //后臺緩沖區高度 d3dpp.BackBufferFormat = D3DFMT_A8R8G8B8; //后臺緩沖區保存像素格式 d3dpp.BackBufferCount = 2; //后臺緩沖區數量 d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE; //多重采樣類型 d3dpp.MultiSampleQuality = 0; //多重采樣格式 d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; //如何將后臺緩沖區的內容復制到前臺的緩存中 d3dpp.hDeviceWindow = hwnd; //在哪個窗口上進行繪制 d3dpp.Windowed = true; //繪制窗口的顯示模式,true表示窗口模式,false表示全屏顯示 d3dpp.EnableAutoDepthStencil = true; //表示Direct3D是否為應用程序自動管理深度緩存 d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8; //指定深度緩存像素格式 d3dpp.Flags = 0; //附加屬性 d3dpp.FullScreen_RefreshRateInHz = 0; //表示全屏模式時指定的屏幕的刷新率 d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; //指定后臺緩沖區與前臺緩沖區的最大交換率 //-------------------------------------------------------------------------------------- // 【Direct3D初始化四步曲之四,創設備】:創建Direct3D設備接口 //-------------------------------------------------------------------------------------- if(FAILED(pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, vp, &d3dpp, &g_pd3dDevice))) return E_FAIL; //獲取顯卡信息到g_strAdapterName中,并在顯卡名稱之前加上“當前顯卡型號:”字符串 wchar_t TempName[60]=L"當前顯卡型號:"; //定義一個臨時字符串,且方便了把"當前顯卡型號:"字符串引入我們的目的字符串中 D3DADAPTER_IDENTIFIER9 Adapter; //定義一個D3DADAPTER_IDENTIFIER9結構體,用于存儲顯卡信息 pD3D->GetAdapterIdentifier(0,0,&Adapter); //調用GetAdapterIdentifier,獲取顯卡信息 int len = MultiByteToWideChar(CP_ACP,0, Adapter.Description, -1, NULL, 0);//顯卡名稱現在已經在Adapter.Description中了,但是其為char類型,我們要將其轉為wchar_t類型 MultiByteToWideChar(CP_ACP, 0, Adapter.Description, -1, g_strAdapterName, len);//這步操作完成后,g_strAdapterName中就為當前我們的顯卡類型名的wchar_t型字符串了 wcscat_s(TempName, g_strAdapterName); //把當前我們的顯卡名加到“當前顯卡型號:”字符串后面,結果存在TempName中 wcscpy_s(g_strAdapterName, TempName); //把TempName中的結果拷貝到全局變量g_strAdapterName中,大功告成~ if(!(S_OK==Objects_Init())) return E_FAIL; SAFE_RELEASE(pD3D) //LPDIRECT3D9接口對象的使命完成,我們將其釋放掉 return S_OK;}//-----------------------------------【Object_Init( )函數】--------------------------------------// 描述:渲染資源初始化函數,在此函數中進行要被渲染的物體的資源的初始化//--------------------------------------------------------------------------------------------------HRESULT Objects_Init(){ //創建字體 D3DXCreateFont(g_pd3dDevice, 36, 0, 0, 1000, false, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, DEFAULT_QUALITY, 0, _T("Calibri"), &g_pTextFPS); D3DXCreateFont(g_pd3dDevice, 20, 0, 1000, 0, false, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, DEFAULT_QUALITY, 0, L"華文中宋", &g_pTextAdaperName); D3DXCreateFont(g_pd3dDevice, 23, 0, 1000, 0, false, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, DEFAULT_QUALITY, 0, L"微軟雅黑", &g_pTextHelper); D3DXCreateFont(g_pd3dDevice, 26, 0, 1000, 0, false, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, DEFAULT_QUALITY, 0, L"黑體", &g_pTextInfor); //-------------------------------------------------------------------------------------- // 【文件模型載入三部曲之一】:通過X文件加載網格模型 //-------------------------------------------------------------------------------------- // 從X文件中加載網格數據 LPD3DXBUFFER pAdjBuffer = NULL; LPD3DXBUFFER pMtrlBuffer = NULL; //L"Optimus.x": 指向需要加載的.x文件的磁盤路徑和文件名的字符串 //D3DXMESH_MANAGED: 創建網格時的附加項 //g_pd3dDevice: Direct3D設備指針 //pAdjBuffer: 保存網格的鄰接信息,也就是包含每個多邊形周圍的多邊形的緩沖區的內存地址 //&pMtrlBuffer:保存網格的所有子集的材質 //NULL: 存儲網格模型的特殊效果,通常為NULL //g_dwNumMtrls: 存儲所有子集材質的數目,配合第5個參數 //g_pMesh: 指向從文件生成的Direct3D網格模型的指針,一邊之后對網格模型的訪問 D3DXLoadMeshFromX(L"Optimus.x", D3DXMESH_MANAGED, g_pd3dDevice, &pAdjBuffer, &pMtrlBuffer, NULL, &g_dwNumMtrls, &g_pMesh); //-------------------------------------------------------------------------------------- // 【文件模型載入三部曲之二】:載入材質和紋理 //-------------------------------------------------------------------------------------- // 讀取材質和紋理數據 D3DXMATERIAL *pMtrls = (D3DXMATERIAL*)pMtrlBuffer->GetBufferPointer(); //獲取緩沖區中的數據 g_pMaterials = new D3DMATERIAL9[g_dwNumMtrls]; g_pTextures = new LPDIRECT3DTEXTURE9[g_dwNumMtrls]; for (DWORD i=0; i<g_dwNumMtrls; i++) { g_pMaterials[i] = pMtrls[i].MatD3D; //材質信息 g_pMaterials[i].Ambient = g_pMaterials[i].Diffuse; //環境光顏色值 //創建紋理對象 g_pTextures[i] = NULL; D3DXCreateTextureFromFileA(g_pd3dDevice, pMtrls[i].pTextureFilename, &g_pTextures[i]); } pAdjBuffer->Release(); pMtrlBuffer->Release(); // 設置渲染狀態 g_pd3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW); //開啟背面消隱 g_pd3dDevice->SetRenderState(D3DRS_AMBIENT, D3DXCOLOR(1.0f, 1.0f, 1.0f, 1.0f)); //設置環境光 Matrix_Set();//設置四大變換 return S_OK;}//-----------------------------------【Matrix_Set( )函數】--------------------------------------// 描述:封裝了Direct3D四大變換的函數,即世界變換,取景變換,投影變換,視口變換的設置//--------------------------------------------------------------------------------------------------void Matrix_Set(){ //-------------------------------------------------------------------------------------- //【四大變換之一】:世界變換矩陣的設置 //-------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------- //【四大變換之二】:取景變換矩陣的設置 //-------------------------------------------------------------------------------------- D3DXMATRIX matView; //定義一個矩陣 D3DXVECTOR3 vEye(0.0f, 0.0f, -1300.0f); //攝像機的位置 D3DXVECTOR3 vAt(0.0f, 0.0f, 0.0f); //觀察點的位置 D3DXVECTOR3 vUp(0.0f, 1.0f, 0.0f); //向上的向量 D3DXMatrixLookAtLH(&matView, &vEye, &vAt, &vUp); //計算出取景變換矩陣 g_pd3dDevice->SetTransform(D3DTS_VIEW, &matView); //應用取景變換矩陣 //-------------------------------------------------------------------------------------- //【四大變換之三】:投影變換矩陣的設置 //-------------------------------------------------------------------------------------- D3DXMATRIX matProj; //定義一個矩陣 D3DXMatrixPerspectiveFovLH(&matProj, D3DX_PI / 4.0f, (float)((double)WINDOW_WIDTH/WINDOW_HEIGHT), 1.0f, 10000.0f); //計算投影變換矩陣 g_pd3dDevice->SetTransform(D3DTS_PROJECTION, &matProj); //設置投影變換矩陣 //-------------------------------------------------------------------------------------- //【四大變換之四】:視口變換的設置 //-------------------------------------------------------------------------------------- D3DVIEWPORT9 vp; //實例化一個D3DVIEWPORT9結構體,然后做填空題給各個參數賦值就可以了 vp.X = 0; //表示視口相對于窗口的X坐標 vp.Y = 0; //視口相對對窗口的Y坐標 vp.Width = WINDOW_WIDTH; //視口的寬度 vp.Height = WINDOW_HEIGHT; //視口的高度 vp.MinZ = 0.0f; //視口在深度緩存中的最小深度值 vp.MaxZ = 1.0f; //視口在深度緩存中的最大深度值 g_pd3dDevice->SetViewport(&vp); //視口的設置}//-----------------------------------【Direct3D_Update( )函數】--------------------------------// 描述:不是即時渲染代碼但是需要即時調用的,如按鍵后的坐標的更改,都放在這里//--------------------------------------------------------------------------------------------------//--------------------------------------------------------------------------------------// 【DirectInput使用五步曲第四步】:取按鍵,獲取按鍵情況并做響應//--------------------------------------------------------------------------------------void Direct3D_Update( HWND hwnd){ //使用DirectInput類讀取數據 g_pDInput->GetInput(); // 按住鼠標左鍵并拖動,為平移操作 static FLOAT fPosX = 0.0f, fPosY = 0.0f, fPosZ = 0.0f; if (g_pDInput->IsMouseButtonDown(0)) { fPosX += (g_pDInput->MouseDX()) * 0.08f; fPosY += (g_pDInput->MouseDY()) * -0.08f; } //鼠標滾輪,為觀察點收縮操作 fPosZ += (g_pDInput->MouseDZ())* 0.02f; // 平移物體 if (g_pDInput->IsKeyDown(DIK_A)) fPosX -= 0.005f; if (g_pDInput->IsKeyDown(DIK_D)) fPosX += 0.005f; if (g_pDInput->IsKeyDown(DIK_W)) fPosY += 0.005f; if (g_pDInput->IsKeyDown(DIK_S)) fPosY -= 0.005f; D3DXMatrixTranslation(&g_matWorld, fPosX, fPosY, fPosZ); // 按住鼠標右鍵并拖動,為旋轉操作 static float fAngleX = 0.0f, fAngleY =0.0f; if (g_pDInput->IsMouseButtonDown(1)) { fAngleX += (g_pDInput->MouseDY())* -0.01f; fAngleY += (g_pDInput->MouseDX()) * -0.01f; } // 旋轉物體 if (g_pDInput->IsKeyDown(DIK_UP)) fAngleX += 0.005f; if (g_pDInput->IsKeyDown(DIK_DOWN)) fAngleX -= 0.005f; if (g_pDInput->IsKeyDown(DIK_LEFT)) fAngleY -= 0.005f; if (g_pDInput->IsKeyDown(DIK_RIGHT)) fAngleY += 0.005f; D3DXMATRIX Rx, Ry; D3DXMatrixRotationX(&Rx, fAngleX); D3DXMatrixRotationY(&Ry, fAngleY); //得到最終的矩陣并設置 g_matWorld = Rx * Ry * g_matWorld;//得到最終的矩陣 g_pd3dDevice->SetTransform(D3DTS_WORLD, &g_matWorld);//設置世界矩陣}//-----------------------------------【Direct3D_Render( )函數】-------------------------------// 描述:使用Direct3D進行渲染//--------------------------------------------------------------------------------------------------void Direct3D_Render(HWND hwnd){ //-------------------------------------------------------------------------------------- // 【Direct3D渲染五步曲之一】:清屏操作 //-------------------------------------------------------------------------------------- g_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(100, 100, 100), 1.0f, 0); //定義一個矩形,用于獲取主窗口矩形 RECT formatRect; GetClientRect(hwnd, &formatRect); //-------------------------------------------------------------------------------------- // 【Direct3D渲染五步曲之二】:開始繪制 //-------------------------------------------------------------------------------------- g_pd3dDevice->BeginScene(); // 開始繪制 //-------------------------------------------------------------------------------------- // 【文件模型載入三部曲之三】:繪制網格模型 //-------------------------------------------------------------------------------------- // 繪制網格 for (DWORD i = 0; i < g_dwNumMtrls; i++) { g_pd3dDevice->SetMaterial(&g_pMaterials[i]); //設置材質 g_pd3dDevice->SetTexture(0, g_pTextures[i]); //設置紋理 g_pMesh->DrawSubset(i); //繪制網格中的每個子集 } //在窗口右上角處,顯示每秒幀數 int charCount = swprintf_s(g_strFPS, 20, _T("FPS:%0.3f"), Get_FPS() ); g_pTextFPS->DrawText(NULL, g_strFPS, charCount , &formatRect, DT_TOP | DT_RIGHT, D3DCOLOR_RGBA(0,239,136,255)); //顯示顯卡類型名 g_pTextAdaperName->DrawText(NULL, g_strAdapterName, -1, &formatRect, DT_TOP | DT_LEFT, D3DXCOLOR(1.0f, 0.5f, 0.0f, 1.0f)); // 輸出繪制信息 formatRect.top = 30; static wchar_t strInfo[256] = {0}; swprintf_s(strInfo,-1, L"模型坐標: (%.2f, %.2f, %.2f)", g_matWorld._41, g_matWorld._42, g_matWorld._43); g_pTextHelper->DrawText(NULL, strInfo, -1, &formatRect, DT_SINGLELINE | DT_NOCLIP | DT_LEFT, D3DCOLOR_RGBA(135,239,136,255)); // 輸出幫助信息 formatRect.left = 0,formatRect.top = 380; g_pTextInfor->DrawText(NULL, L"控制說明:", -1, &formatRect, DT_SINGLELINE | DT_NOCLIP | DT_LEFT, D3DCOLOR_RGBA(235,123,230,255)); formatRect.top += 35; g_pTextHelper->DrawText(NULL, L" 按住鼠標左鍵并拖動:平移模型", -1, &formatRect, DT_SINGLELINE | DT_NOCLIP | DT_LEFT, D3DCOLOR_RGBA(255,200,0,255)); formatRect.top += 25; g_pTextHelper->DrawText(NULL, L" 按住鼠標右鍵并拖動:旋轉模型", -1, &formatRect, DT_SINGLELINE | DT_NOCLIP | DT_LEFT, D3DCOLOR_RGBA(255,200,0,255)); formatRect.top += 25; g_pTextHelper->DrawText(NULL, L" 滑動鼠標滾輪:拉伸模型", -1, &formatRect, DT_SINGLELINE | DT_NOCLIP | DT_LEFT, D3DCOLOR_RGBA(255,200,0,255)); formatRect.top += 25; g_pTextHelper->DrawText(NULL, L" W、S、A、D鍵:平移模型 ", -1, &formatRect, DT_SINGLELINE | DT_NOCLIP | DT_LEFT, D3DCOLOR_RGBA(255,200,0,255)); formatRect.top += 25; g_pTextHelper->DrawText(NULL, L" 上、下、左、右方向鍵:旋轉模型 ", -1, &formatRect, DT_SINGLELINE | DT_NOCLIP | DT_LEFT, D3DCOLOR_RGBA(255,200,0,255)); formatRect.top += 25; g_pTextHelper->DrawText(NULL, L" ESC鍵 : 退出程序", -1, &formatRect, DT_SINGLELINE | DT_NOCLIP | DT_LEFT, D3DCOLOR_RGBA(255,200,0,255)); //-------------------------------------------------------------------------------------- // 【Direct3D渲染五步曲之四】:結束繪制 //-------------------------------------------------------------------------------------- g_pd3dDevice->EndScene(); // 結束繪制 //-------------------------------------------------------------------------------------- // 【Direct3D渲染五步曲之五】:顯示翻轉 //-------------------------------------------------------------------------------------- g_pd3dDevice->Present(NULL, NULL, NULL, NULL); // 翻轉與顯示}//-----------------------------------【Get_FPS( )函數】------------------------------------------// 描述:用于計算每秒幀速率的一個函數//--------------------------------------------------------------------------------------------------float Get_FPS(){ //定義四個靜態變量 static float fps = 0; //我們需要計算的FPS值 static int frameCount = 0; //幀數 static float currentTime =0.0f; //當前時間 static float lastTime = 0.0f; //持續時間 frameCount++;//每調用一次Get_FPS()函數,幀數自增1 currentTime = timeGetTime()*0.001f;//獲取系統時間,其中timeGetTime函數返回的是以毫秒為單位的系統時間,所以需要乘以0.001,得到單位為秒的時間 //如果當前時間減去持續時間大于了1秒鐘,就進行一次FPS的計算和持續時間的更新,并將幀數值清零 if(currentTime - lastTime > 1.0f) //將時間控制在1秒鐘 { fps = (float)frameCount /(currentTime - lastTime);//計算這1秒鐘的FPS值 lastTime = currentTime; //將當前時間currentTime賦給持續時間lastTime,作為下一秒的基準時間 frameCount = 0; //將本次幀數frameCount值清零 } return fps;}//-----------------------------------【Direct3D_CleanUp( )函數】--------------------------------// 描述:對Direct3D的資源進行清理,釋放COM接口對象//---------------------------------------------------------------------------------------------------void Direct3D_CleanUp(){ //釋放COM接口對象 SAFE_RELEASE(g_pTextAdaperName) SAFE_RELEASE(g_pTextHelper) SAFE_RELEASE(g_pTextInfor) SAFE_RELEASE(g_pTextFPS) SAFE_RELEASE(g_pd3dDevice)}

這里寫圖片描述

這里寫圖片描述


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 永顺县| 阜新市| 金秀| 同心县| 大兴区| 德令哈市| 苗栗县| 西乌珠穆沁旗| 鸡泽县| 潍坊市| 信阳市| 兴安县| 许昌市| 平江县| 郸城县| 玉门市| 紫金县| 泰安市| 黑山县| 中宁县| 平定县| 马尔康县| 冷水江市| 玛多县| 博野县| 广德县| 宁化县| 安远县| 兴国县| 连南| 福鼎市| 沂南县| 清河县| 玉林市| 锡林浩特市| 博野县| 临颍县| 屯门区| 新晃| 思南县| 临洮县|