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

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

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

2019-11-11 01:02:44
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

D3DUtil.h

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

DirectInputClass.h

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

DirectInputClass.cpp

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

main.cpp

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

這里寫(xiě)圖片描述

這里寫(xiě)圖片描述


發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 永善县| 盐源县| 青铜峡市| 鹤庆县| 高清| 临颍县| 湖口县| 弥渡县| 乳山市| 永靖县| 明水县| 扎赉特旗| 康保县| 珲春市| 五河县| 金阳县| 长垣县| 紫阳县| 馆陶县| 司法| 莲花县| 阿勒泰市| 雷州市| 安新县| 临安市| 高唐县| 富平县| 疏附县| 江孜县| 资溪县| 伊川县| 苏州市| 尉犁县| 平和县| 云梦县| 营山县| 梅州市| 五华县| 内乡县| 垣曲县| 临泽县|