Repository: QianMo/Direct3D-Win32-Book-Src-Code Branch: master Commit: 3beef5878a9c Files: 111 Total size: 696.2 KB Directory structure: gitextract_izccgwl9/ ├── .gitattributes ├── .gitignore ├── Direct3D-Game-Demo/ │ ├── D3Ddemo0/ │ │ └── D3DdemoCore.cpp │ ├── D3Ddemo1/ │ │ └── D3Ddemo1.cpp │ ├── D3Ddemo10/ │ │ ├── D3DUtil.h │ │ ├── D3Ddemo10.cpp │ │ ├── DirectInputClass.cpp │ │ └── DirectInputClass.h │ ├── D3Ddemo11/ │ │ ├── D3DUtil.h │ │ ├── D3Ddemo11.cpp │ │ ├── DirectInputClass.cpp │ │ └── DirectInputClass.h │ ├── D3Ddemo12/ │ │ ├── D3DUtil.h │ │ ├── D3Ddemo12.cpp │ │ ├── DirectInputClass.cpp │ │ └── DirectInputClass.h │ ├── D3Ddemo13/ │ │ ├── D3DUtil.h │ │ ├── D3Ddemo13.cpp │ │ ├── DirectInputClass.cpp │ │ └── DirectInputClass.h │ ├── D3Ddemo14/ │ │ ├── D3DUtil.h │ │ ├── D3Ddemo14.cpp │ │ ├── DirectInputClass.cpp │ │ └── DirectInputClass.h │ ├── D3Ddemo15/ │ │ ├── D3DUtil.h │ │ ├── D3Ddemo15.cpp │ │ ├── DirectInputClass.cpp │ │ └── DirectInputClass.h │ ├── D3Ddemo16/ │ │ ├── CameraClass.cpp │ │ ├── CameraClass.h │ │ ├── D3DUtil.h │ │ ├── D3Ddemo16.cpp │ │ ├── DirectInputClass.cpp │ │ └── DirectInputClass.h │ ├── D3Ddemo17/ │ │ ├── CameraClass.cpp │ │ ├── CameraClass.h │ │ ├── D3DUtil.h │ │ ├── D3Ddemo17.cpp │ │ ├── DirectInputClass.cpp │ │ ├── DirectInputClass.h │ │ ├── TerrainClass.cpp │ │ └── TerrainClass.h │ ├── D3Ddemo18/ │ │ ├── CameraClass.cpp │ │ ├── CameraClass.h │ │ ├── D3DUtil.h │ │ ├── D3Ddemo18.cpp │ │ ├── DirectInputClass.cpp │ │ ├── DirectInputClass.h │ │ ├── SkyBoxClass.cpp │ │ ├── SkyBoxClass.h │ │ ├── TerrainClass.cpp │ │ └── TerrainClass.h │ ├── D3Ddemo19/ │ │ ├── CameraClass.cpp │ │ ├── CameraClass.h │ │ ├── D3DUtil.h │ │ ├── D3Ddemo19.cpp │ │ ├── DirectInputClass.cpp │ │ ├── DirectInputClass.h │ │ ├── SkyBoxClass.cpp │ │ ├── SkyBoxClass.h │ │ ├── SnowParticleClass.cpp │ │ ├── SnowParticleClass.h │ │ ├── TerrainClass.cpp │ │ └── TerrainClass.h │ ├── D3Ddemo2/ │ │ └── D3Ddemo2.cpp │ ├── D3Ddemo20/ │ │ ├── CameraClass.cpp │ │ ├── CameraClass.h │ │ ├── D3DUtil.h │ │ ├── D3Ddemo20.cpp │ │ ├── DirectInputClass.cpp │ │ ├── DirectInputClass.h │ │ ├── SkyBoxClass.cpp │ │ ├── SkyBoxClass.h │ │ ├── SnowParticleClass.cpp │ │ ├── SnowParticleClass.h │ │ ├── TerrainClass.cpp │ │ ├── TerrainClass.h │ │ ├── XFileModelClass.cpp │ │ └── XFileModelClass.h │ ├── D3Ddemo3/ │ │ └── D3Ddemo3.cpp │ ├── D3Ddemo4/ │ │ └── D3Ddemo4.cpp │ ├── D3Ddemo5/ │ │ └── D3Ddemo5.cpp │ ├── D3Ddemo6/ │ │ └── D3Ddemo6.cpp │ ├── D3Ddemo7/ │ │ └── D3Ddemo7.cpp │ ├── D3Ddemo8/ │ │ └── D3Ddemo8.cpp │ └── D3Ddemo9/ │ ├── D3DUtil.h │ ├── D3Ddemo9.cpp │ ├── DirectInputClass.cpp │ └── DirectInputClass.h ├── GDI-Game-Demo/ │ ├── 10_GDIdemo6.cpp │ ├── 11_GDIdemo7.cpp │ ├── 12_GDIdemo8.cpp │ ├── 13_GDIdemo9.cpp │ ├── 14_GDIdemo10.cpp │ ├── 15_GDIdemo11.cpp │ ├── 16_GDIdemo12.cpp │ ├── 17_GDIdemo13.cpp │ ├── 18_GDIdemo14.cpp │ ├── 19_GDIdemo15.cpp │ ├── 1_HelloVisualStudio.cpp │ ├── 20_GDIdemo16.cpp │ ├── 21_GDIdemo17.cpp │ ├── 2_FirstBlood!.cpp │ ├── 3_GameCore.cpp │ ├── 4_GDIdemoCore.cpp │ ├── 5_GDIdemo1.cpp │ ├── 6_GDIdemo2.cpp │ ├── 7_GDIdemo3.cpp │ ├── 8_GDIdemo4.cpp │ └── 9_GDIdemo5.cpp └── README.md ================================================ FILE CONTENTS ================================================ ================================================ FILE: .gitattributes ================================================ # Auto detect text files and perform LF normalization * text=auto # Custom for Visual Studio *.cs diff=csharp # Standard to msysgit *.doc diff=astextplain *.DOC diff=astextplain *.docx diff=astextplain *.DOCX diff=astextplain *.dot diff=astextplain *.DOT diff=astextplain *.pdf diff=astextplain *.PDF diff=astextplain *.rtf diff=astextplain *.RTF diff=astextplain ================================================ FILE: .gitignore ================================================ # Windows image file caches Thumbs.db ehthumbs.db # Folder config file Desktop.ini # Recycle Bin used on file shares $RECYCLE.BIN/ # Windows Installer files *.cab *.msi *.msm *.msp # Windows shortcuts *.lnk # ========================= # Operating System Files # ========================= # OSX # ========================= .DS_Store .AppleDouble .LSOverride # Thumbnails ._* # Files that might appear on external disk .Spotlight-V100 .Trashes # Directories potentially created on remote AFP share .AppleDB .AppleDesktop Network Trash Folder Temporary Items .apdisk ================================================ FILE: Direct3D-Game-Demo/D3Ddemo0/D3DdemoCore.cpp ================================================ //-----------------------------------˵---------------------------------------------- // :D3DdemoCore // 20134 Create by dzī // Direct3DĺĿ //------------------------------------------------------------------------------------------------ //-----------------------------------ͷļ֡--------------------------------------- // ͷļ //------------------------------------------------------------------------------------------------ #include //-----------------------------------ļ֡--------------------------------------- // Ŀļ //------------------------------------------------------------------------------------------------ #pragma comment(lib,"winmm.lib") //PlaySoundļ //-----------------------------------궨岿֡-------------------------------------------- // һЩ //------------------------------------------------------------------------------------------------ #define WINDOW_WIDTH 800 //Ϊڿȶĺ꣬Էڴ˴޸Ĵڿ #define WINDOW_HEIGHT 600 //Ϊڸ߶ȶĺ꣬Էڴ˴޸Ĵڸ߶ #define WINDOW_TITLE L"ϨϷ롿Direct3DĺĿ" //Ϊڱⶨĺ #define SAFE_RELEASE(p) { if(p) { (p)->Release(); (p)=NULL; } } //һȫͷź꣬ںCOMӿָͷ //-----------------------------------ȫֱ֡------------------------------------- // ȫֱ //------------------------------------------------------------------------------------------------ //-----------------------------------ȫֺ֡------------------------------------- // ȫֺֹδıʶϵд //------------------------------------------------------------------------------------------------ LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam );//ڹ̺ HRESULT Direct3D_Init(HWND hwnd); //нDirect3Dijʼ HRESULT Objects_Init(HWND hwnd); //нҪƵԴʼ VOID Direct3D_Render(HWND hwnd); //нDirect3DȾд VOID Direct3D_CleanUp( ); //COMԴԼԴ //-----------------------------------WinMain( )-------------------------------------- // WindowsӦóںǵij↑ʼ //------------------------------------------------------------------------------------------------ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nShowCmd) { //1ڴIJ֮һʼһĴ 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; //ָڹ̵ijʵ 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ڴIJ֮עᴰ if( !RegisterClassEx( &wndClass ) ) //괰ںҪԴעᣬܴ͵Ĵ return -1; //3ڴIJ֮ʽ HWND hwnd = CreateWindow( L"ForTheDreamOfGameDevelop",WINDOW_TITLE, //ϲּĴںCreateWindow WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, WINDOW_WIDTH, WINDOW_HEIGHT, NULL, NULL, hInstance, NULL ); //Direct3DԴijʼ Direct3D_Init (hwnd); //4ڴIJ֮ģڵƶʾ MoveWindow(hwnd,250,80,WINDOW_WIDTH,WINDOW_HEIGHT,true); //ʾʱλãʹϽλڣ250,80 ShowWindow( hwnd, nShowCmd ); //ShowWindowʾ UpdateWindow(hwnd); //Դڽи£·Ҫװһ PlaySound(L"War3XMainScreen.wav", NULL, SND_FILENAME | SND_ASYNC|SND_LOOP); //ѭű MessageBox(hwnd, L"DirectXưɣ~!", L"dzīϢ", 0); //ʹMessageBoxʾһϢ //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_Render(hwnd); //Ⱦ } } //6ע UnregisterClass(L"ForTheDreamOfGameDevelop", wndClass.hInstance); //׼ע return 0; } //-----------------------------------WndProc( )-------------------------------------- // ڹ̺WndProc,ԴϢд //------------------------------------------------------------------------------------------------ LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ) { switch( message ) //switch俪ʼ { case WM_PAINT: // ǿͻػϢ Direct3D_Render(hwnd); //Direct3DȾ ValidateRect(hwnd, NULL); // ¿ͻʾ break; //switch case WM_KEYDOWN: // Ǽ̰Ϣ if (wParam == VK_ESCAPE) // µļESC DestroyWindow(hwnd); // ٴ, һWM_DESTROYϢ break; //switch case WM_DESTROY: //ǴϢ Direct3D_CleanUp(); //ԶԴGame_CleanUp˳ǰԴ PostQuitMessage( 0 ); //ϵͳиֹ߳ӦWM_DESTROYϢ break; //switch default: //caseϣִиdefault return DefWindowProc( hwnd, message, wParam, lParam ); //ȱʡĴڹ } return 0; //˳ } //-----------------------------------Direct3D_Init( )-------------------------------------- // Direct3DʼDirect3Dijʼ //------------------------------------------------------------------------------------------------ HRESULT Direct3D_Init(HWND hwnd) { if(!(S_OK==Objects_Init(hwnd))) return E_FAIL; //һObjects_InitȾԴijʼ return S_OK; } //-----------------------------------Object_Init( )-------------------------------------- // ȾԴʼڴ˺нҪȾԴijʼ //-------------------------------------------------------------------------------------------------- HRESULT Objects_Init(HWND hwnd) { return S_OK; } //-----------------------------------Direct3D_Render( )-------------------------------------- // ʹDirect3DȾ //-------------------------------------------------------------------------------------------------- void Direct3D_Render(HWND hwnd) { //ʱΪգ»طֽ } //-----------------------------------Direct3D_CleanUp( )-------------------------------- // Դڴ˺нг˳ǰԴ //--------------------------------------------------------------------------------------------------- void Direct3D_CleanUp() { //ʱΪգ»طֽ } ================================================ FILE: Direct3D-Game-Demo/D3Ddemo1/D3Ddemo1.cpp ================================================ //-----------------------------------˵---------------------------------------------- // :D3Ddemo1 // 20134 Create by dzī // Direct3DʼIJ ʾ //------------------------------------------------------------------------------------------------ //-----------------------------------ͷļ֡--------------------------------------- // ͷļ //------------------------------------------------------------------------------------------------ #include //-----------------------------------ļ֡--------------------------------------- // Ŀļ //------------------------------------------------------------------------------------------------ #pragma comment(lib,"winmm.lib") //PlaySoundļ #pragma comment(lib,"d3d9.lib") #pragma comment(lib,"d3dx9.lib") //-----------------------------------궨岿֡-------------------------------------------- // һЩ //------------------------------------------------------------------------------------------------ #define WINDOW_WIDTH 800 //Ϊڿȶĺ꣬Էڴ˴޸Ĵڿ #define WINDOW_HEIGHT 600 //Ϊڸ߶ȶĺ꣬Էڴ˴޸Ĵڸ߶ #define WINDOW_TITLE L"ϨϷ롿Direct3DʼIJ ʾ" //Ϊڱⶨĺ #define SAFE_RELEASE(p) { if(p) { (p)->Release(); (p)=NULL; } } //һȫͷź꣬ںCOMӿָͷ //-----------------------------------ȫֱ֡------------------------------------- // ȫֱ //------------------------------------------------------------------------------------------------ LPDIRECT3DDEVICE9 g_pd3dDevice = NULL; //Direct3D豸 //-----------------------------------ȫֺ֡------------------------------------- // ȫֺֹδıʶϵд //------------------------------------------------------------------------------------------------ LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam );//ڹ̺ HRESULT Direct3D_Init(HWND hwnd); //нDirect3Dijʼ HRESULT Objects_Init(HWND hwnd); //нҪƵԴʼ VOID Direct3D_Render(HWND hwnd); //нDirect3DȾд VOID Direct3D_CleanUp( ); //COMԴԼԴ //-----------------------------------WinMain( )-------------------------------------- // WindowsӦóںǵij↑ʼ //------------------------------------------------------------------------------------------------ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nShowCmd) { //1ڴIJ֮һʼһĴ 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; //ָڹ̵ijʵ 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ڴIJ֮עᴰ if( !RegisterClassEx( &wndClass ) ) //괰ںҪԴעᣬܴ͵Ĵ return -1; //3ڴIJ֮ʽ HWND hwnd = CreateWindow( L"ForTheDreamOfGameDevelop",WINDOW_TITLE, //ϲּĴںCreateWindow WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, WINDOW_WIDTH, WINDOW_HEIGHT, NULL, NULL, hInstance, NULL ); //Direct3DԴijʼɹʧܶmessageboxʾ if (S_OK==Direct3D_Init (hwnd)) { MessageBox(hwnd, L"Direct3Dʼ~", L"dzīϢ", 0); //ʹMessageBoxһϢ } else { MessageBox(hwnd, L"Direct3Dʼʧ~", L"dzīϢ", 0); //ʹMessageBoxһϢ } //4ڴIJ֮ģڵƶʾ MoveWindow(hwnd,250,80,WINDOW_WIDTH,WINDOW_HEIGHT,true); //ʾʱλãʹϽλڣ250,80 ShowWindow( hwnd, nShowCmd ); //ShowWindowʾ UpdateWindow(hwnd); //Դڽи£·Ҫװһ PlaySound(L"NightElf3.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_Render(hwnd); //Ⱦ } } //6ע UnregisterClass(L"ForTheDreamOfGameDevelop", wndClass.hInstance); //׼ע return 0; } //-----------------------------------WndProc( )-------------------------------------- // ڹ̺WndProc,ԴϢд //------------------------------------------------------------------------------------------------ LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ) { switch( message ) //switch俪ʼ { case WM_PAINT: // ǿͻػϢ Direct3D_Render(hwnd); //Direct3DȾ ValidateRect(hwnd, NULL); // ¿ͻʾ break; //switch case WM_KEYDOWN: // Ǽ̰Ϣ if (wParam == VK_ESCAPE) // µļESC DestroyWindow(hwnd); // ٴ, һWM_DESTROYϢ break; //switch case WM_DESTROY: //ǴϢ Direct3D_CleanUp(); //ԶԴGame_CleanUp˳ǰԴ PostQuitMessage( 0 ); //ϵͳиֹ߳ӦWM_DESTROYϢ break; //switch default: //caseϣִиdefault return DefWindowProc( hwnd, message, wParam, lParam ); //ȱʡĴڹ } return 0; //˳ } //-----------------------------------Direct3D_Init( )-------------------------------------- // Direct3DʼDirect3Dijʼ //------------------------------------------------------------------------------------------------ HRESULT Direct3D_Init(HWND hwnd) { //-------------------------------------------------------------------------------------- // Direct3DʼIJ֮һӿڡDirect3Dӿڶ, ԱøDirect3D󴴽Direct3D豸 //-------------------------------------------------------------------------------------- LPDIRECT3D9 pD3D = NULL; //Direct3DӿڶĴ if( NULL == ( pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) ) //ʼDirect3Dӿڶ󣬲DirectX汾Э return E_FAIL; //-------------------------------------------------------------------------------------- // Direct3DʼIJ֮,ȡϢȡӲ豸Ϣ //-------------------------------------------------------------------------------------- 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ʼIJ֮ݡD3DPRESENT_PARAMETERSṹ //-------------------------------------------------------------------------------------- D3DPRESENT_PARAMETERS d3dpp; ZeroMemory(&d3dpp, sizeof(d3dpp)); d3dpp.BackBufferWidth = WINDOW_WIDTH; d3dpp.BackBufferHeight = WINDOW_HEIGHT; d3dpp.BackBufferFormat = D3DFMT_A8R8G8B8; d3dpp.BackBufferCount = 1; d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE; d3dpp.MultiSampleQuality = 0; d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; d3dpp.hDeviceWindow = hwnd; d3dpp.Windowed = true; d3dpp.EnableAutoDepthStencil = true; d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8; d3dpp.Flags = 0; d3dpp.FullScreen_RefreshRateInHz = 0; d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; //-------------------------------------------------------------------------------------- // Direct3DʼIJ֮ģ豸Direct3D豸ӿ //-------------------------------------------------------------------------------------- if(FAILED(pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, vp, &d3dpp, &g_pd3dDevice))) return E_FAIL; SAFE_RELEASE(pD3D) //LPDIRECT3D9ӿڶʹɣǽͷŵ if(!(S_OK==Objects_Init(hwnd))) return E_FAIL; //һObjects_InitȾԴijʼ return S_OK; } //-----------------------------------Object_Init( )-------------------------------------- // ȾԴʼڴ˺нҪȾԴijʼ //-------------------------------------------------------------------------------------------------- HRESULT Objects_Init(HWND hwnd) { return S_OK; } //-----------------------------------Direct3D_Render( )-------------------------------------- // ʹDirect3DȾ //-------------------------------------------------------------------------------------------------- void Direct3D_Render(HWND hwnd) { //ʱΪգ»طֽ } //-----------------------------------Direct3D_CleanUp( )-------------------------------- // Դڴ˺нг˳ǰԴ //--------------------------------------------------------------------------------------------------- void Direct3D_CleanUp() { //ʱΪգ»طֽ } ================================================ FILE: Direct3D-Game-Demo/D3Ddemo10/D3DUtil.h ================================================ //============================================================================= // Desc: D3DUtil.hͷļڹĶ // 2013 203 Create by dzī //============================================================================= #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 ================================================ FILE: Direct3D-Game-Demo/D3Ddemo10/D3Ddemo10.cpp ================================================ //-----------------------------------˵---------------------------------------------- // :D3Ddemo10 // 20134 Create by dzī // Ϊάʣӳ ʾ֮һ // ͼ꼰ͼƬزģ ɽǰ //------------------------------------------------------------------------------------------------ //-----------------------------------궨岿֡-------------------------------------------- // һЩ //------------------------------------------------------------------------------------------------ #define WINDOW_WIDTH 800 //Ϊڿȶĺ꣬Էڴ˴޸Ĵڿ #define WINDOW_HEIGHT 600 //Ϊڸ߶ȶĺ꣬Էڴ˴޸Ĵڸ߶ #define WINDOW_TITLE _T("ϨϷ롿Ϊάʣӳ ʾ֮һ") //Ϊڱⶨĺ //-----------------------------------ͷļ֡--------------------------------------- // ͷļ //------------------------------------------------------------------------------------------------ #include #include #include #include #include "DirectInputClass.h" //-----------------------------------ļ֡--------------------------------------- // Ŀļ //------------------------------------------------------------------------------------------------ #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") //-------------------------------------------------------------------------------------- // IJ֮һĶ //-------------------------------------------------------------------------------------- struct CUSTOMVERTEX { FLOAT _x, _y, _z; // λ FLOAT _u, _v; // CUSTOMVERTEX(FLOAT x, FLOAT y, FLOAT z, FLOAT u, FLOAT v) : _x(x), _y(y), _z(z), _u(u), _v(v) {} }; #define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ | D3DFVF_TEX1) //-----------------------------------ȫֱ֡------------------------------------- // ȫֱ //------------------------------------------------------------------------------------------------ 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; // LPDIRECT3DVERTEXBUFFER9 g_pVertexBuffer = NULL; //㻺 LPDIRECT3DINDEXBUFFER9 g_pIndexBuffer = NULL; // LPDIRECT3DTEXTURE9 g_pTexture = NULL; // ӿڶ DInputClass* g_pDInput = NULL; //һDInputClassָ //-----------------------------------ȫֺ֡------------------------------------- // ȫֺֹδıʶϵд //------------------------------------------------------------------------------------------------ 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Ӧóںǵij↑ʼ //------------------------------------------------------------------------------------------------ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nShowCmd) { //1ڴIJ֮һʼһĴ 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; //ָڹ̵ijʵ 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ڴIJ֮עᴰ if( !RegisterClassEx( &wndClass ) ) //괰ںҪԴעᣬܴ͵Ĵ return -1; //3ڴIJ֮ʽ HWND hwnd = CreateWindow( L"ForTheDreamOfGameDevelop",WINDOW_TITLE, //ϲּĴںCreateWindow WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, WINDOW_WIDTH, WINDOW_HEIGHT, NULL, NULL, hInstance, NULL ); //Direct3DԴijʼʧmessageboxʾ if (!(S_OK==Direct3D_Init (hwnd,hInstance))) { MessageBox(hwnd, _T("Direct3Dʼʧ~"), _T("dzīϢ"), 0); //ʹMessageBoxһϢ } //4ڴIJ֮ģڵƶʾ MoveWindow(hwnd,250,80,WINDOW_WIDTH,WINDOW_HEIGHT,true); //ʾʱλãʹϽλڣ250,80 ShowWindow( hwnd, nShowCmd ); //ShowWindowʾ UpdateWindow(hwnd); //Դڽи£·Ҫװһ //DirectInputijʼ g_pDInput = new DInputClass(); 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_CleanUpCOMӿڶ PostQuitMessage( 0 ); //ϵͳиֹ߳ӦWM_DESTROYϢ break; //switch default: //caseϣִиdefault return DefWindowProc( hwnd, message, wParam, lParam ); //ȱʡĴڹΪӦóûдĴϢṩȱʡĴ } return 0; //˳ } //-----------------------------------Direct3D_Init( )---------------------------------- // Direct3DʼDirect3Dijʼ //------------------------------------------------------------------------------------------------ HRESULT Direct3D_Init(HWND hwnd,HINSTANCE hInstance) { //-------------------------------------------------------------------------------------- // Direct3DʼIJ֮һӿڡDirect3Dӿڶ, ԱøDirect3D󴴽Direct3D豸 //-------------------------------------------------------------------------------------- LPDIRECT3D9 pD3D = NULL; //Direct3DӿڶĴ if( NULL == ( pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) ) //ʼDirect3Dӿڶ󣬲DirectX汾Э return E_FAIL; //-------------------------------------------------------------------------------------- // Direct3DʼIJ֮,ȡϢȡӲ豸Ϣ //-------------------------------------------------------------------------------------- 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ʼIJ֮ݡ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; d3dpp.EnableAutoDepthStencil = true; d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8; d3dpp.Flags = 0; d3dpp.FullScreen_RefreshRateInHz = 0; d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; //-------------------------------------------------------------------------------------- // Direct3DʼIJ֮ģ豸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( )-------------------------------------- // ȾԴʼڴ˺нҪȾԴijʼ //-------------------------------------------------------------------------------------------------- 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); //-------------------------------------------------------------------------------------- // 㻺 //-------------------------------------------------------------------------------------- //㻺 if( FAILED( g_pd3dDevice->CreateVertexBuffer( 24*sizeof(CUSTOMVERTEX), 0, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &g_pVertexBuffer, NULL ) ) ) { return E_FAIL; } // if( FAILED( g_pd3dDevice->CreateIndexBuffer(36* sizeof(WORD), 0, D3DFMT_INDEX16, D3DPOOL_DEFAULT, &g_pIndexBuffer, NULL)) ) { return E_FAIL; } //-------------------------------------------------------------------------------------- // IJ֮ķ //-------------------------------------------------------------------------------------- //䶥㻺 CUSTOMVERTEX* pVertices; if( FAILED( g_pVertexBuffer->Lock( 0, 24*sizeof(CUSTOMVERTEX), (void**)&pVertices, 0 ) ) ) return E_FAIL; // 涥 pVertices[0] = CUSTOMVERTEX(-10.0f, 10.0f, -10.0f, 0.0f, 0.0f); pVertices[1] = CUSTOMVERTEX( 10.0f, 10.0f, -10.0f, 1.0f, 0.0f); pVertices[2] = CUSTOMVERTEX( 10.0f, -10.0f, -10.0f, 1.0f, 1.0f); pVertices[3] = CUSTOMVERTEX(-10.0f, -10.0f, -10.0f, 0.0f, 1.0f); // 涥 pVertices[4] = CUSTOMVERTEX( 10.0f, 10.0f, 10.0f, 0.0f, 0.0f); pVertices[5] = CUSTOMVERTEX(-10.0f, 10.0f, 10.0f, 1.0f, 0.0f); pVertices[6] = CUSTOMVERTEX(-10.0f, -10.0f, 10.0f, 1.0f, 1.0f); pVertices[7] = CUSTOMVERTEX( 10.0f, -10.0f, 10.0f, 0.0f, 1.0f); // 涥 pVertices[8] = CUSTOMVERTEX(-10.0f, 10.0f, 10.0f, 0.0f, 0.0f); pVertices[9] = CUSTOMVERTEX( 10.0f, 10.0f, 10.0f, 1.0f, 0.0f); pVertices[10] = CUSTOMVERTEX( 10.0f, 10.0f, -10.0f, 1.0f, 1.0f); pVertices[11] = CUSTOMVERTEX(-10.0f, 10.0f, -10.0f, 0.0f, 1.0f); // 涥 pVertices[12] = CUSTOMVERTEX(-10.0f, -10.0f, -10.0f, 0.0f, 0.0f); pVertices[13] = CUSTOMVERTEX( 10.0f, -10.0f, -10.0f, 1.0f, 0.0f); pVertices[14] = CUSTOMVERTEX( 10.0f, -10.0f, 10.0f, 1.0f, 1.0f); pVertices[15] = CUSTOMVERTEX(-10.0f, -10.0f, 10.0f, 0.0f, 1.0f); // 涥 pVertices[16] = CUSTOMVERTEX(-10.0f, 10.0f, 10.0f, 0.0f, 0.0f); pVertices[17] = CUSTOMVERTEX(-10.0f, 10.0f, -10.0f, 1.0f, 0.0f); pVertices[18] = CUSTOMVERTEX(-10.0f, -10.0f, -10.0f, 1.0f, 1.0f); pVertices[19] = CUSTOMVERTEX(-10.0f, -10.0f, 10.0f, 0.0f, 1.0f); // Ҳ涥 pVertices[20] = CUSTOMVERTEX( 10.0f, 10.0f, -10.0f, 0.0f, 0.0f); pVertices[21] = CUSTOMVERTEX( 10.0f, 10.0f, 10.0f, 1.0f, 0.0f); pVertices[22] = CUSTOMVERTEX( 10.0f, -10.0f, 10.0f, 1.0f, 1.0f); pVertices[23] = CUSTOMVERTEX( 10.0f, -10.0f, -10.0f, 0.0f, 1.0f); g_pVertexBuffer->Unlock(); // WORD *pIndices = NULL; g_pIndexBuffer->Lock(0, 0, (void**)&pIndices, 0); // pIndices[0] = 0; pIndices[1] = 1; pIndices[2] = 2; pIndices[3] = 0; pIndices[4] = 2; pIndices[5] = 3; // pIndices[6] = 4; pIndices[7] = 5; pIndices[8] = 6; pIndices[9] = 4; pIndices[10] = 6; pIndices[11] = 7; // pIndices[12] = 8; pIndices[13] = 9; pIndices[14] = 10; pIndices[15] = 8; pIndices[16] = 10; pIndices[17] = 11; // pIndices[18] = 12; pIndices[19] = 13; pIndices[20] = 14; pIndices[21] = 12; pIndices[22] = 14; pIndices[23] = 15; // pIndices[24] = 16; pIndices[25] = 17; pIndices[26] = 18; pIndices[27] = 16; pIndices[28] = 18; pIndices[29] = 19; // Ҳ pIndices[30] = 20; pIndices[31] = 21; pIndices[32] = 22; pIndices[33] = 20; pIndices[34] = 22; pIndices[35] = 23; g_pIndexBuffer->Unlock(); //-------------------------------------------------------------------------------------- // IJ֮Ĵ //-------------------------------------------------------------------------------------- D3DXCreateTextureFromFile(g_pd3dDevice, L"pal5q.jpg", &g_pTexture); // ò D3DMATERIAL9 mtrl; ::ZeroMemory(&mtrl, sizeof(mtrl)); mtrl.Ambient = D3DXCOLOR(1.0f, 1.0f, 1.0f, 1.0f); mtrl.Diffuse = D3DXCOLOR(1.0f, 1.0f, 1.0f, 1.0f); mtrl.Specular = D3DXCOLOR(1.0f, 1.0f, 1.0f, 1.0f); g_pd3dDevice->SetMaterial(&mtrl); D3DLIGHT9 light; ::ZeroMemory(&light, sizeof(light)); light.Type = D3DLIGHT_DIRECTIONAL; light.Ambient = D3DXCOLOR(1.0f, 1.0f, 1.0f, 1.0f); light.Diffuse = D3DXCOLOR(1.0f, 1.0f, 1.0f, 1.0f); light.Specular = D3DXCOLOR(0.0f, 0.0f, 0.0f, 1.0f); light.Direction = D3DXVECTOR3(1.0f, 1.0f, 0.0f); g_pd3dDevice->SetLight(0, &light); //ùԴ g_pd3dDevice->LightEnable(0, true);//ù // Ⱦ״̬ g_pd3dDevice->SetRenderState(D3DRS_NORMALIZENORMALS, true); //ʼ㷨 g_pd3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW); // g_pd3dDevice->SetRenderState(D3DRS_AMBIENT, D3DCOLOR_XRGB(36, 36, 36)); //һ» return S_OK; } //-----------------------------------Matrix_Set( )-------------------------------------- // װDirect3DĴ任ĺ任ȡ任ͶӰ任ӿڱ任 //-------------------------------------------------------------------------------------------------- void Matrix_Set() { //-------------------------------------------------------------------------------------- //Ĵ任֮һ任 //-------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------- //Ĵ任֮ȡ任 //-------------------------------------------------------------------------------------- D3DXMATRIX matView; //һ D3DXVECTOR3 vEye(0.0f, 0.0f, -50.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, 1000.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( )-------------------------------- // ǼʱȾ뵫Ҫʱõģ簴ĸģ //-------------------------------------------------------------------------------------------------- void Direct3D_Update( HWND hwnd) { //ʹDirectInputȡ g_pDInput->GetInput(); // ȡϢӦģʽ if (g_pDInput->IsKeyDown(DIK_1)) // ּ1£ʵ g_pd3dDevice->SetRenderState(D3DRS_FILLMODE,D3DFILL_SOLID); if (g_pDInput->IsKeyDown(DIK_2)) // ּ2£߿ g_pd3dDevice->SetRenderState(D3DRS_FILLMODE,D3DFILL_WIREFRAME); // ס϶ΪƽƲ 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 = D3DX_PI/6, fAngleY =D3DX_PI/6 ; 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);// Matrix_Set(); } //-----------------------------------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(); // ʼ //-------------------------------------------------------------------------------------- // Direct3DȾ岽֮ʽƣö㻺ͼ //-------------------------------------------------------------------------------------- g_pd3dDevice->SetStreamSource( 0, g_pVertexBuffer, 0, sizeof(CUSTOMVERTEX) );//ѰļϢĶ㻺Ⱦˮ g_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX );//ָʹõʽĺ g_pd3dDevice->SetIndices(g_pIndexBuffer);// //-------------------------------------------------------------------------------------- // IJ֮ġ //-------------------------------------------------------------------------------------- g_pd3dDevice->SetTexture(0, g_pTexture); // g_pd3dDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, 24, 0, 12);//϶㻺ͼ //ڴϽǴʾÿ֡ 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" WSADƽģ ", -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,2ּģʽ֮л ", -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_DELETE(g_pDInput); SAFE_RELEASE(g_pVertexBuffer) SAFE_RELEASE(g_pIndexBuffer) SAFE_RELEASE(g_pTexture) SAFE_RELEASE(g_pTextAdaperName) SAFE_RELEASE(g_pTextHelper) SAFE_RELEASE(g_pTextInfor) SAFE_RELEASE(g_pTextFPS) SAFE_RELEASE(g_pd3dDevice) } ================================================ FILE: Direct3D-Game-Demo/D3Ddemo10/DirectInputClass.cpp ================================================ //============================================================================= // Desc: DirectInput봦Դļ // 2013 203 Create by dzī //============================================================================= #include "DirectInputClass.h" //----------------------------------------------------------------------------- // Desc: 캯 //----------------------------------------------------------------------------- DInputClass::DInputClass() { m_pDirectInput = NULL; m_KeyboardDevice = NULL; ZeroMemory(m_keyBuffer,sizeof(char)*256); m_MouseDevice= NULL; ZeroMemory(&m_MouseState, sizeof(m_MouseState)); } //----------------------------------------------------------------------------- // NameDInputClass::Init( // Desc: ʼDirectInput̼豸 //----------------------------------------------------------------------------- HRESULT DInputClass::Init( HWND hWnd,HINSTANCE hInstance,DWORD keyboardCoopFlags, DWORD mouseCoopFlags ) { HRESULT hr; //ʼһIDirectInput8ӿڶ HR(DirectInput8Create( hInstance, DIRECTINPUT_VERSION, IID_IDirectInput8,(void**)&m_pDirectInput,NULL )); //м豸ijʼ HR( m_pDirectInput->CreateDevice( GUID_SysKeyboard, &m_KeyboardDevice, NULL )); HR( m_KeyboardDevice->SetCooperativeLevel( hWnd, keyboardCoopFlags)); HR( m_KeyboardDevice->SetDataFormat( &c_dfDIKeyboard )); HR( m_KeyboardDevice->Acquire( )); HR( m_KeyboardDevice->Poll( )); //豸ijʼ 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; } //----------------------------------------------------------------------------- // NameDInputClass::GetInput() // Desc: ڻȡϢĺ //----------------------------------------------------------------------------- void DInputClass::GetInput() { 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); } } //----------------------------------------------------------------------------- // NameDInputClass::IsKeyDown() // Desc: жϼijǷ //----------------------------------------------------------------------------- bool DInputClass::IsKeyDown(int iKey) { if(m_keyBuffer[iKey] & 0x80) return true; else return false; } //----------------------------------------------------------------------------- // NameDInputClass::IsMouseButtonDown() // Desc: жijǷ //----------------------------------------------------------------------------- bool DInputClass::IsMouseButtonDown(int button) { return (m_MouseState.rgbButtons[button] & 0x80) != 0; } //----------------------------------------------------------------------------- // NameDInputClass::MouseDX // Desc: ָXֵ //----------------------------------------------------------------------------- float DInputClass::MouseDX() { return (float)m_MouseState.lX; } //----------------------------------------------------------------------------- // NameDInputClass::MouseDY // Desc: ָYֵ //----------------------------------------------------------------------------- float DInputClass::MouseDY() { return (float)m_MouseState.lY; } //----------------------------------------------------------------------------- // NameDInputClass::MouseDZ // Desc: ָZֵ֣ //----------------------------------------------------------------------------- float DInputClass::MouseDZ() { return (float)m_MouseState.lZ; } //----------------------------------------------------------------------------- // Desc: //----------------------------------------------------------------------------- DInputClass::~DInputClass(void) { 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); } ================================================ FILE: Direct3D-Game-Demo/D3Ddemo10/DirectInputClass.h ================================================ //============================================================================= // Name: DirectInputClass.h // Des: װDirectInput봦ͷļ // 2013 203 Create by dzī //============================================================================= #pragma once #include "D3DUtil.h" #define DIRECTINPUT_VERSION 0x0800 #include //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); //жϼijǷ bool IsMouseButtonDown(int button); //ж갴Ƿ񱻰 float MouseDX(); //Xֵ float MouseDY(); //Yֵ float MouseDZ(); //Zֵ public: DInputClass(void); //캯 ~DInputClass(void); // }; ================================================ FILE: Direct3D-Game-Demo/D3Ddemo11/D3DUtil.h ================================================ //============================================================================= // Desc: D3DUtil.hͷļڹĶ // 2013 203 Create by dzī //============================================================================= #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 ================================================ FILE: Direct3D-Game-Demo/D3Ddemo11/D3Ddemo11.cpp ================================================ //-----------------------------------˵---------------------------------------------- // :D3Ddemo10 // 20134 Create by dzī // Ϊάʣӳ ʾ֮ // ͼ꼰ͼƬزģ ɽǰ //------------------------------------------------------------------------------------------------ //-----------------------------------궨岿֡-------------------------------------------- // һЩ //------------------------------------------------------------------------------------------------ #define WINDOW_WIDTH 800 //Ϊڿȶĺ꣬Էڴ˴޸Ĵڿ #define WINDOW_HEIGHT 600 //Ϊڸ߶ȶĺ꣬Էڴ˴޸Ĵڸ߶ #define WINDOW_TITLE _T("ϨϷ롿Ϊάʣӳ ʾ֮") //Ϊڱⶨĺ //-----------------------------------ͷļ֡--------------------------------------- // ͷļ //------------------------------------------------------------------------------------------------ #include #include #include #include #include "DirectInputClass.h" //-----------------------------------ļ֡--------------------------------------- // Ŀļ //------------------------------------------------------------------------------------------------ #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") //-------------------------------------------------------------------------------------- // IJ֮һĶ //-------------------------------------------------------------------------------------- struct CUSTOMVERTEX { FLOAT _x, _y, _z; // λ FLOAT _u, _v; // CUSTOMVERTEX(FLOAT x, FLOAT y, FLOAT z, FLOAT u, FLOAT v) : _x(x), _y(y), _z(z), _u(u), _v(v) {} }; #define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ | D3DFVF_TEX1) //-----------------------------------ȫֱ֡------------------------------------- // ȫֱ //------------------------------------------------------------------------------------------------ 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; // LPDIRECT3DVERTEXBUFFER9 g_pVertexBuffer = NULL; //㻺 LPDIRECT3DINDEXBUFFER9 g_pIndexBuffer = NULL; // LPDIRECT3DTEXTURE9 g_pMipTexture= NULL; // ӿڶڽĴ DInputClass* g_pDInput = NULL; //һDInputClassָ //-----------------------------------ȫֺ֡------------------------------------- // ȫֺֹδıʶϵд //------------------------------------------------------------------------------------------------ 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Ӧóںǵij↑ʼ //------------------------------------------------------------------------------------------------ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nShowCmd) { //1ڴIJ֮һʼһĴ 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; //ָڹ̵ijʵ 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ڴIJ֮עᴰ if( !RegisterClassEx( &wndClass ) ) //괰ںҪԴעᣬܴ͵Ĵ return -1; //3ڴIJ֮ʽ HWND hwnd = CreateWindow( L"ForTheDreamOfGameDevelop",WINDOW_TITLE, //ϲּĴںCreateWindow WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, WINDOW_WIDTH, WINDOW_HEIGHT, NULL, NULL, hInstance, NULL ); //Direct3DԴijʼʧmessageboxʾ if (!(S_OK==Direct3D_Init (hwnd,hInstance))) { MessageBox(hwnd, _T("Direct3Dʼʧ~"), _T("dzīϢ"), 0); //ʹMessageBoxһϢ } //4ڴIJ֮ģڵƶʾ MoveWindow(hwnd,250,80,WINDOW_WIDTH,WINDOW_HEIGHT,true); //ʾʱλãʹϽλڣ250,80 ShowWindow( hwnd, nShowCmd ); //ShowWindowʾ UpdateWindow(hwnd); //Դڽи£·Ҫװһ //DirectInputijʼ g_pDInput = new DInputClass(); 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; 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_CleanUpCOMӿڶ PostQuitMessage( 0 ); //ϵͳиֹ߳ӦWM_DESTROYϢ break; //switch default: //caseϣִиdefault return DefWindowProc( hwnd, message, wParam, lParam ); //ȱʡĴڹΪӦóûдĴϢṩȱʡĴ } return 0; //˳ } //-----------------------------------Direct3D_Init( )---------------------------------- // Direct3DʼDirect3Dijʼ //------------------------------------------------------------------------------------------------ HRESULT Direct3D_Init(HWND hwnd,HINSTANCE hInstance) { //-------------------------------------------------------------------------------------- // Direct3DʼIJ֮һӿڡDirect3Dӿڶ, ԱøDirect3D󴴽Direct3D豸 //-------------------------------------------------------------------------------------- LPDIRECT3D9 pD3D = NULL; //Direct3DӿڶĴ if( NULL == ( pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) ) //ʼDirect3Dӿڶ󣬲DirectX汾Э return E_FAIL; //-------------------------------------------------------------------------------------- // Direct3DʼIJ֮,ȡϢȡӲ豸Ϣ //-------------------------------------------------------------------------------------- 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ʼIJ֮ݡ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; d3dpp.EnableAutoDepthStencil = true; d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8; d3dpp.Flags = 0; d3dpp.FullScreen_RefreshRateInHz = 0; d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; //-------------------------------------------------------------------------------------- // Direct3DʼIJ֮ģ豸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( )-------------------------------------- // ȾԴʼڴ˺нҪȾԴijʼ //-------------------------------------------------------------------------------------------------- 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); //-------------------------------------------------------------------------------------- // 㻺桢ͼIJ֮㻺 //-------------------------------------------------------------------------------------- //㻺 if( FAILED( g_pd3dDevice->CreateVertexBuffer( 24*sizeof(CUSTOMVERTEX), 0, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &g_pVertexBuffer, NULL ) ) ) { return E_FAIL; } // if( FAILED( g_pd3dDevice->CreateIndexBuffer(36* sizeof(WORD), 0, D3DFMT_INDEX16, D3DPOOL_DEFAULT, &g_pIndexBuffer, NULL)) ) { return E_FAIL; } //-------------------------------------------------------------------------------------- // 㻺桢ͼIJ֮ʶ㻺 //-------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------- // IJ֮ķ //-------------------------------------------------------------------------------------- //䶥㻺 CUSTOMVERTEX* pVertices; if( FAILED( g_pVertexBuffer->Lock( 0, sizeof(CUSTOMVERTEX), (void**)&pVertices, 0 ) ) ) return E_FAIL; // 涥 pVertices[0] = CUSTOMVERTEX(-10.0f, 10.0f, -10.0f, 0.0f, 0.0f); pVertices[1] = CUSTOMVERTEX( 10.0f, 10.0f, -10.0f, 2.0f, 0.0f); pVertices[2] = CUSTOMVERTEX( 10.0f, -10.0f, -10.0f, 2.0f, 2.0f); pVertices[3] = CUSTOMVERTEX(-10.0f, -10.0f, -10.0f, 0.0f, 2.0f); // 涥 pVertices[4] = CUSTOMVERTEX( 10.0f, 10.0f, 10.0f, 0.0f, 0.0f); pVertices[5] = CUSTOMVERTEX(-10.0f, 10.0f, 10.0f, 2.0f, 0.0f); pVertices[6] = CUSTOMVERTEX(-10.0f, -10.0f, 10.0f, 2.0f, 2.0f); pVertices[7] = CUSTOMVERTEX( 10.0f, -10.0f, 10.0f, 0.0f, 2.0f); // 涥 pVertices[8] = CUSTOMVERTEX(-10.0f, 10.0f, 10.0f, 0.0f, 0.0f); pVertices[9] = CUSTOMVERTEX( 10.0f, 10.0f, 10.0f, 2.0f, 0.0f); pVertices[10] = CUSTOMVERTEX( 10.0f, 10.0f, -10.0f, 2.0f, 2.0f); pVertices[11] = CUSTOMVERTEX(-10.0f, 10.0f, -10.0f, 0.0f, 2.0f); // 涥 pVertices[12] = CUSTOMVERTEX(-10.0f, -10.0f, -10.0f, 0.0f, 0.0f); pVertices[13] = CUSTOMVERTEX( 10.0f, -10.0f, -10.0f, 2.0f, 0.0f); pVertices[14] = CUSTOMVERTEX( 10.0f, -10.0f, 10.0f, 2.0f, 2.0f); pVertices[15] = CUSTOMVERTEX(-10.0f, -10.0f, 10.0f, 0.0f, 2.0f); // 涥 pVertices[16] = CUSTOMVERTEX(-10.0f, 10.0f, 10.0f, 0.0f, 0.0f); pVertices[17] = CUSTOMVERTEX(-10.0f, 10.0f, -10.0f, 1.0f, 0.0f); pVertices[18] = CUSTOMVERTEX(-10.0f, -10.0f, -10.0f, 1.0f, 1.0f); pVertices[19] = CUSTOMVERTEX(-10.0f, -10.0f, 10.0f, 0.0f, 1.0f); // Ҳ涥 pVertices[20] = CUSTOMVERTEX( 10.0f, 10.0f, -10.0f, 0.0f, 0.0f); pVertices[21] = CUSTOMVERTEX( 10.0f, 10.0f, 10.0f, 1.0f, 0.0f); pVertices[22] = CUSTOMVERTEX( 10.0f, -10.0f, 10.0f, 1.0f, 1.0f); pVertices[23] = CUSTOMVERTEX( 10.0f, -10.0f, -10.0f, 0.0f, 1.0f); g_pVertexBuffer->Unlock(); // WORD *pIndices = NULL; g_pIndexBuffer->Lock(0, 0, (void**)&pIndices, 0); // pIndices[0] = 0; pIndices[1] = 1; pIndices[2] = 2; pIndices[3] = 0; pIndices[4] = 2; pIndices[5] = 3; // pIndices[6] = 4; pIndices[7] = 5; pIndices[8] = 6; pIndices[9] = 4; pIndices[10] = 6; pIndices[11] = 7; // pIndices[12] = 8; pIndices[13] = 9; pIndices[14] = 10; pIndices[15] = 8; pIndices[16] = 10; pIndices[17] = 11; // pIndices[18] = 12; pIndices[19] = 13; pIndices[20] = 14; pIndices[21] = 12; pIndices[22] = 14; pIndices[23] = 15; // pIndices[24] = 16; pIndices[25] = 17; pIndices[26] = 18; pIndices[27] = 16; pIndices[28] = 18; pIndices[29] = 19; // Ҳ pIndices[30] = 20; pIndices[31] = 21; pIndices[32] = 22; pIndices[33] = 20; pIndices[34] = 22; pIndices[35] = 23; g_pIndexBuffer->Unlock(); //-------------------------------------------------------------------------------------- // IJ֮Ĵ //-------------------------------------------------------------------------------------- // D3DXCreateTextureFromFileEx(g_pd3dDevice, L"pal5q.jpg", 0, 0, 6, 0, D3DFMT_X8R8G8B8, D3DPOOL_MANAGED, D3DX_DEFAULT, D3DX_DEFAULT, 0xFF000000, 0, 0, &g_pMipTexture); // ò D3DMATERIAL9 mtrl; ::ZeroMemory(&mtrl, sizeof(mtrl)); mtrl.Ambient = D3DXCOLOR(1.0f, 1.0f, 1.0f, 1.0f); mtrl.Diffuse = D3DXCOLOR(1.0f, 1.0f, 1.0f, 1.0f); mtrl.Specular = D3DXCOLOR(1.0f, 1.0f, 1.0f, 1.0f); g_pd3dDevice->SetMaterial(&mtrl); // ʼȾ״̬ g_pd3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW); // g_pd3dDevice->SetRenderState(D3DRS_AMBIENT, D3DXCOLOR(1.0f, 1.0f, 1.0f, 1.0f)); //û //Թ g_pd3dDevice->SetSamplerState(0, D3DSAMP_MAXANISOTROPY, 3); g_pd3dDevice->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_ANISOTROPIC); g_pd3dDevice->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_ANISOTROPIC); // // g_pd3dDevice->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR); // g_pd3dDevice->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR); // // g_pd3dDevice->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_POINT); // g_pd3dDevice->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_POINT); // // g_pd3dDevice->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR); // g_pd3dDevice->SetSamplerState(0, D3DSAMP_MAXMIPLEVEL, 16); return S_OK; } //-----------------------------------Matrix_Set( )-------------------------------------- // װDirect3DĴ任ĺ任ȡ任ͶӰ任ӿڱ任 //-------------------------------------------------------------------------------------------------- void Matrix_Set() { //-------------------------------------------------------------------------------------- //Ĵ任֮һ任 //-------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------- //Ĵ任֮ȡ任 //-------------------------------------------------------------------------------------- D3DXMATRIX matView; //һ D3DXVECTOR3 vEye(0.0f, 0.0f, -50.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, 1000.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( )-------------------------------- // ǼʱȾ뵫Ҫʱõģ簴ĸģ //-------------------------------------------------------------------------------------------------- void Direct3D_Update( HWND hwnd) { //ʹDirectInputȡ g_pDInput->GetInput(); // ݼ̰İ£ΪѰַʽ if (g_pDInput->IsKeyDown(DIK_1)) //1 { // ظѰַģʽ g_pd3dDevice->SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_WRAP); g_pd3dDevice->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_WRAP); } if (g_pDInput->IsKeyDown(DIK_2)) //2 { // þѰַģʽ g_pd3dDevice->SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_MIRROR); g_pd3dDevice->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_MIRROR); } if (g_pDInput->IsKeyDown(DIK_3)) //3 { // üȡѰַģʽ g_pd3dDevice->SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP); g_pd3dDevice->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP); } if (g_pDInput->IsKeyDown(DIK_4)) //4 { // ñ߿Ѱַģʽ g_pd3dDevice->SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_BORDER); g_pd3dDevice->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_BORDER); } // ס϶ΪƽƲ 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 = D3DX_PI/6, fAngleY =D3DX_PI/6 ; 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);// Matrix_Set(); } //-----------------------------------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(); // ʼ //-------------------------------------------------------------------------------------- // Direct3DȾ岽֮ʽƣö㻺ͼ //-------------------------------------------------------------------------------------- g_pd3dDevice->SetStreamSource( 0, g_pVertexBuffer, 0, sizeof(CUSTOMVERTEX) );//ѰļϢĶ㻺Ⱦˮ g_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX );//ָʹõʽĺ g_pd3dDevice->SetIndices(g_pIndexBuffer);// //-------------------------------------------------------------------------------------- // IJ֮ġ //-------------------------------------------------------------------------------------- g_pd3dDevice->SetTexture(0, g_pMipTexture); // g_pd3dDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, 24, 0, 12);//϶㻺ͼ //ڴϽǴʾÿ֡ 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" WSADƽģ ", -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,2,3,4ּѰַģʽ֮л ", -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_DELETE(g_pDInput); SAFE_RELEASE(g_pVertexBuffer) SAFE_RELEASE(g_pIndexBuffer) SAFE_RELEASE(g_pMipTexture) SAFE_RELEASE(g_pTextAdaperName) SAFE_RELEASE(g_pTextHelper) SAFE_RELEASE(g_pTextInfor) SAFE_RELEASE(g_pTextFPS) SAFE_RELEASE(g_pd3dDevice) } ================================================ FILE: Direct3D-Game-Demo/D3Ddemo11/DirectInputClass.cpp ================================================ //============================================================================= // Desc: DirectInput봦Դļ // 2013 203 Create by dzī //============================================================================= #include "DirectInputClass.h" //----------------------------------------------------------------------------- // Desc: 캯 //----------------------------------------------------------------------------- DInputClass::DInputClass() { m_pDirectInput = NULL; m_KeyboardDevice = NULL; ZeroMemory(m_keyBuffer,sizeof(char)*256); m_MouseDevice= NULL; ZeroMemory(&m_MouseState, sizeof(m_MouseState)); } //----------------------------------------------------------------------------- // NameDInputClass::Init( // Desc: ʼDirectInput̼豸 //----------------------------------------------------------------------------- HRESULT DInputClass::Init( HWND hWnd,HINSTANCE hInstance,DWORD keyboardCoopFlags, DWORD mouseCoopFlags ) { HRESULT hr; //ʼһIDirectInput8ӿڶ HR(DirectInput8Create( hInstance, DIRECTINPUT_VERSION, IID_IDirectInput8,(void**)&m_pDirectInput,NULL )); //м豸ijʼ HR( m_pDirectInput->CreateDevice( GUID_SysKeyboard, &m_KeyboardDevice, NULL )); HR( m_KeyboardDevice->SetCooperativeLevel( hWnd, keyboardCoopFlags)); HR( m_KeyboardDevice->SetDataFormat( &c_dfDIKeyboard )); HR( m_KeyboardDevice->Acquire( )); HR( m_KeyboardDevice->Poll( )); //豸ijʼ 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; } //----------------------------------------------------------------------------- // NameDInputClass::GetInput() // Desc: ڻȡϢĺ //----------------------------------------------------------------------------- void DInputClass::GetInput() { 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); } } //----------------------------------------------------------------------------- // NameDInputClass::IsKeyDown() // Desc: жϼijǷ //----------------------------------------------------------------------------- bool DInputClass::IsKeyDown(int iKey) { if(m_keyBuffer[iKey] & 0x80) return true; else return false; } //----------------------------------------------------------------------------- // NameDInputClass::IsMouseButtonDown() // Desc: жijǷ //----------------------------------------------------------------------------- bool DInputClass::IsMouseButtonDown(int button) { return (m_MouseState.rgbButtons[button] & 0x80) != 0; } //----------------------------------------------------------------------------- // NameDInputClass::MouseDX // Desc: ָXֵ //----------------------------------------------------------------------------- float DInputClass::MouseDX() { return (float)m_MouseState.lX; } //----------------------------------------------------------------------------- // NameDInputClass::MouseDY // Desc: ָYֵ //----------------------------------------------------------------------------- float DInputClass::MouseDY() { return (float)m_MouseState.lY; } //----------------------------------------------------------------------------- // NameDInputClass::MouseDZ // Desc: ָZֵ֣ //----------------------------------------------------------------------------- float DInputClass::MouseDZ() { return (float)m_MouseState.lZ; } //----------------------------------------------------------------------------- // Desc: //----------------------------------------------------------------------------- DInputClass::~DInputClass(void) { 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); } ================================================ FILE: Direct3D-Game-Demo/D3Ddemo11/DirectInputClass.h ================================================ //============================================================================= // Name: DirectInputClass.h // Des: װDirectInput봦ͷļ // 2013 203 Create by dzī //============================================================================= #pragma once #include "D3DUtil.h" #define DIRECTINPUT_VERSION 0x0800 #include //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); //жϼijǷ bool IsMouseButtonDown(int button); //ж갴Ƿ񱻰 float MouseDX(); //Xֵ float MouseDY(); //Yֵ float MouseDZ(); //Zֵ public: DInputClass(void); //캯 ~DInputClass(void); // }; ================================================ FILE: Direct3D-Game-Demo/D3Ddemo12/D3DUtil.h ================================================ //***************************************************************************************** // Desc: D3DUtil.hͷļڹĶ // 2013 203 Create by dzī //***************************************************************************************** #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 ================================================ FILE: Direct3D-Game-Demo/D3Ddemo12/D3Ddemo12.cpp ================================================ //-----------------------------------˵---------------------------------------------- // :D3Ddemo12 // 20134 Create by dzī // ģͺXļʹ ʾ // ͼزģ ɽǰ //------------------------------------------------------------------------------------------------ //-----------------------------------궨岿֡-------------------------------------------- // һЩ //------------------------------------------------------------------------------------------------ #define WINDOW_WIDTH 800 //Ϊڿȶĺ꣬Էڴ˴޸Ĵڿ #define WINDOW_HEIGHT 600 //Ϊڸ߶ȶĺ꣬Էڴ˴޸Ĵڸ߶ #define WINDOW_TITLE _T("ϨϷ롿 ģͺXļʹ ʾ") //Ϊڱⶨĺ //-----------------------------------ͷļ֡--------------------------------------- // ͷļ //------------------------------------------------------------------------------------------------ #include #include #include #include #include "DirectInputClass.h" //-----------------------------------ļ֡--------------------------------------- // Ŀļ //------------------------------------------------------------------------------------------------ #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; // IJϢ 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Ӧóںǵij↑ʼ //------------------------------------------------------------------------------------------------ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nShowCmd) { //1ڴIJ֮һʼһĴ 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; //ָڹ̵ijʵ 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ڴIJ֮עᴰ if( !RegisterClassEx( &wndClass ) ) //괰ںҪԴעᣬܴ͵Ĵ return -1; //3ڴIJ֮ʽ HWND hwnd = CreateWindow( L"ForTheDreamOfGameDevelop",WINDOW_TITLE, //ϲּĴںCreateWindow WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, WINDOW_WIDTH, WINDOW_HEIGHT, NULL, NULL, hInstance, NULL ); //Direct3DԴijʼʧmessageboxʾ if (!(S_OK==Direct3D_Init (hwnd,hInstance))) { MessageBox(hwnd, _T("Direct3Dʼʧ~"), _T("dzīϢ"), 0); //ʹMessageBoxһϢ } //4ڴIJ֮ģڵƶʾ MoveWindow(hwnd,250,80,WINDOW_WIDTH,WINDOW_HEIGHT,true); //ʾʱλãʹϽλڣ250,80 ShowWindow( hwnd, nShowCmd ); //ShowWindowʾ UpdateWindow(hwnd); //Դڽи£·Ҫװһ //DirectInputijʼ g_pDInput = new DInputClass(); 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_CleanUpCOMӿڶ PostQuitMessage( 0 ); //ϵͳиֹ߳ӦWM_DESTROYϢ break; //switch default: //caseϣִиdefault return DefWindowProc( hwnd, message, wParam, lParam ); //ȱʡĴڹΪӦóûдĴϢṩȱʡĴ } return 0; //˳ } //-----------------------------------Direct3D_Init( )---------------------------------- // Direct3DʼDirect3Dijʼ //------------------------------------------------------------------------------------------------ HRESULT Direct3D_Init(HWND hwnd,HINSTANCE hInstance) { //-------------------------------------------------------------------------------------- // Direct3DʼIJ֮һӿڡDirect3Dӿڶ, ԱøDirect3D󴴽Direct3D豸 //-------------------------------------------------------------------------------------- LPDIRECT3D9 pD3D = NULL; //Direct3DӿڶĴ if( NULL == ( pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) ) //ʼDirect3Dӿڶ󣬲DirectX汾Э return E_FAIL; //-------------------------------------------------------------------------------------- // Direct3DʼIJ֮,ȡϢȡӲ豸Ϣ //-------------------------------------------------------------------------------------- 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ʼIJ֮ݡ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; d3dpp.EnableAutoDepthStencil = true; d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8; d3dpp.Flags = 0; d3dpp.FullScreen_RefreshRateInHz = 0; d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; //-------------------------------------------------------------------------------------- // Direct3DʼIJ֮ģ豸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( )-------------------------------------- // ȾԴʼڴ˺нҪȾԴijʼ //-------------------------------------------------------------------------------------------------- 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ļм LPD3DXBUFFER pAdjBuffer = NULL; LPD3DXBUFFER pMtrlBuffer = NULL; D3DXLoadMeshFromX(L"miki.X", D3DXMESH_MANAGED, g_pd3dDevice, &pAdjBuffer, &pMtrlBuffer, NULL, &g_dwNumMtrls, &g_pMesh); // ȡʺ D3DXMATERIAL *pMtrls = (D3DXMATERIAL*)pMtrlBuffer->GetBufferPointer(); //һD3DXMATERIALṹڶȡʺϢ g_pMaterials = new D3DMATERIAL9[g_dwNumMtrls]; g_pTextures = new LPDIRECT3DTEXTURE9[g_dwNumMtrls]; for (DWORD i=0; iSetLight(0, &light); g_pd3dDevice->LightEnable(0, true); g_pd3dDevice->SetRenderState(D3DRS_NORMALIZENORMALS, true); g_pd3dDevice->SetRenderState(D3DRS_SPECULARENABLE, true); // Ⱦ״̬ g_pd3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW); // return S_OK; } //-----------------------------------Matrix_Set( )-------------------------------------- // װDirect3DĴ任ĺ任ȡ任ͶӰ任ӿڱ任 //-------------------------------------------------------------------------------------------------- void Matrix_Set() { //-------------------------------------------------------------------------------------- //Ĵ任֮һ任 //-------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------- //Ĵ任֮ȡ任 //-------------------------------------------------------------------------------------- D3DXMATRIX matView; //һ D3DXVECTOR3 vEye(0.0f, 0.0f, -250.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, 1000.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( )-------------------------------- // ǼʱȾ뵫Ҫʱõģ簴ĸģ //-------------------------------------------------------------------------------------------------- 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, fAngleY =0; 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); Matrix_Set(); } //-----------------------------------Direct3D_Render( )------------------------------- // ʹDirect3DȾ //-------------------------------------------------------------------------------------------------- void Direct3D_Render(HWND hwnd) { //-------------------------------------------------------------------------------------- // Direct3DȾ岽֮һ //-------------------------------------------------------------------------------------- g_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(150, 150, 100), 1.0f, 0); //һΣڻȡھ RECT formatRect; GetClientRect(hwnd, &formatRect); //-------------------------------------------------------------------------------------- // Direct3DȾ岽֮ʼ //-------------------------------------------------------------------------------------- g_pd3dDevice->BeginScene(); // ʼ //-------------------------------------------------------------------------------------- // Direct3DȾ岽֮ʽ //-------------------------------------------------------------------------------------- // һforѭֵĻ 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); } //ڴϽǴʾÿ֡ formatRect.top = 5; 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" WSADƽģ ", -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ӿڶ for (DWORD i = 0; iCreateDevice( GUID_SysKeyboard, &m_KeyboardDevice, NULL )); HR( m_KeyboardDevice->SetCooperativeLevel( hWnd, keyboardCoopFlags)); HR( m_KeyboardDevice->SetDataFormat( &c_dfDIKeyboard )); HR( m_KeyboardDevice->Acquire( )); HR( m_KeyboardDevice->Poll( )); //豸ijʼ 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; } //----------------------------------------------------------------------------- // NameDInputClass::GetInput() // Desc: ڻȡϢĺ //----------------------------------------------------------------------------- void DInputClass::GetInput() { 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); } } //----------------------------------------------------------------------------- // NameDInputClass::IsKeyDown() // Desc: жϼijǷ //----------------------------------------------------------------------------- bool DInputClass::IsKeyDown(int iKey) { if(m_keyBuffer[iKey] & 0x80) return true; else return false; } //----------------------------------------------------------------------------- // NameDInputClass::IsMouseButtonDown() // Desc: жijǷ //----------------------------------------------------------------------------- bool DInputClass::IsMouseButtonDown(int button) { return (m_MouseState.rgbButtons[button] & 0x80) != 0; } //----------------------------------------------------------------------------- // NameDInputClass::MouseDX // Desc: ָXֵ //----------------------------------------------------------------------------- float DInputClass::MouseDX() { return (float)m_MouseState.lX; } //----------------------------------------------------------------------------- // NameDInputClass::MouseDY // Desc: ָYֵ //----------------------------------------------------------------------------- float DInputClass::MouseDY() { return (float)m_MouseState.lY; } //----------------------------------------------------------------------------- // NameDInputClass::MouseDZ // Desc: ָZֵ֣ //----------------------------------------------------------------------------- float DInputClass::MouseDZ() { return (float)m_MouseState.lZ; } //----------------------------------------------------------------------------- // Desc: //----------------------------------------------------------------------------- DInputClass::~DInputClass(void) { 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); } ================================================ FILE: Direct3D-Game-Demo/D3Ddemo12/DirectInputClass.h ================================================ //============================================================================= // Name: DirectInputClass.h // Des: װDirectInput봦ͷļ // 2013 203 Create by dzī //============================================================================= #pragma once #include "D3DUtil.h" #define DIRECTINPUT_VERSION 0x0800 #include //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); //жϼijǷ bool IsMouseButtonDown(int button); //ж갴Ƿ񱻰 float MouseDX(); //Xֵ float MouseDY(); //Yֵ float MouseDZ(); //Zֵ public: DInputClass(void); //캯 ~DInputClass(void); // }; ================================================ FILE: Direct3D-Game-Demo/D3Ddemo13/D3DUtil.h ================================================ //***************************************************************************************** // Desc: D3DUtil.hͷļڹĶ // 2013 203 Create by dzī //***************************************************************************************** #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 ================================================ FILE: Direct3D-Game-Demo/D3Ddemo13/D3Ddemo13.cpp ================================================ //-----------------------------------˵---------------------------------------------- // :D3Ddemo13 // 20134 Create by dzī // ˮ齻ڵalphaϼ ʾ //------------------------------------------------------------------------------------------------ //-----------------------------------궨岿֡-------------------------------------------- // һЩ //------------------------------------------------------------------------------------------------ #define SCREEN_WIDTH 800 //Ϊڿȶĺ꣬Էڴ˴޸Ĵڿ #define SCREEN_HEIGHT 600 //Ϊڸ߶ȶĺ꣬Էڴ˴޸Ĵڸ߶ #define WINDOW_TITLE _T("ϨϷ롿 ˮ齻ڵalphaϼ ʾ") //Ϊڱⶨĺ //-----------------------------------ͷļ֡--------------------------------------- // ͷļ //------------------------------------------------------------------------------------------------ #include #include #include #include #include "DirectInputClass.h" //-----------------------------------ļ֡--------------------------------------- // Ŀļ //------------------------------------------------------------------------------------------------ #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; // IJϢ 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Ӧóںǵij↑ʼ //------------------------------------------------------------------------------------------------ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nShowCmd) { //ʼһĴ WNDCLASSEX wndClass = { 0 }; //WINDCLASSEXһ࣬wndClassʵWINDCLASSEX֮󴰿ڵĸʼ wndClass.cbSize = sizeof( WNDCLASSEX ) ; //ýṹֽС wndClass.style = CS_HREDRAW | CS_VREDRAW; //ôڵʽ wndClass.lpfnWndProc = WndProc; //ָ򴰿ڹָ̺ wndClass.cbClsExtra = 0; wndClass.cbWndExtra = 0; wndClass.hInstance = hInstance; //ָڹ̵ijʵ wndClass.hIcon=(HICON)::LoadImage(NULL,_T("icon.ico"),IMAGE_ICON,0,0,LR_DEFAULTSIZE|LR_LOADFROMFILE); //ȫֵ::LoadImageӱؼԶicoͼ wndClass.hCursor = LoadCursor( NULL, IDC_ARROW ); //ָĹ wndClass.hbrBackground=(HBRUSH)GetStockObject(GRAY_BRUSH); //ΪhbrBackgroundԱָһɫˢ wndClass.lpszMenuName = NULL; //һԿַָֹ˵Դ֡ wndClass.lpszClassName = _T("ForTheDreamOfGameDevelop"); //һԿַָֹ֡ if( !RegisterClassEx( &wndClass ) ) //괰ںҪԴעᣬܴ͵Ĵ return -1; HWND hwnd = CreateWindow( _T("ForTheDreamOfGameDevelop"),WINDOW_TITLE, //ϲּĴںCreateWindow WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, SCREEN_WIDTH, SCREEN_HEIGHT, NULL, NULL, hInstance, NULL ); //Direct3DԴijʼʧmessageboxʾ if (!(S_OK==Direct3D_Init (hwnd,hInstance))) { MessageBox(hwnd, _T("Direct3Dʼʧ~"), _T("dzīϢ"), 0); //ʹMessageBoxһϢ } PlaySound(L"ɽ¥.wav", NULL, SND_FILENAME | SND_ASYNC|SND_LOOP); //ѭű MoveWindow(hwnd,200,50,SCREEN_WIDTH,SCREEN_HEIGHT,true); //ʾʱλãϽλĻ꣨20050 ShowWindow( hwnd, nShowCmd ); //Win32ShowWindowʾ UpdateWindow(hwnd); //Դڽи£·Ҫװһ //DirectInputijʼ g_pDInput = new DInputClass(); g_pDInput->Init(hwnd,hInstance,DISCL_FOREGROUND | DISCL_NONEXCLUSIVE,DISCL_FOREGROUND | DISCL_NONEXCLUSIVE); //Ϣѭ 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); //ȾлȾ } } UnregisterClass(_T("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_CleanUpCOMӿڶ PostQuitMessage( 0 ); //ϵͳиֹ߳ӦWM_DESTROYϢ break; //switch default: //caseϣִиdefault return DefWindowProc( hwnd, message, wParam, lParam ); //ȱʡĴڹΪӦóûдĴϢṩȱʡĴ } return 0; //˳ } //-----------------------------------Direct3D_Init( )---------------------------------- // Direct3DʼDirect3Dijʼ //------------------------------------------------------------------------------------------------ HRESULT Direct3D_Init(HWND hwnd,HINSTANCE hInstance) { //-------------------------------------------------------------------------------------- // Direct3DʼIJ֮һӿڡDirect3Dӿڶ, ԱøDirect3D󴴽Direct3D豸 //-------------------------------------------------------------------------------------- LPDIRECT3D9 pD3D = NULL; //Direct3DӿڶĴ if( NULL == ( pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) ) //ʼDirect3Dӿڶ󣬲DirectX汾Э return E_FAIL; //-------------------------------------------------------------------------------------- // Direct3DʼIJ֮,ȡϢȡӲ豸Ϣ //-------------------------------------------------------------------------------------- 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ʼIJ֮ݡD3DPRESENT_PARAMETERSṹ //-------------------------------------------------------------------------------------- D3DPRESENT_PARAMETERS d3dpp; ZeroMemory(&d3dpp, sizeof(d3dpp)); d3dpp.BackBufferWidth = SCREEN_WIDTH; d3dpp.BackBufferHeight = SCREEN_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; d3dpp.EnableAutoDepthStencil = true; d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8; d3dpp.Flags = 0; d3dpp.FullScreen_RefreshRateInHz = 0; d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; //-------------------------------------------------------------------------------------- // Direct3DʼIJ֮ģ豸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( )-------------------------------------- // ȾԴʼڴ˺нҪȾԴijʼ //-------------------------------------------------------------------------------------------------- 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ļм LPD3DXBUFFER pAdjBuffer = NULL; LPD3DXBUFFER pMtrlBuffer = NULL; D3DXLoadMeshFromX(L"65.X", D3DXMESH_MANAGED, g_pd3dDevice, &pAdjBuffer, &pMtrlBuffer, NULL, &g_dwNumMtrls, &g_pMesh); // ȡʺ D3DXMATERIAL *pMtrls = (D3DXMATERIAL*)pMtrlBuffer->GetBufferPointer(); //һD3DXMATERIALṹڶȡʺϢ g_pMaterials = new D3DMATERIAL9[g_dwNumMtrls]; g_pTextures = new LPDIRECT3DTEXTURE9[g_dwNumMtrls]; for (DWORD i=0; iSetLight(0, &light); g_pd3dDevice->LightEnable(0, true); g_pd3dDevice->SetRenderState(D3DRS_NORMALIZENORMALS, true); g_pd3dDevice->SetRenderState(D3DRS_SPECULARENABLE, true); // Ⱦ״̬ g_pd3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW); // g_pd3dDevice->SetRenderState(D3DRS_ZFUNC, D3DCMP_LESS); //ȲԺΪD3DCMP_LESS g_pd3dDevice->SetRenderState(D3DRS_ZWRITEENABLE, true); //ȲԳɹ󣬸Ȼ // ֮һAlphaں g_pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, true); //֮ں g_pd3dDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); g_pd3dDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA); //֮ں㷽ʽ g_pd3dDevice->SetRenderState(D3DRS_BLENDOP, D3DBLENDOP_ADD); //㷽ʽΪD3DBLENDOP_ADDĴDirect3DĬΪдˣע͵Ҳû return S_OK; } //-----------------------------------Matrix_Set( )-------------------------------------- // װDirect3DĴ任ĺ任ȡ任ͶӰ任ӿڱ任 //-------------------------------------------------------------------------------------------------- void Matrix_Set() { //-------------------------------------------------------------------------------------- //Ĵ任֮ȡ任 //-------------------------------------------------------------------------------------- D3DXMATRIX matView; //һ D3DXVECTOR3 vEye(0.0f, 100.0f, -200.0f); //λ D3DXVECTOR3 vAt(0.0f, 35.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)SCREEN_WIDTH/SCREEN_HEIGHT),1.0f, 1000.0f); //ͶӰ任 g_pd3dDevice->SetTransform(D3DTS_PROJECTION, &matProj); //ͶӰ任 //-------------------------------------------------------------------------------------- //Ĵ任֮ġӿڱ任 //-------------------------------------------------------------------------------------- D3DVIEWPORT9 vp; //ʵһD3DVIEWPORT9ṹ壬ȻֵͿ vp.X = 0; //ʾӿڴڵX vp.Y = 0; //ӿԶԴڵY vp.Width = SCREEN_WIDTH; //ӿڵĿ vp.Height = SCREEN_HEIGHT; //ӿڵĸ߶ vp.MinZ = 0.0f; //ӿȻеСֵ vp.MaxZ = 1.0f; //ӿȻеֵ g_pd3dDevice->SetViewport(&vp); //ӿڵ } //-----------------------------------Direct3D_Update( )-------------------------------- // ǼʱȾ뵫Ҫʱõģ簴ĸģ //-------------------------------------------------------------------------------------------------- void Direct3D_Update( HWND hwnd) { //ʹDirectInputȡ g_pDInput->GetInput(); //ͨİAlphaֵı仯 if (g_pDInput->IsKeyDown(DIK_1)) //1 { for (DWORD i=0; iIsKeyDown(DIK_2)) //1 { for (DWORD i=0; iIsMouseButtonDown(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, fAngleY =0; 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; Matrix_Set(); } //-----------------------------------Direct3D_Render( )------------------------------- // ʹDirect3DȾ //-------------------------------------------------------------------------------------------------- void Direct3D_Render(HWND hwnd) { //-------------------------------------------------------------------------------------- // Direct3DȾ岽֮һ //-------------------------------------------------------------------------------------- g_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(160, 150, 150), 1.0f, 0); //һΣڻȡھ RECT formatRect; GetClientRect(hwnd, &formatRect); //-------------------------------------------------------------------------------------- // Direct3DȾ岽֮ʼ //-------------------------------------------------------------------------------------- g_pd3dDevice->BeginScene(); // ʼ //-------------------------------------------------------------------------------------- // Direct3DȾ岽֮ʽ //-------------------------------------------------------------------------------------- //3Dģ g_pd3dDevice->SetTransform(D3DTS_WORLD, &g_matWorld);//ģ͵Ϊ׼ // һforѭģ͵ֵĻ for (DWORD i = 0; i < g_dwNumMtrls; i++) { g_pd3dDevice->SetMaterial(&g_pMaterials[i]); //ô˲ֵIJ g_pd3dDevice->SetTexture(0, g_pTextures[i]);//ô˲ֵ g_pMesh->DrawSubset(i); //ƴ˲ } //ڴϽǴʾÿ֡ formatRect.top = 5; 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" ּ12СʵAlphaֵ", -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" ֣ģ", -1, &formatRect, DT_SINGLELINE | DT_NOCLIP | DT_LEFT, D3DCOLOR_RGBA(255,200,0,255)); formatRect.top += 25; g_pTextHelper->DrawText(NULL, L" WSADƽģ ", -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ӿڶ for (DWORD i = 0; iCreateDevice( GUID_SysKeyboard, &m_KeyboardDevice, NULL )); HR( m_KeyboardDevice->SetCooperativeLevel( hWnd, keyboardCoopFlags)); HR( m_KeyboardDevice->SetDataFormat( &c_dfDIKeyboard )); HR( m_KeyboardDevice->Acquire( )); HR( m_KeyboardDevice->Poll( )); //豸ijʼ 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; } //----------------------------------------------------------------------------- // NameDInputClass::GetInput() // Desc: ڻȡϢĺ //----------------------------------------------------------------------------- void DInputClass::GetInput() { 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); } } //----------------------------------------------------------------------------- // NameDInputClass::IsKeyDown() // Desc: жϼijǷ //----------------------------------------------------------------------------- bool DInputClass::IsKeyDown(int iKey) { if(m_keyBuffer[iKey] & 0x80) return true; else return false; } //----------------------------------------------------------------------------- // NameDInputClass::IsMouseButtonDown() // Desc: жijǷ //----------------------------------------------------------------------------- bool DInputClass::IsMouseButtonDown(int button) { return (m_MouseState.rgbButtons[button] & 0x80) != 0; } //----------------------------------------------------------------------------- // NameDInputClass::MouseDX // Desc: ָXֵ //----------------------------------------------------------------------------- float DInputClass::MouseDX() { return (float)m_MouseState.lX; } //----------------------------------------------------------------------------- // NameDInputClass::MouseDY // Desc: ָYֵ //----------------------------------------------------------------------------- float DInputClass::MouseDY() { return (float)m_MouseState.lY; } //----------------------------------------------------------------------------- // NameDInputClass::MouseDZ // Desc: ָZֵ֣ //----------------------------------------------------------------------------- float DInputClass::MouseDZ() { return (float)m_MouseState.lZ; } //----------------------------------------------------------------------------- // Desc: //----------------------------------------------------------------------------- DInputClass::~DInputClass(void) { 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); } ================================================ FILE: Direct3D-Game-Demo/D3Ddemo13/DirectInputClass.h ================================================ //============================================================================= // Name: DirectInputClass.h // Des: װDirectInput봦ͷļ // 2013 203 Create by dzī //============================================================================= #pragma once #include "D3DUtil.h" #define DIRECTINPUT_VERSION 0x0800 #include //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); //жϼijǷ bool IsMouseButtonDown(int button); //ж갴Ƿ񱻰 float MouseDX(); //Xֵ float MouseDY(); //Yֵ float MouseDZ(); //Zֵ public: DInputClass(void); //캯 ~DInputClass(void); // }; ================================================ FILE: Direct3D-Game-Demo/D3Ddemo14/D3DUtil.h ================================================ //***************************************************************************************** // Desc: D3DUtil.hͷļڹĶ // 2013 203 Create by dzī //***************************************************************************************** #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 ================================================ FILE: Direct3D-Game-Demo/D3Ddemo14/D3Ddemo14.cpp ================================================ //-----------------------------------˵---------------------------------------------- // :D3Ddemo13 // 20134 Create by dzī // ˮ齻ڵalphaϼ ʾ //------------------------------------------------------------------------------------------------ //-----------------------------------궨岿֡-------------------------------------------- // һЩ //------------------------------------------------------------------------------------------------ #define WINDOW_WIDTH 800 //Ϊڿȶĺ꣬Էڴ˴޸Ĵڿ #define WINDOW_HEIGHT 600 //Ϊڸ߶ȶĺ꣬Էڴ˴޸Ĵڸ߶ #define WINDOW_TITLE _T("ϨϷ롿 ȲZ ʾ") //Ϊڱⶨĺ //-----------------------------------ͷļ֡--------------------------------------- // ͷļ //------------------------------------------------------------------------------------------------ #include #include #include #include #include "DirectInputClass.h" //-----------------------------------ļ֡--------------------------------------- // Ŀļ //------------------------------------------------------------------------------------------------ #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; // IJϢ LPDIRECT3DTEXTURE9* g_pTextures = NULL; // Ϣ DWORD g_dwNumMtrls = 0; // ʵĿ LPD3DXMESH g_pMeshWall = NULL; // ǽ D3DMATERIAL9 g_MaterialsWall; // //-----------------------------------ȫֺ֡------------------------------------- // ȫֺֹδıʶϵд //------------------------------------------------------------------------------------------------ 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Ӧóںǵij↑ʼ //------------------------------------------------------------------------------------------------ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nShowCmd) { //ʼһĴ WNDCLASSEX wndClass = { 0 }; //WINDCLASSEXһ࣬wndClassʵWINDCLASSEX֮󴰿ڵĸʼ wndClass.cbSize = sizeof( WNDCLASSEX ) ; //ýṹֽС wndClass.style = CS_HREDRAW | CS_VREDRAW; //ôڵʽ wndClass.lpfnWndProc = WndProc; //ָ򴰿ڹָ̺ wndClass.cbClsExtra = 0; wndClass.cbWndExtra = 0; wndClass.hInstance = hInstance; //ָڹ̵ijʵ wndClass.hIcon=(HICON)::LoadImage(NULL,_T("icon.ico"),IMAGE_ICON,0,0,LR_DEFAULTSIZE|LR_LOADFROMFILE); //ȫֵ::LoadImageӱؼԶicoͼ wndClass.hCursor = LoadCursor( NULL, IDC_ARROW ); //ָĹ wndClass.hbrBackground=(HBRUSH)GetStockObject(GRAY_BRUSH); //ΪhbrBackgroundԱָһɫˢ wndClass.lpszMenuName = NULL; //һԿַָֹ˵Դ֡ wndClass.lpszClassName = _T("ForTheDreamOfGameDevelop"); //һԿַָֹ֡ if( !RegisterClassEx( &wndClass ) ) //괰ںҪԴעᣬܴ͵Ĵ return -1; HWND hwnd = CreateWindow( _T("ForTheDreamOfGameDevelop"),WINDOW_TITLE, //ϲּĴںCreateWindow WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, WINDOW_WIDTH, WINDOW_HEIGHT, NULL, NULL, hInstance, NULL ); //Direct3DԴijʼʧmessageboxʾ if (!(S_OK==Direct3D_Init (hwnd,hInstance))) { MessageBox(hwnd, _T("Direct3Dʼʧ~"), _T("dzīϢ"), 0); //ʹMessageBoxһϢ } PlaySound(L"A Watchful Guardian.wav", NULL, SND_FILENAME | SND_ASYNC|SND_LOOP); //ѭű MoveWindow(hwnd,200,50,WINDOW_WIDTH,WINDOW_HEIGHT,true); //ʾʱλãϽλĻ꣨20050 ShowWindow( hwnd, nShowCmd ); //Win32ShowWindowʾ UpdateWindow(hwnd); //Դڽи£·Ҫװһ //DirectInputijʼ g_pDInput = new DInputClass(); g_pDInput->Init(hwnd,hInstance,DISCL_FOREGROUND | DISCL_NONEXCLUSIVE,DISCL_FOREGROUND | DISCL_NONEXCLUSIVE); //Ϣѭ 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); //ȾлȾ } } UnregisterClass(_T("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_CleanUpCOMӿڶ PostQuitMessage( 0 ); //ϵͳиֹ߳ӦWM_DESTROYϢ break; //switch default: //caseϣִиdefault return DefWindowProc( hwnd, message, wParam, lParam ); //ȱʡĴڹΪӦóûдĴϢṩȱʡĴ } return 0; //˳ } //-----------------------------------Direct3D_Init( )---------------------------------- // Direct3DʼDirect3Dijʼ //------------------------------------------------------------------------------------------------ HRESULT Direct3D_Init(HWND hwnd,HINSTANCE hInstance) { //-------------------------------------------------------------------------------------- // Direct3DʼIJ֮һӿڡDirect3Dӿڶ, ԱøDirect3D󴴽Direct3D豸 //-------------------------------------------------------------------------------------- LPDIRECT3D9 pD3D = NULL; //Direct3DӿڶĴ if( NULL == ( pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) ) //ʼDirect3Dӿڶ󣬲DirectX汾Э return E_FAIL; //-------------------------------------------------------------------------------------- // Direct3DʼIJ֮,ȡϢȡӲ豸Ϣ //-------------------------------------------------------------------------------------- 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ʼIJ֮ݡ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; d3dpp.EnableAutoDepthStencil = true; d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8; d3dpp.Flags = 0; d3dpp.FullScreen_RefreshRateInHz = 0; d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; //-------------------------------------------------------------------------------------- // Direct3DʼIJ֮ģ豸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( )-------------------------------------- // ȾԴʼڴ˺нҪȾԴijʼ //-------------------------------------------------------------------------------------------------- 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ļм LPD3DXBUFFER pAdjBuffer = NULL; LPD3DXBUFFER pMtrlBuffer = NULL; D3DXLoadMeshFromX(L"SwordMan.X", D3DXMESH_MANAGED, g_pd3dDevice, &pAdjBuffer, &pMtrlBuffer, NULL, &g_dwNumMtrls, &g_pMesh); // ȡʺ D3DXMATERIAL *pMtrls = (D3DXMATERIAL*)pMtrlBuffer->GetBufferPointer(); //һD3DXMATERIALṹڶȡʺϢ g_pMaterials = new D3DMATERIAL9[g_dwNumMtrls]; g_pTextures = new LPDIRECT3DTEXTURE9[g_dwNumMtrls]; for (DWORD i=0; iSetLight(0, &light); g_pd3dDevice->LightEnable(0, true); g_pd3dDevice->SetRenderState(D3DRS_NORMALIZENORMALS, true); g_pd3dDevice->SetRenderState(D3DRS_SPECULARENABLE, true); // Ⱦ״̬ g_pd3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW); // g_pd3dDevice->SetRenderState(D3DRS_ZFUNC, D3DCMP_LESS); //ȲԺΪD3DCMP_LESS g_pd3dDevice->SetRenderState(D3DRS_ZWRITEENABLE, true); //ȲԳɹ󣬸Ȼ return S_OK; } //-----------------------------------Matrix_Set( )-------------------------------------- // װDirect3DĴ任ĺ任ȡ任ͶӰ任ӿڱ任 //-------------------------------------------------------------------------------------------------- void Matrix_Set() { //-------------------------------------------------------------------------------------- //Ĵ任֮ȡ任 //-------------------------------------------------------------------------------------- D3DXMATRIX matView; //һ D3DXVECTOR3 vEye(0.0f, 0.0f, -150.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, 1000.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( )-------------------------------- // ǼʱȾ뵫Ҫʱõģ簴ĸģ //-------------------------------------------------------------------------------------------------- void Direct3D_Update( HWND hwnd) { //ʹDirectInputȡ g_pDInput->GetInput(); // ߹رȲ if (g_pDInput->IsKeyDown(DIK_1)) //1Ȳ g_pd3dDevice->SetRenderState(D3DRS_ZENABLE, true); if (g_pDInput->IsKeyDown(DIK_2)) //2رȲ g_pd3dDevice->SetRenderState(D3DRS_ZENABLE, false); // ס϶ΪƽƲ static FLOAT fPosX = 0.0f, fPosY = -50.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, fAngleY =0; 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; Matrix_Set(); } //-----------------------------------Direct3D_Render( )------------------------------- // ʹDirect3DȾ //-------------------------------------------------------------------------------------------------- void Direct3D_Render(HWND hwnd) { //-------------------------------------------------------------------------------------- // Direct3DȾ岽֮һ //-------------------------------------------------------------------------------------- g_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(160, 100, 150), 1.0f, 0); //һΣڻȡھ RECT formatRect; GetClientRect(hwnd, &formatRect); //-------------------------------------------------------------------------------------- // Direct3DȾ岽֮ʼ //-------------------------------------------------------------------------------------- g_pd3dDevice->BeginScene(); // ʼ //-------------------------------------------------------------------------------------- // Direct3DȾ岽֮ʽ //-------------------------------------------------------------------------------------- //3Dģ g_pd3dDevice->SetTransform(D3DTS_WORLD, &g_matWorld);//ģ͵Ϊ׼ // һforѭģ͵ֵĻ for (DWORD i = 0; i < g_dwNumMtrls; i++) { g_pd3dDevice->SetMaterial(&g_pMaterials[i]); //ô˲ֵIJ g_pd3dDevice->SetTexture(0, g_pTextures[i]);//ô˲ֵ g_pMesh->DrawSubset(i); //ƴ˲ } // ǽ D3DXMATRIX matWorld; //һΪ׼Ϊǽ D3DXMatrixTranslation(&matWorld, 0.0f,0.0f,-50.0f);//ǽʼZΪ-50.0f g_pd3dDevice->SetTransform(D3DTS_WORLD, &matWorld);//ǽ g_pd3dDevice->SetMaterial(&g_MaterialsWall);//ò g_pMeshWall->DrawSubset(0); //ǽ //ڴϽǴʾÿ֡ formatRect.top = 5; 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" ּ12߹رȲ", -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" ֣ģ", -1, &formatRect, DT_SINGLELINE | DT_NOCLIP | DT_LEFT, D3DCOLOR_RGBA(255,200,0,255)); formatRect.top += 25; g_pTextHelper->DrawText(NULL, L" WSADƽģ ", -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ӿڶ for (DWORD i = 0; iCreateDevice( GUID_SysKeyboard, &m_KeyboardDevice, NULL )); HR( m_KeyboardDevice->SetCooperativeLevel( hWnd, keyboardCoopFlags)); HR( m_KeyboardDevice->SetDataFormat( &c_dfDIKeyboard )); HR( m_KeyboardDevice->Acquire( )); HR( m_KeyboardDevice->Poll( )); //豸ijʼ 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; } //----------------------------------------------------------------------------- // NameDInputClass::GetInput() // Desc: ڻȡϢĺ //----------------------------------------------------------------------------- void DInputClass::GetInput() { 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); } } //----------------------------------------------------------------------------- // NameDInputClass::IsKeyDown() // Desc: жϼijǷ //----------------------------------------------------------------------------- bool DInputClass::IsKeyDown(int iKey) { if(m_keyBuffer[iKey] & 0x80) return true; else return false; } //----------------------------------------------------------------------------- // NameDInputClass::IsMouseButtonDown() // Desc: жijǷ //----------------------------------------------------------------------------- bool DInputClass::IsMouseButtonDown(int button) { return (m_MouseState.rgbButtons[button] & 0x80) != 0; } //----------------------------------------------------------------------------- // NameDInputClass::MouseDX // Desc: ָXֵ //----------------------------------------------------------------------------- float DInputClass::MouseDX() { return (float)m_MouseState.lX; } //----------------------------------------------------------------------------- // NameDInputClass::MouseDY // Desc: ָYֵ //----------------------------------------------------------------------------- float DInputClass::MouseDY() { return (float)m_MouseState.lY; } //----------------------------------------------------------------------------- // NameDInputClass::MouseDZ // Desc: ָZֵ֣ //----------------------------------------------------------------------------- float DInputClass::MouseDZ() { return (float)m_MouseState.lZ; } //----------------------------------------------------------------------------- // Desc: //----------------------------------------------------------------------------- DInputClass::~DInputClass(void) { 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); } ================================================ FILE: Direct3D-Game-Demo/D3Ddemo14/DirectInputClass.h ================================================ //============================================================================= // Name: DirectInputClass.h // Des: װDirectInput봦ͷļ // 2013 203 Create by dzī //============================================================================= #pragma once #include "D3DUtil.h" #define DIRECTINPUT_VERSION 0x0800 #include //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); //жϼijǷ bool IsMouseButtonDown(int button); //ж갴Ƿ񱻰 float MouseDX(); //Xֵ float MouseDY(); //Yֵ float MouseDZ(); //Zֵ public: DInputClass(void); //캯 ~DInputClass(void); // }; ================================================ FILE: Direct3D-Game-Demo/D3Ddemo15/D3DUtil.h ================================================ //***************************************************************************************** // Desc: D3DUtil.hͷļڹĶ // 2013 203 Create by dzī //***************************************************************************************** #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 ================================================ FILE: Direct3D-Game-Demo/D3Ddemo15/D3Ddemo15.cpp ================================================ //-----------------------------------˵---------------------------------------------- // :D3Ddemo15 // 20134 Create by dzī // ʵϵĹӰ : ģ弼 ʾ //------------------------------------------------------------------------------------------------ //-----------------------------------궨岿֡-------------------------------------------- // һЩ //------------------------------------------------------------------------------------------------ #define SCREEN_WIDTH 800 //Ϊڿȶĺ꣬Էڴ˴޸Ĵڿ #define SCREEN_HEIGHT 600 //Ϊڸ߶ȶĺ꣬Էڴ˴޸Ĵڸ߶ #define WINDOW_TITLE _T("ϨϷ롿 ʵϵĹӰ : ģ弼 ʾ") //Ϊڱⶨĺ //-----------------------------------ͷļ֡--------------------------------------- // ͷļ //------------------------------------------------------------------------------------------------ #include #include #include #include #include "DirectInputClass.h" //-----------------------------------ļ֡--------------------------------------- // Ŀļ //------------------------------------------------------------------------------------------------ #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; // IJϢ LPDIRECT3DTEXTURE9* g_pTextures = NULL; // Ϣ DWORD g_dwNumMtrls = 0; // ʵĿ LPD3DXMESH g_pMeshWall = NULL; // ǽ D3DMATERIAL9 g_MaterialsWall; // //-----------------------------------ȫֺ֡------------------------------------- // ȫֺֹδıʶϵд //------------------------------------------------------------------------------------------------ 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Ӧóںǵij↑ʼ //------------------------------------------------------------------------------------------------ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nShowCmd) { //ʼһĴ WNDCLASSEX wndClass = { 0 }; //WINDCLASSEXһ࣬wndClassʵWINDCLASSEX֮󴰿ڵĸʼ wndClass.cbSize = sizeof( WNDCLASSEX ) ; //ýṹֽС wndClass.style = CS_HREDRAW | CS_VREDRAW; //ôڵʽ wndClass.lpfnWndProc = WndProc; //ָ򴰿ڹָ̺ wndClass.cbClsExtra = 0; wndClass.cbWndExtra = 0; wndClass.hInstance = hInstance; //ָڹ̵ijʵ wndClass.hIcon=(HICON)::LoadImage(NULL,_T("icon.ico"),IMAGE_ICON,0,0,LR_DEFAULTSIZE|LR_LOADFROMFILE); //ȫֵ::LoadImageӱؼԶicoͼ wndClass.hCursor = LoadCursor( NULL, IDC_ARROW ); //ָĹ wndClass.hbrBackground=(HBRUSH)GetStockObject(GRAY_BRUSH); //ΪhbrBackgroundԱָһɫˢ wndClass.lpszMenuName = NULL; //һԿַָֹ˵Դ֡ wndClass.lpszClassName = _T("ForTheDreamOfGameDevelop"); //һԿַָֹ֡ if( !RegisterClassEx( &wndClass ) ) //괰ںҪԴעᣬܴ͵Ĵ return -1; HWND hwnd = CreateWindow( _T("ForTheDreamOfGameDevelop"),WINDOW_TITLE, //ϲּĴںCreateWindow WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, SCREEN_WIDTH, SCREEN_HEIGHT, NULL, NULL, hInstance, NULL ); //Direct3DԴijʼʧmessageboxʾ if (!(S_OK==Direct3D_Init (hwnd,hInstance))) { MessageBox(hwnd, _T("Direct3Dʼʧ~"), _T("dzīϢ"), 0); //ʹMessageBoxһϢ } PlaySound(L"ɽս3.wav", NULL, SND_FILENAME | SND_ASYNC|SND_LOOP); //ѭű MoveWindow(hwnd,200,50,SCREEN_WIDTH,SCREEN_HEIGHT,true); //ʾʱλãϽλĻ꣨20050 ShowWindow( hwnd, nShowCmd ); //Win32ShowWindowʾ UpdateWindow(hwnd); //Դڽи£·Ҫװһ //DirectInputijʼ g_pDInput = new DInputClass(); g_pDInput->Init(hwnd,hInstance,DISCL_FOREGROUND | DISCL_NONEXCLUSIVE,DISCL_FOREGROUND | DISCL_NONEXCLUSIVE); //Ϣѭ 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); //ȾлȾ } } UnregisterClass(_T("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_CleanUpCOMӿڶ PostQuitMessage( 0 ); //ϵͳиֹ߳ӦWM_DESTROYϢ break; //switch default: //caseϣִиdefault return DefWindowProc( hwnd, message, wParam, lParam ); //ȱʡĴڹΪӦóûдĴϢṩȱʡĴ } return 0; //˳ } //-----------------------------------Direct3D_Init( )---------------------------------- // Direct3DʼDirect3Dijʼ //------------------------------------------------------------------------------------------------ HRESULT Direct3D_Init(HWND hwnd,HINSTANCE hInstance) { //-------------------------------------------------------------------------------------- // Direct3DʼIJ֮һӿڡDirect3Dӿڶ, ԱøDirect3D󴴽Direct3D豸 //-------------------------------------------------------------------------------------- LPDIRECT3D9 pD3D = NULL; //Direct3DӿڶĴ if( NULL == ( pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) ) //ʼDirect3Dӿڶ󣬲DirectX汾Э return E_FAIL; //-------------------------------------------------------------------------------------- // Direct3DʼIJ֮,ȡϢȡӲ豸Ϣ //-------------------------------------------------------------------------------------- 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ʼIJ֮ݡD3DPRESENT_PARAMETERSṹ //-------------------------------------------------------------------------------------- D3DPRESENT_PARAMETERS d3dpp; ZeroMemory(&d3dpp, sizeof(d3dpp)); d3dpp.BackBufferWidth = SCREEN_WIDTH; d3dpp.BackBufferHeight = SCREEN_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; d3dpp.EnableAutoDepthStencil = true; d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8; d3dpp.Flags = 0; d3dpp.FullScreen_RefreshRateInHz = 0; d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; //-------------------------------------------------------------------------------------- // Direct3DʼIJ֮ģ豸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( )-------------------------------------- // ȾԴʼڴ˺нҪȾԴijʼ //-------------------------------------------------------------------------------------------------- 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ļм LPD3DXBUFFER pAdjBuffer = NULL; LPD3DXBUFFER pMtrlBuffer = NULL; D3DXLoadMeshFromX(L"lighting.X", D3DXMESH_MANAGED, g_pd3dDevice, &pAdjBuffer, &pMtrlBuffer, NULL, &g_dwNumMtrls, &g_pMesh); // ȡʺ D3DXMATERIAL *pMtrls = (D3DXMATERIAL*)pMtrlBuffer->GetBufferPointer(); //һD3DXMATERIALṹڶȡʺϢ g_pMaterials = new D3DMATERIAL9[g_dwNumMtrls]; g_pTextures = new LPDIRECT3DTEXTURE9[g_dwNumMtrls]; for (DWORD i=0; iSetLight(0, &light); g_pd3dDevice->LightEnable(0, true); g_pd3dDevice->SetRenderState(D3DRS_NORMALIZENORMALS, true); g_pd3dDevice->SetRenderState(D3DRS_SPECULARENABLE, true); return S_OK; } //-----------------------------------Matrix_Set( )-------------------------------------- // װDirect3DĴ任ĺ任ȡ任ͶӰ任ӿڱ任 //-------------------------------------------------------------------------------------------------- void Matrix_Set() { //-------------------------------------------------------------------------------------- //Ĵ任֮ȡ任 //-------------------------------------------------------------------------------------- D3DXMATRIX matView; //һ D3DXVECTOR3 vEye(100.0f, 0.0f, -250.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)SCREEN_WIDTH/SCREEN_HEIGHT),1.0f, 1000.0f); //ͶӰ任 g_pd3dDevice->SetTransform(D3DTS_PROJECTION, &matProj); //ͶӰ任 //-------------------------------------------------------------------------------------- //Ĵ任֮ġӿڱ任 //-------------------------------------------------------------------------------------- D3DVIEWPORT9 vp; //ʵһD3DVIEWPORT9ṹ壬ȻֵͿ vp.X = 0; //ʾӿڴڵX vp.Y = 0; //ӿԶԴڵY vp.Width = SCREEN_WIDTH; //ӿڵĿ vp.Height = SCREEN_HEIGHT; //ӿڵĸ߶ vp.MinZ = 0.0f; //ӿȻеСֵ vp.MaxZ = 1.0f; //ӿȻеֵ g_pd3dDevice->SetViewport(&vp); //ӿڵ } //-----------------------------------Direct3D_Update( )-------------------------------- // ǼʱȾ뵫Ҫʱõģ簴ĸģ //-------------------------------------------------------------------------------------------------- void Direct3D_Update( HWND hwnd) { //ʹDirectInputȡ g_pDInput->GetInput(); // ߹رȲ if (g_pDInput->IsKeyDown(DIK_1)) //1Ȳ g_pd3dDevice->SetRenderState(D3DRS_ZENABLE, true); if (g_pDInput->IsKeyDown(DIK_2)) //2رȲ g_pd3dDevice->SetRenderState(D3DRS_ZENABLE, false); // ס϶ΪƽƲ static FLOAT fPosX = 0.0f, fPosY = -1.5f, 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, fAngleY =0; 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.05f; if (g_pDInput->IsKeyDown(DIK_DOWN)) fAngleX -= 0.05f; if (g_pDInput->IsKeyDown(DIK_LEFT)) fAngleY -= 0.05f; if (g_pDInput->IsKeyDown(DIK_RIGHT)) fAngleY += 0.05f; D3DXMATRIX Rx, Ry; D3DXMatrixRotationX(&Rx, fAngleX); D3DXMatrixRotationY(&Ry, fAngleY); g_matWorld = Rx * Ry * g_matWorld; Matrix_Set(); } //-----------------------------------Direct3D_Render( )------------------------------- // ʹDirect3DȾ //-------------------------------------------------------------------------------------------------- void Direct3D_Render(HWND hwnd) { //-------------------------------------------------------------------------------------- // Direct3DȾ岽֮һ //-------------------------------------------------------------------------------------- g_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER|D3DCLEAR_STENCIL, D3DCOLOR_XRGB(100, 150, 0), 1.0f, 0); //һΣڻȡھ RECT formatRect; GetClientRect(hwnd, &formatRect); //-------------------------------------------------------------------------------------- // Direct3DȾ岽֮ʼ //-------------------------------------------------------------------------------------- g_pd3dDevice->BeginScene(); // ʼ //-------------------------------------------------------------------------------------- // Direct3DȾ岽֮ʽ //-------------------------------------------------------------------------------------- D3DXMATRIX matHero,matWorld,matRotation; //һЩ //3Dģ D3DXMatrixTranslation(&matHero, -20.0f, 0.0f, -25.0f); matHero=matHero*g_matWorld; g_pd3dDevice->SetTransform(D3DTS_WORLD, &matHero);//ģ͵Ϊ׼ // һforѭģ͵ֵĻ for (DWORD i = 0; i < g_dwNumMtrls; i++) { g_pd3dDevice->SetMaterial(&g_pMaterials[i]); //ô˲ֵIJ g_pd3dDevice->SetTexture(0, g_pTextures[i]);//ô˲ֵ g_pMesh->DrawSubset(i); //ƴ˲ } // Ƴ D3DXMatrixTranslation(&matWorld, 0.0f,0.0f,0.0f);//ǽʼ g_pd3dDevice->SetTransform(D3DTS_WORLD, &matWorld);//ǽ g_pd3dDevice->SetMaterial(&g_MaterialsWall);//ò g_pMeshWall->DrawSubset(0); //ǽ //3. ģ建棬ԼصĻ״̬á g_pd3dDevice->SetRenderState(D3DRS_STENCILENABLE, true); g_pd3dDevice->SetRenderState(D3DRS_STENCILFUNC, D3DCMP_ALWAYS); g_pd3dDevice->SetRenderState(D3DRS_STENCILREF, 0x1); g_pd3dDevice->SetRenderState(D3DRS_STENCILMASK, 0xffffffff); g_pd3dDevice->SetRenderState(D3DRS_STENCILWRITEMASK, 0xffffffff); g_pd3dDevice->SetRenderState(D3DRS_STENCILPASS, D3DSTENCILOP_REPLACE); // 4.ںϲԼֹȻͺ̨д g_pd3dDevice->SetRenderState(D3DRS_ZWRITEENABLE, false); g_pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, true); g_pd3dDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ZERO); g_pd3dDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE); // 5.ƳΪ D3DXMatrixTranslation(&matWorld, 0.0f, 0.0f, 0.0f); g_pd3dDevice->SetTransform(D3DTS_WORLD, &matWorld); g_pd3dDevice->SetMaterial(&g_MaterialsWall); g_pMeshWall->DrawSubset(0); // 6.һϵȾ״̬뾵ں㣬һZ g_pd3dDevice->Clear(0, 0, D3DCLEAR_ZBUFFER, 0, 1.0f, 0); g_pd3dDevice->SetRenderState(D3DRS_ZWRITEENABLE, true); g_pd3dDevice->SetRenderState(D3DRS_STENCILFUNC, D3DCMP_EQUAL); g_pd3dDevice->SetRenderState(D3DRS_STENCILPASS, D3DSTENCILOP_KEEP); g_pd3dDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_DESTCOLOR); g_pd3dDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ZERO); g_pd3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CW); //7. 㾵任 D3DXMATRIX matReflect; D3DXPLANE planeXY(0.0f, 0.0f, 1.0f, 0.0f); // xyƽ D3DXMatrixReflect(&matReflect, &planeXY); matWorld = matReflect * matHero; //8.ƾе3Dģ g_pd3dDevice->SetTransform(D3DTS_WORLD, &matWorld);//ģ͵Ϊ׼ // һforѭģ͵ֵĻ for (DWORD i = 0; i < g_dwNumMtrls; i++) { g_pd3dDevice->SetMaterial(&g_pMaterials[i]); //ô˲ֵIJ g_pd3dDevice->SetTexture(0, g_pTextures[i]);//ô˲ֵ g_pMesh->DrawSubset(i); //ƴ˲ } // 9.ָȾ״̬ g_pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, false); g_pd3dDevice->SetRenderState( D3DRS_STENCILENABLE, false); g_pd3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW); //ڴϽǴʾÿ֡ formatRect.top = 5; 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)", matHero._41, matHero._42, matHero._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" ּ12߹رȲ", -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" ֣ģ", -1, &formatRect, DT_SINGLELINE | DT_NOCLIP | DT_LEFT, D3DCOLOR_RGBA(255,200,0,255)); formatRect.top += 25; g_pTextHelper->DrawText(NULL, L" WSADƽģ ", -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ӿڶ for (DWORD i = 0; iCreateDevice( GUID_SysKeyboard, &m_KeyboardDevice, NULL )); HR( m_KeyboardDevice->SetCooperativeLevel( hWnd, keyboardCoopFlags)); HR( m_KeyboardDevice->SetDataFormat( &c_dfDIKeyboard )); HR( m_KeyboardDevice->Acquire( )); HR( m_KeyboardDevice->Poll( )); //豸ijʼ 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; } //----------------------------------------------------------------------------- // NameDInputClass::GetInput() // Desc: ڻȡϢĺ //----------------------------------------------------------------------------- void DInputClass::GetInput() { 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); } } //----------------------------------------------------------------------------- // NameDInputClass::IsKeyDown() // Desc: жϼijǷ //----------------------------------------------------------------------------- bool DInputClass::IsKeyDown(int iKey) { if(m_keyBuffer[iKey] & 0x80) return true; else return false; } //----------------------------------------------------------------------------- // NameDInputClass::IsMouseButtonDown() // Desc: жijǷ //----------------------------------------------------------------------------- bool DInputClass::IsMouseButtonDown(int button) { return (m_MouseState.rgbButtons[button] & 0x80) != 0; } //----------------------------------------------------------------------------- // NameDInputClass::MouseDX // Desc: ָXֵ //----------------------------------------------------------------------------- float DInputClass::MouseDX() { return (float)m_MouseState.lX; } //----------------------------------------------------------------------------- // NameDInputClass::MouseDY // Desc: ָYֵ //----------------------------------------------------------------------------- float DInputClass::MouseDY() { return (float)m_MouseState.lY; } //----------------------------------------------------------------------------- // NameDInputClass::MouseDZ // Desc: ָZֵ֣ //----------------------------------------------------------------------------- float DInputClass::MouseDZ() { return (float)m_MouseState.lZ; } //----------------------------------------------------------------------------- // Desc: //----------------------------------------------------------------------------- DInputClass::~DInputClass(void) { 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); } ================================================ FILE: Direct3D-Game-Demo/D3Ddemo15/DirectInputClass.h ================================================ //============================================================================= // Name: DirectInputClass.h // Des: װDirectInput봦ͷļ // 2013 203 Create by dzī //============================================================================= #pragma once #include "D3DUtil.h" #define DIRECTINPUT_VERSION 0x0800 #include //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); //жϼijǷ bool IsMouseButtonDown(int button); //ж갴Ƿ񱻰 float MouseDX(); //Xֵ float MouseDY(); //Yֵ float MouseDZ(); //Zֵ public: DInputClass(void); //캯 ~DInputClass(void); // }; ================================================ FILE: Direct3D-Game-Demo/D3Ddemo16/CameraClass.cpp ================================================ //============================================================================= // Name: CameraClass.cpp // Des: һװʵԴļ // 2013 310 Create by dzī //============================================================================= #include "CameraClass.h" #ifndef WINDOW_WIDTH #define WINDOW_WIDTH 800 //Ϊڿȶĺ꣬Էڴ˴޸Ĵڿ #define WINDOW_HEIGHT 600 //Ϊڸ߶ȶĺ꣬Էڴ˴޸Ĵڸ߶ #endif //----------------------------------------------------------------------------- // Desc: 캯 //----------------------------------------------------------------------------- CameraClass::CameraClass(IDirect3DDevice9 *pd3dDevice) { m_pd3dDevice = pd3dDevice; m_vRightVector = D3DXVECTOR3(1.0f, 0.0f, 0.0f); // ĬXغ m_vUpVector = D3DXVECTOR3(0.0f, 1.0f, 0.0f); // ĬYغ m_vLookVector = D3DXVECTOR3(0.0f, 0.0f, 1.0f); // ĬϹ۲Zغ m_vCameraPosition = D3DXVECTOR3(0.0f, 0.0f, -250.0f); // ĬΪ(0.0f, 0.0f, -250.0f) m_vTargetPosition = D3DXVECTOR3(0.0f, 0.0f, 0.0f);//ĬϹ۲ĿλΪ(0.0f, 0.0f, 0.0f); } //----------------------------------------------------------------------------- // NameCameraClass::CalculateViewMatrix( ) // Desc: ݸľȡ任 //----------------------------------------------------------------------------- VOID CameraClass::CalculateViewMatrix(D3DXMATRIX *pMatrix) { //1.Ȱ3淶ʹ໥ֱΪһ D3DXVec3Normalize(&m_vLookVector, &m_vLookVector); //淶۲ D3DXVec3Cross(&m_vUpVector, &m_vLookVector, &m_vRightVector); // ۲ֱ D3DXVec3Normalize(&m_vUpVector, &m_vUpVector); // 淶 D3DXVec3Cross(&m_vRightVector, &m_vUpVector, &m_vLookVector); // ֱ D3DXVec3Normalize(&m_vRightVector, &m_vRightVector); // 淶 // 2.ȡ任 //дȡ任ĵһ pMatrix->_11 = m_vRightVector.x; // Rx pMatrix->_12 = m_vUpVector.x; // Ux pMatrix->_13 = m_vLookVector.x; // Lx pMatrix->_14 = 0.0f; //дȡ任ĵڶ pMatrix->_21 = m_vRightVector.y; // Ry pMatrix->_22 = m_vUpVector.y; // Uy pMatrix->_23 = m_vLookVector.y; // Ly pMatrix->_24 = 0.0f; //дȡ任ĵ pMatrix->_31 = m_vRightVector.z; // Rz pMatrix->_32 = m_vUpVector.z; // Uz pMatrix->_33 = m_vLookVector.z; // Lz pMatrix->_34 = 0.0f; //дȡ任ĵ pMatrix->_41 = -D3DXVec3Dot(&m_vRightVector, &m_vCameraPosition); // -P*R pMatrix->_42 = -D3DXVec3Dot(&m_vUpVector, &m_vCameraPosition); // -P*U pMatrix->_43 = -D3DXVec3Dot(&m_vLookVector, &m_vCameraPosition); // -P*L pMatrix->_44 = 1.0f; } //----------------------------------------------------------------------------- // NameCameraClass::SetTargetPosition( ) // Desc: Ĺ۲λ //----------------------------------------------------------------------------- VOID CameraClass::SetTargetPosition(D3DXVECTOR3 *pLookat) { //ȿpLookatǷΪĬֵNULL if (pLookat != NULL) m_vTargetPosition = (*pLookat); else m_vTargetPosition = D3DXVECTOR3(0.0f, 0.0f, 1.0f); m_vLookVector = m_vTargetPosition - m_vCameraPosition;//۲λüλãõ۲췽 D3DXVec3Normalize(&m_vLookVector, &m_vLookVector);//淶m_vLookVector //淶m_vUpVectorm_vRightVector D3DXVec3Cross(&m_vUpVector, &m_vLookVector, &m_vRightVector); D3DXVec3Normalize(&m_vUpVector, &m_vUpVector); D3DXVec3Cross(&m_vRightVector, &m_vUpVector, &m_vLookVector); D3DXVec3Normalize(&m_vRightVector, &m_vRightVector); } //----------------------------------------------------------------------------- // NameCameraClass::SetCameraPosition( ) // Desc: ڵλ //----------------------------------------------------------------------------- VOID CameraClass::SetCameraPosition(D3DXVECTOR3 *pVector) { D3DXVECTOR3 V = D3DXVECTOR3(0.0f, 0.0f, -250.0f); m_vCameraPosition = pVector ? (*pVector) : V;//ĿpVectorΪĻ //*pVectorֵm_vCameraPosition=*pVector //򷵻Vֵm_vCameraPosition=V } //----------------------------------------------------------------------------- // NameCameraClass::SetViewMatrix( ) // Desc: ȡ任 //----------------------------------------------------------------------------- VOID CameraClass::SetViewMatrix(D3DXMATRIX *pMatrix) { //pMatrixֵһж if (pMatrix) m_matView = *pMatrix; else CalculateViewMatrix(&m_matView); m_pd3dDevice->SetTransform(D3DTS_VIEW, &m_matView); //ȡ任ֱֵҷϷ͹۲ m_vRightVector = D3DXVECTOR3(m_matView._11, m_matView._12, m_matView._13); m_vUpVector = D3DXVECTOR3(m_matView._21, m_matView._22, m_matView._23); m_vLookVector = D3DXVECTOR3(m_matView._31, m_matView._32, m_matView._33); } //----------------------------------------------------------------------------- // NameCameraClass::SetProjMatrix( ) // Desc: ͶӰ任 //----------------------------------------------------------------------------- VOID CameraClass::SetProjMatrix(D3DXMATRIX *pMatrix) { //жֵûУûеĻͼһ if (pMatrix != NULL) m_matProj = *pMatrix; else D3DXMatrixPerspectiveFovLH(&m_matProj, D3DX_PI / 4.0f, (float)((double)WINDOW_WIDTH/WINDOW_HEIGHT), 1.0f, 30000.0f);//ӽԶΪ30000.0fͲ¿Զ m_pd3dDevice->SetTransform(D3DTS_PROJECTION, &m_matProj);//ͶӰ任 } //----------------------------------------------------------------------------- // NameCameraClass::MoveAlongRightVec( ) // Desc: ƽfUnitsλ //----------------------------------------------------------------------------- VOID CameraClass::MoveAlongRightVec(FLOAT fUnits) { //ֱӳfUnitsۼӾ m_vCameraPosition += m_vRightVector * fUnits; m_vTargetPosition += m_vRightVector * fUnits; } //----------------------------------------------------------------------------- // NameCameraClass::MoveAlongUpVec( ) // Desc: ƽfUnitsλ //----------------------------------------------------------------------------- VOID CameraClass::MoveAlongUpVec(FLOAT fUnits) { //ֱӳfUnitsۼӾ m_vCameraPosition += m_vUpVector * fUnits; m_vTargetPosition += m_vUpVector * fUnits; } //----------------------------------------------------------------------------- // NameCameraClass::MoveAlongLookVec( ) // Desc: ع۲ƽfUnitsλ //----------------------------------------------------------------------------- VOID CameraClass::MoveAlongLookVec(FLOAT fUnits) { //ֱӳfUnitsۼӾ m_vCameraPosition += m_vLookVector * fUnits; m_vTargetPosition += m_vLookVector * fUnits; } //----------------------------------------------------------------------------- // NameCameraClass::RotationRightVec( ) // Desc: תfAngleȵλĽǶ //----------------------------------------------------------------------------- VOID CameraClass::RotationRightVec(FLOAT fAngle) { D3DXMATRIX R; D3DXMatrixRotationAxis(&R, &m_vRightVector, fAngle);//m_vRightVectorתfAngleǶȵR D3DXVec3TransformCoord(&m_vUpVector, &m_vUpVector, &R);//m_vUpVectorm_vRightVectorתfAngleǶ D3DXVec3TransformCoord(&m_vLookVector, &m_vLookVector, &R);//m_vLookVectorm_vRightVectorתfAngleǶ m_vTargetPosition = m_vLookVector * D3DXVec3Length(&m_vCameraPosition);//һ¹۲λãģ= } //----------------------------------------------------------------------------- // NameCameraClass::RotationUpVec( ) // Desc: תfAngleȵλĽǶ //----------------------------------------------------------------------------- VOID CameraClass::RotationUpVec(FLOAT fAngle) { D3DXMATRIX R; D3DXMatrixRotationAxis(&R, &m_vUpVector, fAngle);//m_vUpVectorתfAngleǶȵR D3DXVec3TransformCoord(&m_vRightVector, &m_vRightVector, &R);//m_vRightVectorm_vUpVectorתfAngleǶ D3DXVec3TransformCoord(&m_vLookVector, &m_vLookVector, &R);//m_vLookVectorm_vUpVectorתfAngleǶ m_vTargetPosition = m_vLookVector * D3DXVec3Length(&m_vCameraPosition);//һ¹۲λãģ= } //----------------------------------------------------------------------------- // NameCameraClass::RotationLookVec( ) // Desc: ع۲תfAngleȵλĽǶ //----------------------------------------------------------------------------- VOID CameraClass::RotationLookVec(FLOAT fAngle) { D3DXMATRIX R; D3DXMatrixRotationAxis(&R, &m_vLookVector, fAngle);//m_vLookVectorתfAngleǶȵR D3DXVec3TransformCoord(&m_vRightVector, &m_vRightVector, &R);//m_vRightVectorm_vLookVectorתfAngleǶ D3DXVec3TransformCoord(&m_vUpVector, &m_vUpVector, &R);//m_vUpVectorm_vLookVectorתfAngleǶ m_vTargetPosition = m_vLookVector * D3DXVec3Length(&m_vCameraPosition);//һ¹۲λãģ= } //----------------------------------------------------------------------------- // Desc: //----------------------------------------------------------------------------- CameraClass::~CameraClass(void) { } ================================================ FILE: Direct3D-Game-Demo/D3Ddemo16/CameraClass.h ================================================ //============================================================================= // Name: CameraClass.h // Des: һװʵͷļ // 2013 310 Create by dzī //============================================================================= #pragma once #include #include class CameraClass { private: //Ա D3DXVECTOR3 m_vRightVector; // ҷ D3DXVECTOR3 m_vUpVector; // Ϸ D3DXVECTOR3 m_vLookVector; // ۲췽 D3DXVECTOR3 m_vCameraPosition; // λõ D3DXVECTOR3 m_vTargetPosition; //Ŀ۲λõ D3DXMATRIX m_matView; // ȡ任 D3DXMATRIX m_matProj; // ͶӰ任 LPDIRECT3DDEVICE9 m_pd3dDevice; //Direct3D豸 public: //һȡ任ĺ VOID CalculateViewMatrix(D3DXMATRIX *pMatrix); //ȡ任 //Getϵк VOID GetProjMatrix(D3DXMATRIX *pMatrix) { *pMatrix = m_matProj; } //صǰͶӰ VOID GetCameraPosition(D3DXVECTOR3 *pVector) { *pVector = m_vCameraPosition; } //صǰλþ VOID GetLookVector(D3DXVECTOR3 *pVector) { *pVector = m_vLookVector; } //صǰĹ۲ //ĸSetϵкעǶĬֵNULLģʱдҲ VOID SetTargetPosition(D3DXVECTOR3 *pLookat = NULL); //Ŀ۲λ VOID SetCameraPosition(D3DXVECTOR3 *pVector = NULL); //ڵλ VOID SetViewMatrix(D3DXMATRIX *pMatrix = NULL); //ȡ任 VOID SetProjMatrix(D3DXMATRIX *pMatrix = NULL); //ͶӰ任 public: // ظƽƵ VOID MoveAlongRightVec(FLOAT fUnits); // rightƶ VOID MoveAlongUpVec(FLOAT fUnits); // upƶ VOID MoveAlongLookVec(FLOAT fUnits); // lookƶ // Ƹת VOID RotationRightVec(FLOAT fAngle); // rightѡ VOID RotationUpVec(FLOAT fAngle); // upת VOID RotationLookVec(FLOAT fAngle); // lookת public: //캯 CameraClass(IDirect3DDevice9 *pd3dDevice); //캯 virtual ~CameraClass(void); // }; ================================================ FILE: Direct3D-Game-Demo/D3Ddemo16/D3DUtil.h ================================================ //***************************************************************************************** // Desc: D3DUtil.hͷļڹĶ // 2013 203 Create by dzī //***************************************************************************************** #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 ================================================ FILE: Direct3D-Game-Demo/D3Ddemo16/D3Ddemo16.cpp ================================================ //-----------------------------------˵---------------------------------------------- // :D3Ddemo16 // 20134 Create by dzī // άռ䣺һ˳ʵ ʾ // ͼزij ħ3 Dota // زij- // ģزij˫6 Ԫ ư //------------------------------------------------------------------------------------------------ //-----------------------------------궨岿֡-------------------------------------------- // һЩ //------------------------------------------------------------------------------------------------ #define WINDOW_WIDTH 932 //Ϊڿȶĺ꣬Էڴ˴޸Ĵڿ #define WINDOW_HEIGHT 700 //Ϊڸ߶ȶĺ꣬Էڴ˴޸Ĵڸ߶ #define WINDOW_TITLE _T("ϨϷ롿 άռ䣺һ˳ʵ") //Ϊڱⶨĺ //-----------------------------------ͷļ֡--------------------------------------- // ͷļ //------------------------------------------------------------------------------------------------ #include #include #include #include #include "DirectInputClass.h" #include "CameraClass.h" //-----------------------------------ļ֡--------------------------------------- // Ŀļ //------------------------------------------------------------------------------------------------ #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") //嶥ṹ struct CUSTOMVERTEX { FLOAT _x, _y, _z; FLOAT _nx, _ny, _nz; FLOAT _u, _v; CUSTOMVERTEX(FLOAT x, FLOAT y, FLOAT z, FLOAT nx, FLOAT ny, FLOAT nz, FLOAT u, FLOAT v) { _x = x, _y = y, _z = z; _nx = nx, _ny = ny, _nz = nz; _u = u, _v = v; } }; #define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_TEX1) //-----------------------------------ȫֱ֡------------------------------------- // ȫֱ //------------------------------------------------------------------------------------------------ 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ָ CameraClass* g_pCamera = NULL; LPD3DXMESH g_pMesh = NULL; // D3DMATERIAL9* g_pMaterials = NULL; // IJϢ LPDIRECT3DTEXTURE9* g_pTextures = NULL; // Ϣ DWORD g_dwNumMtrls = 0; // ʵĿ LPD3DXMESH g_cylinder = NULL; // D3DMATERIAL9 g_MaterialCylinder; // LPDIRECT3DVERTEXBUFFER9 g_pVertexBuffer = NULL; //ƲݵصĶ㻺 LPDIRECT3DTEXTURE9 g_pTexture = NULL; //Ʋݵص //-----------------------------------ȫֺ֡------------------------------------- // ȫֺֹδıʶϵд //------------------------------------------------------------------------------------------------ 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 HelpText_Render(HWND hwnd); //-----------------------------------WinMain( )-------------------------------------- // WindowsӦóںǵij↑ʼ //------------------------------------------------------------------------------------------------ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nShowCmd) { //ʼһĴ WNDCLASSEX wndClass = { 0 }; //WINDCLASSEXһ࣬wndClassʵWINDCLASSEX֮󴰿ڵĸʼ wndClass.cbSize = sizeof( WNDCLASSEX ) ; //ýṹֽС wndClass.style = CS_HREDRAW | CS_VREDRAW; //ôڵʽ wndClass.lpfnWndProc = WndProc; //ָ򴰿ڹָ̺ wndClass.cbClsExtra = 0; wndClass.cbWndExtra = 0; wndClass.hInstance = hInstance; //ָڹ̵ijʵ wndClass.hIcon=(HICON)::LoadImage(NULL,_T("icon.ico"),IMAGE_ICON,0,0,LR_DEFAULTSIZE|LR_LOADFROMFILE); //ȫֵ::LoadImageӱؼԶicoͼ wndClass.hCursor = LoadCursor( NULL, IDC_ARROW ); //ָĹ wndClass.hbrBackground=(HBRUSH)GetStockObject(GRAY_BRUSH); //ΪhbrBackgroundԱָһɫˢ wndClass.lpszMenuName = NULL; //һԿַָֹ˵Դ֡ wndClass.lpszClassName = _T("ForTheDreamOfGameDevelop"); //һԿַָֹ֡ if( !RegisterClassEx( &wndClass ) ) //괰ںҪԴעᣬܴ͵Ĵ return -1; HWND hwnd = CreateWindow( _T("ForTheDreamOfGameDevelop"),WINDOW_TITLE, //ϲּĴںCreateWindow WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, WINDOW_WIDTH, WINDOW_HEIGHT, NULL, NULL, hInstance, NULL ); //Direct3DԴijʼʧmessageboxʾ if (!(S_OK==Direct3D_Init (hwnd,hInstance))) { MessageBox(hwnd, _T("Direct3Dʼʧ~"), _T("dzīϢ"), 0); //ʹMessageBoxһϢ } PlaySound(L" - .wav", NULL, SND_FILENAME | SND_ASYNC|SND_LOOP); //ѭű MoveWindow(hwnd,200,10,WINDOW_WIDTH,WINDOW_HEIGHT,true); //ʾʱλãϽλĻ꣨20010 ShowWindow( hwnd, nShowCmd ); //Win32ShowWindowʾ UpdateWindow(hwnd); //Դڽи£·Ҫװһ //DirectInputijʼ g_pDInput = new DInputClass(); g_pDInput->Init(hwnd,hInstance,DISCL_FOREGROUND | DISCL_NONEXCLUSIVE,DISCL_FOREGROUND | DISCL_NONEXCLUSIVE); //Ϣѭ 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); //ȾлȾ } } UnregisterClass(_T("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_CleanUpCOMӿڶ PostQuitMessage( 0 ); //ϵͳиֹ߳ӦWM_DESTROYϢ break; //switch default: //caseϣִиdefault return DefWindowProc( hwnd, message, wParam, lParam ); //ȱʡĴڹΪӦóûдĴϢṩȱʡĴ } return 0; //˳ } //-----------------------------------Direct3D_Init( )---------------------------------- // Direct3DʼDirect3Dijʼ //------------------------------------------------------------------------------------------------ HRESULT Direct3D_Init(HWND hwnd,HINSTANCE hInstance) { //-------------------------------------------------------------------------------------- // Direct3DʼIJ֮һӿڡDirect3Dӿڶ, ԱøDirect3D󴴽Direct3D豸 //-------------------------------------------------------------------------------------- LPDIRECT3D9 pD3D = NULL; //Direct3DӿڶĴ if( NULL == ( pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) ) //ʼDirect3Dӿڶ󣬲DirectX汾Э return E_FAIL; //-------------------------------------------------------------------------------------- // Direct3DʼIJ֮,ȡϢȡӲ豸Ϣ //-------------------------------------------------------------------------------------- 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ʼIJ֮ݡ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; d3dpp.EnableAutoDepthStencil = true; d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8; d3dpp.Flags = 0; d3dpp.FullScreen_RefreshRateInHz = 0; d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; //-------------------------------------------------------------------------------------- // Direct3DʼIJ֮ģ豸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( )-------------------------------------- // ȾԴʼڴ˺нҪȾԴijʼ //-------------------------------------------------------------------------------------------------- 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ļм LPD3DXBUFFER pAdjBuffer = NULL; LPD3DXBUFFER pMtrlBuffer = NULL; D3DXLoadMeshFromX(L"WYJ.X", D3DXMESH_MANAGED, g_pd3dDevice, &pAdjBuffer, &pMtrlBuffer, NULL, &g_dwNumMtrls, &g_pMesh); // ȡʺ D3DXMATERIAL *pMtrls = (D3DXMATERIAL*)pMtrlBuffer->GetBufferPointer(); //һD3DXMATERIALṹڶȡʺϢ g_pMaterials = new D3DMATERIAL9[g_dwNumMtrls]; g_pTextures = new LPDIRECT3DTEXTURE9[g_dwNumMtrls]; for (DWORD i=0; iCreateVertexBuffer(4 * sizeof(CUSTOMVERTEX), 0, D3DFVF_CUSTOMVERTEX, D3DPOOL_MANAGED, &g_pVertexBuffer, 0); CUSTOMVERTEX *pVertices = NULL; g_pVertexBuffer->Lock(0, 0, (void**)&pVertices, 0); pVertices[0] = CUSTOMVERTEX(-500.0f, 0.0f, -500.0f, 0.0f, 1.0f, 0.0f, 0.0f, 50.0f); pVertices[1] = CUSTOMVERTEX(-500.0f, 0.0f, 500.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f); pVertices[2] = CUSTOMVERTEX( 500.0f, 0.0f, -500.0f, 0.0f, 1.0f, 0.0f, 50.0f, 50.0f); pVertices[3] = CUSTOMVERTEX( 500.0f, 0.0f, 500.0f, 0.0f, 1.0f, 0.0f, 50.0f, 0.0f); g_pVertexBuffer->Unlock(); // ذ D3DXCreateTextureFromFile(g_pd3dDevice, L"grass.jpg", &g_pTexture); // D3DXCreateCylinder(g_pd3dDevice, 10.0f, 10.0f, 500.0f, 60, 60, &g_cylinder, 0); g_MaterialCylinder.Ambient = D3DXCOLOR(0.9f, 0.0f, 0.8f, 1.0f); g_MaterialCylinder.Diffuse = D3DXCOLOR(0.9f, 0.0f, 0.8f, 1.0f); g_MaterialCylinder.Specular = D3DXCOLOR(0.9f, 0.2f, 0.9f, 0.9f); g_MaterialCylinder.Emissive = D3DXCOLOR(0.0f, 0.0f, 0.9f, 1.0f); // ù D3DLIGHT9 light; ::ZeroMemory(&light, sizeof(light)); light.Type = D3DLIGHT_DIRECTIONAL; light.Ambient = D3DXCOLOR(0.7f, 0.7f, 0.7f, 1.0f); light.Diffuse = D3DXCOLOR(1.0f, 1.0f, 1.0f, 1.0f); light.Specular = D3DXCOLOR(0.5f, 0.5f, 0.5f, 1.0f); light.Direction = D3DXVECTOR3(1.0f, 0.0f, 0.0f); g_pd3dDevice->SetLight(0, &light); g_pd3dDevice->LightEnable(0, true); g_pd3dDevice->SetRenderState(D3DRS_NORMALIZENORMALS, true); g_pd3dDevice->SetRenderState(D3DRS_SPECULARENABLE, true); // ʼ g_pCamera = new CameraClass(g_pd3dDevice); g_pCamera->SetCameraPosition(&D3DXVECTOR3(0.0f, 200.0f, -300.0f)); //ڵλ g_pCamera->SetTargetPosition(&D3DXVECTOR3(0.0f, 300.0f, 0.0f)); //Ŀ۲ڵλ g_pCamera->SetViewMatrix(); //ȡ任 g_pCamera->SetProjMatrix(); //ͶӰ任 // ˺Ѱַʽ g_pd3dDevice->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR); g_pd3dDevice->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR); g_pd3dDevice->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR); return S_OK; } //-----------------------------------Direct3D_Update( )-------------------------------- // ǼʱȾ뵫Ҫʱõģ簴ĸģ //-------------------------------------------------------------------------------------------------- void Direct3D_Update( HWND hwnd) { //ʹDirectInputȡ g_pDInput->GetInput(); // ƶӽ if (g_pDInput->IsKeyDown(DIK_A)) g_pCamera->MoveAlongRightVec(-0.3f); if (g_pDInput->IsKeyDown(DIK_D)) g_pCamera->MoveAlongRightVec( 0.3f); if (g_pDInput->IsKeyDown(DIK_W)) g_pCamera->MoveAlongLookVec( 0.3f); if (g_pDInput->IsKeyDown(DIK_S)) g_pCamera->MoveAlongLookVec(-0.3f); if (g_pDInput->IsKeyDown(DIK_R)) g_pCamera->MoveAlongUpVec( 0.3f); if (g_pDInput->IsKeyDown(DIK_F)) g_pCamera->MoveAlongUpVec(-0.3f); //תӽ if (g_pDInput->IsKeyDown(DIK_LEFT)) g_pCamera->RotationUpVec(-0.003f); if (g_pDInput->IsKeyDown(DIK_RIGHT)) g_pCamera->RotationUpVec( 0.003f); if (g_pDInput->IsKeyDown(DIK_UP)) g_pCamera->RotationRightVec(-0.003f); if (g_pDInput->IsKeyDown(DIK_DOWN)) g_pCamera->RotationRightVec( 0.003f); if (g_pDInput->IsKeyDown(DIK_Q)) g_pCamera->RotationLookVec( 0.001f); if (g_pDInput->IsKeyDown(DIK_E)) g_pCamera->RotationLookVec(-0.001f); //ת g_pCamera->RotationUpVec(g_pDInput->MouseDX()* 0.001f); g_pCamera->RotationRightVec(g_pDInput->MouseDY() * 0.001f); //ֿƹ۲ static FLOAT fPosZ=0.0f; fPosZ += g_pDInput->MouseDZ()*0.03f; //㲢ȡ任 D3DXMATRIX matView; g_pCamera->CalculateViewMatrix(&matView); g_pd3dDevice->SetTransform(D3DTS_VIEW, &matView); //ȷ任浽g_matWorld D3DXMatrixTranslation(&g_matWorld, 0.0f, 0.0f, fPosZ); //δƶ POINT lt,rb; RECT rect; GetClientRect(hwnd,&rect); //ȡôڲ //ϵlt lt.x = rect.left; lt.y = rect.top; //rb rb.x = rect.right; rb.y = rect.bottom; //ltrbĴתΪĻ ClientToScreen(hwnd,<); ClientToScreen(hwnd,&rb); //Ļ趨 rect.left = lt.x; rect.top = lt.y; rect.right = rb.x; rect.bottom = rb.y; //ƶ ClipCursor(&rect); ShowCursor(false); // } //-----------------------------------Direct3D_Render( )------------------------------- // ʹDirect3DȾ //-------------------------------------------------------------------------------------------------- void Direct3D_Render(HWND hwnd) { //-------------------------------------------------------------------------------------- // Direct3DȾ岽֮һ //-------------------------------------------------------------------------------------- g_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER|D3DCLEAR_STENCIL, D3DCOLOR_XRGB(50, 100, 250), 1.0f, 0); //-------------------------------------------------------------------------------------- // Direct3DȾ岽֮ʼ //-------------------------------------------------------------------------------------- g_pd3dDevice->BeginScene(); // ʼ //-------------------------------------------------------------------------------------- // Direct3DȾ岽֮ʽ //-------------------------------------------------------------------------------------- // g_pd3dDevice->SetTransform(D3DTS_WORLD, &g_matWorld);//ģ͵Ϊ׼ // һforѭģ͵ֵĻ for (DWORD i = 0; i < g_dwNumMtrls; i++) { g_pd3dDevice->SetMaterial(&g_pMaterials[i]); //ô˲ֵIJ g_pd3dDevice->SetTexture(0, g_pTextures[i]);//ô˲ֵ g_pMesh->DrawSubset(i); //ƴ˲ } // Ʋƺ D3DXMATRIX matWorld; D3DXMatrixTranslation(&matWorld, 0.0f, 0.0f, 0.0f); g_pd3dDevice->SetTransform(D3DTS_WORLD, &matWorld); g_pd3dDevice->SetTexture(0, g_pTexture); g_pd3dDevice->SetStreamSource(0, g_pVertexBuffer, 0, sizeof(CUSTOMVERTEX)); g_pd3dDevice->SetFVF(D3DFVF_CUSTOMVERTEX); g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2); // D3DXMATRIX TransMatrix, RotMatrix, FinalMatrix; D3DXMatrixRotationX(&RotMatrix, -D3DX_PI * 0.5f); g_pd3dDevice->SetMaterial(&g_MaterialCylinder); for(int i = 0; i < 6; i++) { D3DXMatrixTranslation(&TransMatrix, -100.0f, 0.0f, -150.0f + (i * 75.0f)); FinalMatrix = RotMatrix * TransMatrix ; g_pd3dDevice->SetTransform(D3DTS_WORLD, &FinalMatrix); g_cylinder->DrawSubset(0); D3DXMatrixTranslation(&TransMatrix, 100.0f, 0.0f, -150.0f + (i * 75.0f)); FinalMatrix = RotMatrix * TransMatrix ; g_pd3dDevice->SetTransform(D3DTS_WORLD, &FinalMatrix); g_cylinder->DrawSubset(0); } HelpText_Render(hwnd); //-------------------------------------------------------------------------------------- // Direct3DȾ岽֮ġ //-------------------------------------------------------------------------------------- g_pd3dDevice->EndScene(); // //-------------------------------------------------------------------------------------- // Direct3DȾ岽֮塿ʾת //-------------------------------------------------------------------------------------- g_pd3dDevice->Present(NULL, NULL, NULL, NULL); // תʾ } //-----------------------------------HelpText_Render( )------------------------------- // װ˰Ϣĺ //-------------------------------------------------------------------------------------------------- void HelpText_Render(HWND hwnd) { //һΣڻȡھ RECT formatRect; GetClientRect(hwnd, &formatRect); //ڴϽǴʾÿ֡ formatRect.top = 5; 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.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" Wǰ S ", -1, &formatRect, DT_SINGLELINE | DT_NOCLIP | DT_LEFT, D3DCOLOR_RGBA(255,200,0,255)); formatRect.top += 25; g_pTextHelper->DrawText(NULL, L" A Dҷ", -1, &formatRect, DT_SINGLELINE | DT_NOCLIP | DT_LEFT, D3DCOLOR_RGBA(255,200,0,255)); formatRect.top += 25; g_pTextHelper->DrawText(NULL, L" RֱϷ Fֱ·", -1, &formatRect, DT_SINGLELINE | DT_NOCLIP | DT_LEFT, D3DCOLOR_RGBA(255,200,0,255)); formatRect.top += 25; g_pTextHelper->DrawText(NULL, L" Qб Eб", -1, &formatRect, DT_SINGLELINE | DT_NOCLIP | DT_LEFT, D3DCOLOR_RGBA(255,200,0,255)); formatRect.top += 25; g_pTextHelper->DrawText(NULL, L" ϡ¡ҷƶӽDZ仯 ", -1, &formatRect, DT_SINGLELINE | DT_NOCLIP | DT_LEFT, D3DCOLOR_RGBA(255,200,0,255)); formatRect.top += 25; g_pTextHelper->DrawText(NULL, L" ֣ģY᷽ƶ", -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)); } //-----------------------------------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ӿڶ for (DWORD i = 0; iCreateDevice( GUID_SysKeyboard, &m_KeyboardDevice, NULL )); HR( m_KeyboardDevice->SetCooperativeLevel( hWnd, keyboardCoopFlags)); HR( m_KeyboardDevice->SetDataFormat( &c_dfDIKeyboard )); HR( m_KeyboardDevice->Acquire( )); HR( m_KeyboardDevice->Poll( )); //豸ijʼ 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; } //----------------------------------------------------------------------------- // NameDInputClass::GetInput() // Desc: ڻȡϢĺ //----------------------------------------------------------------------------- void DInputClass::GetInput() { 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); } } //----------------------------------------------------------------------------- // NameDInputClass::IsKeyDown() // Desc: жϼijǷ //----------------------------------------------------------------------------- bool DInputClass::IsKeyDown(int iKey) { if(m_keyBuffer[iKey] & 0x80) return true; else return false; } //----------------------------------------------------------------------------- // NameDInputClass::IsMouseButtonDown() // Desc: жijǷ //----------------------------------------------------------------------------- bool DInputClass::IsMouseButtonDown(int button) { return (m_MouseState.rgbButtons[button] & 0x80) != 0; } //----------------------------------------------------------------------------- // NameDInputClass::MouseDX // Desc: ָXֵ //----------------------------------------------------------------------------- float DInputClass::MouseDX() { return (float)m_MouseState.lX; } //----------------------------------------------------------------------------- // NameDInputClass::MouseDY // Desc: ָYֵ //----------------------------------------------------------------------------- float DInputClass::MouseDY() { return (float)m_MouseState.lY; } //----------------------------------------------------------------------------- // NameDInputClass::MouseDZ // Desc: ָZֵ֣ //----------------------------------------------------------------------------- float DInputClass::MouseDZ() { return (float)m_MouseState.lZ; } //----------------------------------------------------------------------------- // Desc: //----------------------------------------------------------------------------- DInputClass::~DInputClass(void) { 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); } ================================================ FILE: Direct3D-Game-Demo/D3Ddemo16/DirectInputClass.h ================================================ //============================================================================= // Name: DirectInputClass.h // Des: װDirectInput봦ͷļ // 2013 203 Create by dzī //============================================================================= #pragma once #include "D3DUtil.h" #define DIRECTINPUT_VERSION 0x0800 #include //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); //жϼijǷ bool IsMouseButtonDown(int button); //ж갴Ƿ񱻰 float MouseDX(); //Xֵ float MouseDY(); //Yֵ float MouseDZ(); //Zֵ public: DInputClass(void); //캯 ~DInputClass(void); // }; ================================================ FILE: Direct3D-Game-Demo/D3Ddemo17/CameraClass.cpp ================================================ //============================================================================= // Name: CameraClass.cpp // Des: һװʵԴļ // 2013 310 Create by dzī //============================================================================= #include "CameraClass.h" #ifndef WINDOW_WIDTH #define WINDOW_WIDTH 800 //Ϊڿȶĺ꣬Էڴ˴޸Ĵڿ #define WINDOW_HEIGHT 600 //Ϊڸ߶ȶĺ꣬Էڴ˴޸Ĵڸ߶ #endif //----------------------------------------------------------------------------- // Desc: 캯 //----------------------------------------------------------------------------- CameraClass::CameraClass(IDirect3DDevice9 *pd3dDevice) { m_pd3dDevice = pd3dDevice; m_vRightVector = D3DXVECTOR3(1.0f, 0.0f, 0.0f); // ĬXغ m_vUpVector = D3DXVECTOR3(0.0f, 1.0f, 0.0f); // ĬYغ m_vLookVector = D3DXVECTOR3(0.0f, 0.0f, 1.0f); // ĬϹ۲Zغ m_vCameraPosition = D3DXVECTOR3(0.0f, 0.0f, -250.0f); // ĬΪ(0.0f, 0.0f, -250.0f) m_vTargetPosition = D3DXVECTOR3(0.0f, 0.0f, 0.0f);//ĬϹ۲ĿλΪ(0.0f, 0.0f, 0.0f); } //----------------------------------------------------------------------------- // NameCameraClass::CalculateViewMatrix( ) // Desc: ݸľȡ任 //----------------------------------------------------------------------------- VOID CameraClass::CalculateViewMatrix(D3DXMATRIX *pMatrix) { //1.Ȱ3淶ʹ໥ֱΪһ D3DXVec3Normalize(&m_vLookVector, &m_vLookVector); //淶۲ D3DXVec3Cross(&m_vUpVector, &m_vLookVector, &m_vRightVector); // ۲ֱ D3DXVec3Normalize(&m_vUpVector, &m_vUpVector); // 淶 D3DXVec3Cross(&m_vRightVector, &m_vUpVector, &m_vLookVector); // ֱ D3DXVec3Normalize(&m_vRightVector, &m_vRightVector); // 淶 // 2.ȡ任 //дȡ任ĵһ pMatrix->_11 = m_vRightVector.x; // Rx pMatrix->_12 = m_vUpVector.x; // Ux pMatrix->_13 = m_vLookVector.x; // Lx pMatrix->_14 = 0.0f; //дȡ任ĵڶ pMatrix->_21 = m_vRightVector.y; // Ry pMatrix->_22 = m_vUpVector.y; // Uy pMatrix->_23 = m_vLookVector.y; // Ly pMatrix->_24 = 0.0f; //дȡ任ĵ pMatrix->_31 = m_vRightVector.z; // Rz pMatrix->_32 = m_vUpVector.z; // Uz pMatrix->_33 = m_vLookVector.z; // Lz pMatrix->_34 = 0.0f; //дȡ任ĵ pMatrix->_41 = -D3DXVec3Dot(&m_vRightVector, &m_vCameraPosition); // -P*R pMatrix->_42 = -D3DXVec3Dot(&m_vUpVector, &m_vCameraPosition); // -P*U pMatrix->_43 = -D3DXVec3Dot(&m_vLookVector, &m_vCameraPosition); // -P*L pMatrix->_44 = 1.0f; } //----------------------------------------------------------------------------- // NameCameraClass::SetTargetPosition( ) // Desc: Ĺ۲λ //----------------------------------------------------------------------------- VOID CameraClass::SetTargetPosition(D3DXVECTOR3 *pLookat) { //ȿpLookatǷΪĬֵNULL if (pLookat != NULL) m_vTargetPosition = (*pLookat); else m_vTargetPosition = D3DXVECTOR3(0.0f, 0.0f, 1.0f); m_vLookVector = m_vTargetPosition - m_vCameraPosition;//۲λüλãõ۲췽 D3DXVec3Normalize(&m_vLookVector, &m_vLookVector);//淶m_vLookVector //淶m_vUpVectorm_vRightVector D3DXVec3Cross(&m_vUpVector, &m_vLookVector, &m_vRightVector); D3DXVec3Normalize(&m_vUpVector, &m_vUpVector); D3DXVec3Cross(&m_vRightVector, &m_vUpVector, &m_vLookVector); D3DXVec3Normalize(&m_vRightVector, &m_vRightVector); } //----------------------------------------------------------------------------- // NameCameraClass::SetCameraPosition( ) // Desc: ڵλ //----------------------------------------------------------------------------- VOID CameraClass::SetCameraPosition(D3DXVECTOR3 *pVector) { D3DXVECTOR3 V = D3DXVECTOR3(0.0f, 0.0f, -250.0f); m_vCameraPosition = pVector ? (*pVector) : V;//ĿpVectorΪĻ //*pVectorֵm_vCameraPosition=*pVector //򷵻Vֵm_vCameraPosition=V } //----------------------------------------------------------------------------- // NameCameraClass::SetViewMatrix( ) // Desc: ȡ任 //----------------------------------------------------------------------------- VOID CameraClass::SetViewMatrix(D3DXMATRIX *pMatrix) { //pMatrixֵһж if (pMatrix) m_matView = *pMatrix; else CalculateViewMatrix(&m_matView); m_pd3dDevice->SetTransform(D3DTS_VIEW, &m_matView); //ȡ任ֱֵҷϷ͹۲ m_vRightVector = D3DXVECTOR3(m_matView._11, m_matView._12, m_matView._13); m_vUpVector = D3DXVECTOR3(m_matView._21, m_matView._22, m_matView._23); m_vLookVector = D3DXVECTOR3(m_matView._31, m_matView._32, m_matView._33); } //----------------------------------------------------------------------------- // NameCameraClass::SetProjMatrix( ) // Desc: ͶӰ任 //----------------------------------------------------------------------------- VOID CameraClass::SetProjMatrix(D3DXMATRIX *pMatrix) { //жֵûУûеĻͼһ if (pMatrix != NULL) m_matProj = *pMatrix; else D3DXMatrixPerspectiveFovLH(&m_matProj, D3DX_PI / 4.0f, (float)((double)WINDOW_WIDTH/WINDOW_HEIGHT), 1.0f, 300000.0f);//ӽԶΪ300000.0fͲ¿Զ m_pd3dDevice->SetTransform(D3DTS_PROJECTION, &m_matProj);//ͶӰ任 } //----------------------------------------------------------------------------- // NameCameraClass::MoveAlongRightVec( ) // Desc: ƽfUnitsλ //----------------------------------------------------------------------------- VOID CameraClass::MoveAlongRightVec(FLOAT fUnits) { //ֱӳfUnitsۼӾ m_vCameraPosition += m_vRightVector * fUnits; m_vTargetPosition += m_vRightVector * fUnits; } //----------------------------------------------------------------------------- // NameCameraClass::MoveAlongUpVec( ) // Desc: ƽfUnitsλ //----------------------------------------------------------------------------- VOID CameraClass::MoveAlongUpVec(FLOAT fUnits) { //ֱӳfUnitsۼӾ m_vCameraPosition += m_vUpVector * fUnits; m_vTargetPosition += m_vUpVector * fUnits; } //----------------------------------------------------------------------------- // NameCameraClass::MoveAlongLookVec( ) // Desc: ع۲ƽfUnitsλ //----------------------------------------------------------------------------- VOID CameraClass::MoveAlongLookVec(FLOAT fUnits) { //ֱӳfUnitsۼӾ m_vCameraPosition += m_vLookVector * fUnits; m_vTargetPosition += m_vLookVector * fUnits; } //----------------------------------------------------------------------------- // NameCameraClass::RotationRightVec( ) // Desc: תfAngleȵλĽǶ //----------------------------------------------------------------------------- VOID CameraClass::RotationRightVec(FLOAT fAngle) { D3DXMATRIX R; D3DXMatrixRotationAxis(&R, &m_vRightVector, fAngle);//m_vRightVectorתfAngleǶȵR D3DXVec3TransformCoord(&m_vUpVector, &m_vUpVector, &R);//m_vUpVectorm_vRightVectorתfAngleǶ D3DXVec3TransformCoord(&m_vLookVector, &m_vLookVector, &R);//m_vLookVectorm_vRightVectorתfAngleǶ m_vTargetPosition = m_vLookVector * D3DXVec3Length(&m_vCameraPosition);//һ¹۲λãģ= } //----------------------------------------------------------------------------- // NameCameraClass::RotationUpVec( ) // Desc: תfAngleȵλĽǶ //----------------------------------------------------------------------------- VOID CameraClass::RotationUpVec(FLOAT fAngle) { D3DXMATRIX R; D3DXMatrixRotationAxis(&R, &m_vUpVector, fAngle);//m_vUpVectorתfAngleǶȵR D3DXVec3TransformCoord(&m_vRightVector, &m_vRightVector, &R);//m_vRightVectorm_vUpVectorתfAngleǶ D3DXVec3TransformCoord(&m_vLookVector, &m_vLookVector, &R);//m_vLookVectorm_vUpVectorתfAngleǶ m_vTargetPosition = m_vLookVector * D3DXVec3Length(&m_vCameraPosition);//һ¹۲λãģ= } //----------------------------------------------------------------------------- // NameCameraClass::RotationLookVec( ) // Desc: ع۲תfAngleȵλĽǶ //----------------------------------------------------------------------------- VOID CameraClass::RotationLookVec(FLOAT fAngle) { D3DXMATRIX R; D3DXMatrixRotationAxis(&R, &m_vLookVector, fAngle);//m_vLookVectorתfAngleǶȵR D3DXVec3TransformCoord(&m_vRightVector, &m_vRightVector, &R);//m_vRightVectorm_vLookVectorתfAngleǶ D3DXVec3TransformCoord(&m_vUpVector, &m_vUpVector, &R);//m_vUpVectorm_vLookVectorתfAngleǶ m_vTargetPosition = m_vLookVector * D3DXVec3Length(&m_vCameraPosition);//һ¹۲λãģ= } //----------------------------------------------------------------------------- // Desc: //----------------------------------------------------------------------------- CameraClass::~CameraClass(void) { } ================================================ FILE: Direct3D-Game-Demo/D3Ddemo17/CameraClass.h ================================================ //============================================================================= // Name: CameraClass.h // Des: һװʵͷļ // 2013 310 Create by dzī //============================================================================= #pragma once #include #include class CameraClass { private: //Ա D3DXVECTOR3 m_vRightVector; // ҷ D3DXVECTOR3 m_vUpVector; // Ϸ D3DXVECTOR3 m_vLookVector; // ۲췽 D3DXVECTOR3 m_vCameraPosition; // λõ D3DXVECTOR3 m_vTargetPosition; //Ŀ۲λõ D3DXMATRIX m_matView; // ȡ任 D3DXMATRIX m_matProj; // ͶӰ任 LPDIRECT3DDEVICE9 m_pd3dDevice; //Direct3D豸 public: //һȡ任ĺ VOID CalculateViewMatrix(D3DXMATRIX *pMatrix); //ȡ任 //Getϵк VOID GetProjMatrix(D3DXMATRIX *pMatrix) { *pMatrix = m_matProj; } //صǰͶӰ VOID GetCameraPosition(D3DXVECTOR3 *pVector) { *pVector = m_vCameraPosition; } //صǰλþ VOID GetLookVector(D3DXVECTOR3 *pVector) { *pVector = m_vLookVector; } //صǰĹ۲ //ĸSetϵкעDzĬֵNULLģʱдҲ VOID SetTargetPosition(D3DXVECTOR3 *pLookat = NULL); //Ŀ۲λ VOID SetCameraPosition(D3DXVECTOR3 *pVector = NULL); //ڵλ VOID SetViewMatrix(D3DXMATRIX *pMatrix = NULL); //ȡ任 VOID SetProjMatrix(D3DXMATRIX *pMatrix = NULL); //ͶӰ任 public: // ظƽƵ VOID MoveAlongRightVec(FLOAT fUnits); // rightƶ VOID MoveAlongUpVec(FLOAT fUnits); // upƶ VOID MoveAlongLookVec(FLOAT fUnits); // lookƶ // Ƹת VOID RotationRightVec(FLOAT fAngle); // rightѡ VOID RotationUpVec(FLOAT fAngle); // upת VOID RotationLookVec(FLOAT fAngle); // lookת public: //캯 CameraClass(IDirect3DDevice9 *pd3dDevice); //캯 virtual ~CameraClass(void); // }; ================================================ FILE: Direct3D-Game-Demo/D3Ddemo17/D3DUtil.h ================================================ //***************************************************************************************** // Desc: D3DUtil.hͷļڹĶ // 2013 203 Create by dzī //***************************************************************************************** #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 ================================================ FILE: Direct3D-Game-Demo/D3Ddemo17/D3Ddemo17.cpp ================================================ //-----------------------------------˵---------------------------------------------- // :D3Ddemo17 // 20134 Create by dzī // ع磺άϵͳʵ ʾ // زijħ3 ҹս // ģزijν Ʒ //------------------------------------------------------------------------------------------------ //-----------------------------------궨岿֡-------------------------------------------- // һЩ //------------------------------------------------------------------------------------------------ #define WINDOW_WIDTH 850 //Ϊڿȶĺ꣬Էڴ˴޸Ĵڿ #define WINDOW_HEIGHT 700 //Ϊڸ߶ȶĺ꣬Էڴ˴޸Ĵڸ߶ #define WINDOW_TITLE _T("ϨϷ롿ع磺άϵͳʵ ʾ") //Ϊڱⶨĺ //-----------------------------------ͷļ֡--------------------------------------- // ͷļ //------------------------------------------------------------------------------------------------ #include #include #include #include #include "DirectInputClass.h" #include "CameraClass.h" #include "TerrainClass.h" //-----------------------------------ļ֡--------------------------------------- // Ŀļ //------------------------------------------------------------------------------------------------ #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; // LPD3DXMESH g_pMesh = NULL; // D3DMATERIAL9* g_pMaterials= NULL; // IJϢ LPDIRECT3DTEXTURE9* g_pTextures = NULL; // Ϣ DWORD g_dwNumMtrls = 0; // ʵĿ LPD3DXMESH g_cylinder = NULL; // D3DMATERIAL9 g_MaterialCylinder; //ӵIJ DInputClass* g_pDInput = NULL; //DInputClassָʵ CameraClass* g_pCamera = NULL; //ָʵ TerrainClass* g_pTerrain = NULL; //ָʵ //-----------------------------------ȫֺ֡------------------------------------- // ȫֺֹδıʶϵд //------------------------------------------------------------------------------------------------ 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 HelpText_Render(HWND hwnd); //-----------------------------------WinMain( )-------------------------------------- // WindowsӦóںǵij↑ʼ //------------------------------------------------------------------------------------------------ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nShowCmd) { //ʼһĴ WNDCLASSEX wndClass = { 0 }; //WINDCLASSEXһ࣬wndClassʵWINDCLASSEX֮󴰿ڵĸʼ wndClass.cbSize = sizeof( WNDCLASSEX ) ; //ýṹֽС wndClass.style = CS_HREDRAW | CS_VREDRAW; //ôڵʽ wndClass.lpfnWndProc = WndProc; //ָ򴰿ڹָ̺ wndClass.cbClsExtra = 0; wndClass.cbWndExtra = 0; wndClass.hInstance = hInstance; //ָڹ̵ijʵ wndClass.hIcon=(HICON)::LoadImage(NULL,_T("icon.ico"),IMAGE_ICON,0,0,LR_DEFAULTSIZE|LR_LOADFROMFILE); //ȫֵ::LoadImageӱؼԶicoͼ wndClass.hCursor = LoadCursor( NULL, IDC_ARROW ); //ָĹ wndClass.hbrBackground=(HBRUSH)GetStockObject(GRAY_BRUSH); //ΪhbrBackgroundԱָһɫˢ wndClass.lpszMenuName = NULL; //һԿַָֹ˵Դ֡ wndClass.lpszClassName = _T("ForTheDreamOfGameDevelop"); //һԿַָֹ֡ if( !RegisterClassEx( &wndClass ) ) //괰ںҪԴעᣬܴ͵Ĵ return -1; HWND hwnd = CreateWindow( _T("ForTheDreamOfGameDevelop"),WINDOW_TITLE, //ϲּĴںCreateWindow WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, WINDOW_WIDTH, WINDOW_HEIGHT, NULL, NULL, hInstance, NULL ); //Direct3DԴijʼʧmessageboxʾ if (!(S_OK==Direct3D_Init (hwnd,hInstance))) { MessageBox(hwnd, _T("Direct3Dʼʧ~"), _T("dzīϢ"), 0); //ʹMessageBoxһϢ } PlaySound(L"NightElfX1.wav", NULL, SND_FILENAME | SND_ASYNC|SND_LOOP); //ѭű MoveWindow(hwnd,200,10,WINDOW_WIDTH,WINDOW_HEIGHT,true); //ʾʱλãϽλĻ꣨20010 ShowWindow( hwnd, nShowCmd ); //Win32ShowWindowʾ UpdateWindow(hwnd); //Դڽи£·Ҫװһ //DirectInputijʼ g_pDInput = new DInputClass(); g_pDInput->Init(hwnd,hInstance,DISCL_FOREGROUND | DISCL_NONEXCLUSIVE,DISCL_FOREGROUND | DISCL_NONEXCLUSIVE); //Ϣѭ 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); //ȾлȾ } } UnregisterClass(_T("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_CleanUpCOMӿڶ PostQuitMessage( 0 ); //ϵͳиֹ߳ӦWM_DESTROYϢ break; //switch default: //caseϣִиdefault return DefWindowProc( hwnd, message, wParam, lParam ); //ȱʡĴڹΪӦóûдĴϢṩȱʡĴ } return 0; //˳ } //-----------------------------------Direct3D_Init( )---------------------------------- // Direct3DʼDirect3Dijʼ //------------------------------------------------------------------------------------------------ HRESULT Direct3D_Init(HWND hwnd,HINSTANCE hInstance) { //-------------------------------------------------------------------------------------- // Direct3DʼIJ֮һӿڡDirect3Dӿڶ, ԱøDirect3D󴴽Direct3D豸 //-------------------------------------------------------------------------------------- LPDIRECT3D9 pD3D = NULL; //Direct3DӿڶĴ if( NULL == ( pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) ) //ʼDirect3Dӿڶ󣬲DirectX汾Э return E_FAIL; //-------------------------------------------------------------------------------------- // Direct3DʼIJ֮,ȡϢȡӲ豸Ϣ //-------------------------------------------------------------------------------------- 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ʼIJ֮ݡ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; d3dpp.EnableAutoDepthStencil = true; d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8; d3dpp.Flags = 0; d3dpp.FullScreen_RefreshRateInHz = 0; d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; //-------------------------------------------------------------------------------------- // Direct3DʼIJ֮ģ豸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( )-------------------------------------- // ȾԴʼڴ˺нҪȾԴijʼ //-------------------------------------------------------------------------------------------------- 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ļм LPD3DXBUFFER pAdjBuffer = NULL; LPD3DXBUFFER pMtrlBuffer = NULL; D3DXLoadMeshFromX(L"bee.X", D3DXMESH_MANAGED, g_pd3dDevice, &pAdjBuffer, &pMtrlBuffer, NULL, &g_dwNumMtrls, &g_pMesh); // ȡʺ D3DXMATERIAL *pMtrls = (D3DXMATERIAL*)pMtrlBuffer->GetBufferPointer(); //һD3DXMATERIALṹڶȡʺϢ g_pMaterials = new D3DMATERIAL9[g_dwNumMtrls]; g_pTextures = new LPDIRECT3DTEXTURE9[g_dwNumMtrls]; for (DWORD i=0; iSetLight(0, &light); g_pd3dDevice->LightEnable(0, true); g_pd3dDevice->SetRenderState(D3DRS_NORMALIZENORMALS, true); g_pd3dDevice->SetRenderState(D3DRS_SPECULARENABLE, true); // ʼ g_pCamera = new CameraClass(g_pd3dDevice); g_pCamera->SetCameraPosition(&D3DXVECTOR3(0.0f, 12000.0f, -30000.0f)); //ڵλ g_pCamera->SetTargetPosition(&D3DXVECTOR3(0.0f, 10000.0f, 0.0f)); //Ŀ۲ڵλ g_pCamera->SetViewMatrix(); //ȡ任 g_pCamera->SetProjMatrix(); //ͶӰ任 // ʼ g_pTerrain = new TerrainClass(g_pd3dDevice); g_pTerrain->LoadTerrainFromFile(L"heighmap.raw", L"green.jpg"); //ļظ߶ͼ g_pTerrain->InitTerrain(200, 200, 300.0f, 70.0f); //ĸֱֵǶ࣬ϵ return S_OK; } //-----------------------------------Direct3D_Update( )-------------------------------- // ǼʱȾ뵫Ҫʱõģ簴ĸģ //-------------------------------------------------------------------------------------------------- void Direct3D_Update( HWND hwnd) { //ʹDirectInputȡ g_pDInput->GetInput(); // ƶӽ if (g_pDInput->IsKeyDown(DIK_A)) g_pCamera->MoveAlongRightVec(-10.0f); if (g_pDInput->IsKeyDown(DIK_D)) g_pCamera->MoveAlongRightVec( 10.0f); if (g_pDInput->IsKeyDown(DIK_W)) g_pCamera->MoveAlongLookVec( 10.0f); if (g_pDInput->IsKeyDown(DIK_S)) g_pCamera->MoveAlongLookVec(-10.0f); if (g_pDInput->IsKeyDown(DIK_R)) g_pCamera->MoveAlongUpVec( 10.0f); if (g_pDInput->IsKeyDown(DIK_F)) g_pCamera->MoveAlongUpVec(-10.0f); //תӽ if (g_pDInput->IsKeyDown(DIK_LEFT)) g_pCamera->RotationUpVec(-0.003f); if (g_pDInput->IsKeyDown(DIK_RIGHT)) g_pCamera->RotationUpVec( 0.003f); if (g_pDInput->IsKeyDown(DIK_UP)) g_pCamera->RotationRightVec(-0.003f); if (g_pDInput->IsKeyDown(DIK_DOWN)) g_pCamera->RotationRightVec( 0.003f); if (g_pDInput->IsKeyDown(DIK_E)) g_pCamera->RotationLookVec( 0.001f); if (g_pDInput->IsKeyDown(DIK_Q)) g_pCamera->RotationLookVec(-0.001f); //ת g_pCamera->RotationUpVec(g_pDInput->MouseDX()* 0.001f); g_pCamera->RotationRightVec(g_pDInput->MouseDY() * 0.001f); //ֿƹ۲ static FLOAT fPosZ=0.0f; fPosZ += g_pDInput->MouseDZ()*0.03f; //㲢ȡ任 D3DXMATRIX matView; g_pCamera->CalculateViewMatrix(&matView); g_pd3dDevice->SetTransform(D3DTS_VIEW, &matView); //ȷ任浽g_matWorld D3DXMatrixTranslation(&g_matWorld, 0.0f, 0.0f, fPosZ); //δƶ POINT lt,rb; RECT rect; GetClientRect(hwnd,&rect); //ȡôڲ //ϵlt lt.x = rect.left; lt.y = rect.top; //rb rb.x = rect.right; rb.y = rect.bottom; //ltrbĴתΪĻ ClientToScreen(hwnd,<); ClientToScreen(hwnd,&rb); //Ļ趨 rect.left = lt.x; rect.top = lt.y; rect.right = rb.x; rect.bottom = rb.y; //ƶ ClipCursor(&rect); ShowCursor(false); // } //-----------------------------------Direct3D_Render( )------------------------------- // ʹDirect3DȾ //-------------------------------------------------------------------------------------------------- void Direct3D_Render(HWND hwnd) { //-------------------------------------------------------------------------------------- // Direct3DȾ岽֮һ //-------------------------------------------------------------------------------------- g_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER|D3DCLEAR_STENCIL, D3DCOLOR_XRGB(0, 108, 255), 1.0f, 0); //-------------------------------------------------------------------------------------- // Direct3DȾ岽֮ʼ //-------------------------------------------------------------------------------------- g_pd3dDevice->BeginScene(); // ʼ //-------------------------------------------------------------------------------------- // Direct3DȾ岽֮ʽ //-------------------------------------------------------------------------------------- //ƴƷ D3DXMATRIX mScal,mRot1,mRot2,mTrans,mFinal; //һЩ׼ԴƷо任 D3DXMatrixScaling(&mScal,20.0f,20.0f,20.0f); D3DXMatrixTranslation(&mTrans,0,8000,0); D3DXMatrixRotationX(&mRot1, D3DX_PI/2); D3DXMatrixRotationY(&mRot2, D3DX_PI/2); mFinal=mScal*mRot1*mRot2*mTrans*g_matWorld; g_pd3dDevice->SetTransform(D3DTS_WORLD, &mFinal);//ģ͵Ϊ׼ // һforѭģ͵ֵĻ for (DWORD i = 0; i < g_dwNumMtrls; i++) { g_pd3dDevice->SetMaterial(&g_pMaterials[i]); //ô˲ֵIJ g_pd3dDevice->SetTexture(0, g_pTextures[i]);//ô˲ֵ g_pMesh->DrawSubset(i); //ƴ˲ } //Ƶ g_pTerrain->RenderTerrain(&g_matWorld, false); //ȾΣҵڶΪfalseʾȾε߿ // D3DXMATRIX TransMatrix, RotMatrix, FinalMatrix; D3DXMatrixRotationX(&RotMatrix, -D3DX_PI * 0.5f); g_pd3dDevice->SetMaterial(&g_MaterialCylinder); for(int i = 0; i < 4; i++) { D3DXMatrixTranslation(&TransMatrix, -10000.0f, 0.0f, -15000.0f + (i * 20000.0f)); FinalMatrix = RotMatrix * TransMatrix ; g_pd3dDevice->SetTransform(D3DTS_WORLD, &FinalMatrix); g_cylinder->DrawSubset(0); D3DXMatrixTranslation(&TransMatrix, 10000.0f, 0.0f, -15000.0f + (i * 20000.0f)); FinalMatrix = RotMatrix * TransMatrix ; g_pd3dDevice->SetTransform(D3DTS_WORLD, &FinalMatrix); g_cylinder->DrawSubset(0); } //Ϣ HelpText_Render(hwnd); //-------------------------------------------------------------------------------------- // Direct3DȾ岽֮ġ //-------------------------------------------------------------------------------------- g_pd3dDevice->EndScene(); // //-------------------------------------------------------------------------------------- // Direct3DȾ岽֮塿ʾת //-------------------------------------------------------------------------------------- g_pd3dDevice->Present(NULL, NULL, NULL, NULL); // תʾ } //-----------------------------------HelpText_Render( )------------------------------- // װ˰Ϣĺ //-------------------------------------------------------------------------------------------------- void HelpText_Render(HWND hwnd) { //һΣڻȡھ RECT formatRect; GetClientRect(hwnd, &formatRect); //ڴϽǴʾÿ֡ formatRect.top = 5; 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.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" Wǰ S ", -1, &formatRect, DT_SINGLELINE | DT_NOCLIP | DT_LEFT, D3DCOLOR_RGBA(255,200,0,255)); formatRect.top += 25; g_pTextHelper->DrawText(NULL, L" A Dҷ", -1, &formatRect, DT_SINGLELINE | DT_NOCLIP | DT_LEFT, D3DCOLOR_RGBA(255,200,0,255)); formatRect.top += 25; g_pTextHelper->DrawText(NULL, L" RֱϷ Fֱ·", -1, &formatRect, DT_SINGLELINE | DT_NOCLIP | DT_LEFT, D3DCOLOR_RGBA(255,200,0,255)); formatRect.top += 25; g_pTextHelper->DrawText(NULL, L" Qб Eб", -1, &formatRect, DT_SINGLELINE | DT_NOCLIP | DT_LEFT, D3DCOLOR_RGBA(255,200,0,255)); formatRect.top += 25; g_pTextHelper->DrawText(NULL, L" ϡ¡ҷƶӽDZ仯 ", -1, &formatRect, DT_SINGLELINE | DT_NOCLIP | DT_LEFT, D3DCOLOR_RGBA(255,200,0,255)); formatRect.top += 25; g_pTextHelper->DrawText(NULL, L" ֣ģY᷽ƶ", -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)); } //-----------------------------------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ӿڶ for (DWORD i = 0; iCreateDevice( GUID_SysKeyboard, &m_KeyboardDevice, NULL )); HR( m_KeyboardDevice->SetCooperativeLevel( hWnd, keyboardCoopFlags)); HR( m_KeyboardDevice->SetDataFormat( &c_dfDIKeyboard )); HR( m_KeyboardDevice->Acquire( )); HR( m_KeyboardDevice->Poll( )); //豸ijʼ 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; } //----------------------------------------------------------------------------- // NameDInputClass::GetInput() // Desc: ڻȡϢĺ //----------------------------------------------------------------------------- void DInputClass::GetInput() { 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); } } //----------------------------------------------------------------------------- // NameDInputClass::IsKeyDown() // Desc: жϼijǷ //----------------------------------------------------------------------------- bool DInputClass::IsKeyDown(int iKey) { if(m_keyBuffer[iKey] & 0x80) return true; else return false; } //----------------------------------------------------------------------------- // NameDInputClass::IsMouseButtonDown() // Desc: жijǷ //----------------------------------------------------------------------------- bool DInputClass::IsMouseButtonDown(int button) { return (m_MouseState.rgbButtons[button] & 0x80) != 0; } //----------------------------------------------------------------------------- // NameDInputClass::MouseDX // Desc: ָXֵ //----------------------------------------------------------------------------- float DInputClass::MouseDX() { return (float)m_MouseState.lX; } //----------------------------------------------------------------------------- // NameDInputClass::MouseDY // Desc: ָYֵ //----------------------------------------------------------------------------- float DInputClass::MouseDY() { return (float)m_MouseState.lY; } //----------------------------------------------------------------------------- // NameDInputClass::MouseDZ // Desc: ָZֵ֣ //----------------------------------------------------------------------------- float DInputClass::MouseDZ() { return (float)m_MouseState.lZ; } //----------------------------------------------------------------------------- // Desc: //----------------------------------------------------------------------------- DInputClass::~DInputClass(void) { 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); } ================================================ FILE: Direct3D-Game-Demo/D3Ddemo17/DirectInputClass.h ================================================ //============================================================================= // Name: DirectInputClass.h // Des: װDirectInput봦ͷļ // 2013 203 Create by dzī //============================================================================= #pragma once #include "D3DUtil.h" #define DIRECTINPUT_VERSION 0x0800 #include //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); //жϼijǷ bool IsMouseButtonDown(int button); //ж갴Ƿ񱻰 float MouseDX(); //Xֵ float MouseDY(); //Yֵ float MouseDZ(); //Zֵ public: DInputClass(void); //캯 ~DInputClass(void); // }; ================================================ FILE: Direct3D-Game-Demo/D3Ddemo17/TerrainClass.cpp ================================================ //============================================================================= // Name: TerrainClass.cpp // Des: һװάϵͳԴļ // 2013 317 Create by dzī //============================================================================= #include "TerrainClass.h" //----------------------------------------------------------------------------- // Desc: 캯 //----------------------------------------------------------------------------- TerrainClass::TerrainClass(IDirect3DDevice9* pd3dDevice) { //Աֵ m_pd3dDevice = pd3dDevice; m_pTexture = NULL; m_pIndexBuffer = NULL; m_pVertexBuffer = NULL; m_nCellsPerRow = 0; m_nCellsPerCol = 0; m_nVertsPerRow = 0; m_nVertsPerCol = 0; m_nNumVertices = 0; m_fTerrainWidth = 0.0f; m_fTerrainDepth = 0.0f; m_fCellSpacing = 0.0f; m_fHeightScale = 0.0f; } //-------------------------------------------------------------------------------------- // Name: TerrainClass::LoadTerrainFromFile() // Desc: صθ߶ϢԼ //-------------------------------------------------------------------------------------- BOOL TerrainClass::LoadTerrainFromFile(wchar_t *pRawFileName, wchar_t *pTextureFile) { // ļжȡ߶Ϣ std::ifstream inFile; inFile.open(pRawFileName, std::ios::binary); //öƵķʽļ inFile.seekg(0,std::ios::end); //ļָƶļĩβ std::vector inData(inFile.tellg()); //ģ嶨һvector͵ıinDataʼֵΪǰλãС inFile.seekg(std::ios::beg); //ļָƶļĿͷ׼ȡ߶Ϣ inFile.read((char*)&inData[0], inData.size()); //ؼһȡ߶Ϣ inFile.close(); //Թرļ m_vHeightInfo.resize(inData.size()); //m_vHeightInfoߴȡΪijߴ //inDataеֵm_vHeightInfo for (unsigned int i=0; iCreateVertexBuffer(m_nNumVertices * sizeof(TERRAINVERTEX), D3DUSAGE_WRITEONLY, TERRAINVERTEX::FVF, D3DPOOL_MANAGED, &m_pVertexBuffer, 0))) return FALSE; //2 TERRAINVERTEX *pVertices = NULL; m_pVertexBuffer->Lock(0, 0, (void**)&pVertices, 0); //3ʣֵ FLOAT fStartX = -m_fTerrainWidth / 2.0f, fEndX = m_fTerrainWidth / 2.0f; //ָʼͽXֵ FLOAT fStartZ = m_fTerrainDepth / 2.0f, fEndZ = -m_fTerrainDepth / 2.0f; //ָʼͽZֵ FLOAT fCoordU = 3.0f / (FLOAT)m_nCellsPerRow; //ָĺֵ FLOAT fCoordV = 3.0f / (FLOAT)m_nCellsPerCol; //ֵָ int nIndex = 0, i = 0, j = 0; for (float z = fStartZ; z > fEndZ; z -= m_fCellSpacing, i++) //Z귽ʼ㵽мı { j = 0; for (float x = fStartX; x < fEndX; x += m_fCellSpacing, j++) //X귽ʼ㵽мı { nIndex = i * m_nCellsPerRow + j; //ָǰڶ㻺еλ pVertices[nIndex] = TERRAINVERTEX(x, m_vHeightInfo[nIndex], z, j*fCoordU, i*fCoordV); //Ѷλڸ߶ͼжӦĸԼ긳ֵǰĶ nIndex++; //Լ1 } } //4 m_pVertexBuffer->Unlock(); //--------------------------------------------------------------- // ε //--------------------------------------------------------------- //1. if (FAILED(m_pd3dDevice->CreateIndexBuffer(m_nNumVertices * 6 *sizeof(WORD), D3DUSAGE_WRITEONLY, D3DFMT_INDEX16, D3DPOOL_MANAGED, &m_pIndexBuffer, 0))) return FALSE; //2. WORD* pIndices = NULL; m_pIndexBuffer->Lock(0, 0, (void**)&pIndices, 0); //3.ʣֵ nIndex = 0; for(int row = 0; row < m_nCellsPerRow-1; row++) //ÿ { for(int col = 0; col < m_nCellsPerCol-1; col++) //ÿ { //ABC pIndices[nIndex] = row * m_nCellsPerRow + col; //A pIndices[nIndex+1] = row * m_nCellsPerRow + col + 1; //B pIndices[nIndex+2] = (row+1) * m_nCellsPerRow + col; //C //CBD pIndices[nIndex+3] = (row+1) * m_nCellsPerRow + col; //C pIndices[nIndex+4] = row * m_nCellsPerRow + col + 1; //B pIndices[nIndex+5] = (row+1) * m_nCellsPerRow + col + 1;//D //һԪ6 nIndex += 6; //Լ6 } } //4 m_pIndexBuffer->Unlock(); return TRUE; } //-------------------------------------------------------------------------------------- // Name: TerrainClass::RenderTerrain() // Desc: ƳΣͨڶѡǷƳ߿ //-------------------------------------------------------------------------------------- BOOL TerrainClass::RenderTerrain(D3DXMATRIX *pMatWorld, BOOL bRenderFrame) { m_pd3dDevice->SetStreamSource(0, m_pVertexBuffer, 0, sizeof(TERRAINVERTEX)); ///ѰļϢĶ㻺Ⱦˮ m_pd3dDevice->SetFVF(TERRAINVERTEX::FVF);//ָʹõʽĺ m_pd3dDevice->SetIndices(m_pIndexBuffer);// m_pd3dDevice->SetTexture(0, m_pTexture);// m_pd3dDevice->SetRenderState(D3DRS_LIGHTING, FALSE); //رչ m_pd3dDevice->SetTransform(D3DTS_WORLD, pMatWorld); // m_pd3dDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, m_nNumVertices, 0, m_nNumVertices * 2); //ƶ m_pd3dDevice->SetRenderState(D3DRS_LIGHTING, TRUE); //򿪹 m_pd3dDevice->SetTexture(0, 0); //ÿ if (bRenderFrame) //ҪȾ߿Ļ { m_pd3dDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME); //ģʽΪ߿ m_pd3dDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, m_nNumVertices, 0, m_nNumVertices * 2); //ƶ m_pd3dDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID); //ģʽʵ } return TRUE; } //----------------------------------------------------------------------------- // Desc: //----------------------------------------------------------------------------- TerrainClass::~TerrainClass(void) { SAFE_RELEASE(m_pTexture); SAFE_RELEASE(m_pIndexBuffer); SAFE_RELEASE(m_pVertexBuffer); } ================================================ FILE: Direct3D-Game-Demo/D3Ddemo17/TerrainClass.h ================================================ //============================================================================= // Name: TerrainClass.h // Des: һװάϵͳͷļ // 2013 317 Create by dzī //============================================================================= #pragma once #include #include #include #include #include "D3DUtil.h" class TerrainClass { private: LPDIRECT3DDEVICE9 m_pd3dDevice; //D3D豸 LPDIRECT3DTEXTURE9 m_pTexture; // LPDIRECT3DINDEXBUFFER9 m_pIndexBuffer; //㻺 LPDIRECT3DVERTEXBUFFER9 m_pVertexBuffer; // int m_nCellsPerRow; // ÿеĵԪ int m_nCellsPerCol; // ÿеĵԪ int m_nVertsPerRow; // ÿеĶ int m_nVertsPerCol; // ÿеĶ int m_nNumVertices; // FLOAT m_fTerrainWidth; // εĿ FLOAT m_fTerrainDepth; // ε FLOAT m_fCellSpacing; // Ԫļ FLOAT m_fHeightScale; // ߶ϵ std::vector m_vHeightInfo; // ڴŸ߶Ϣ //һεFVFʽ struct TERRAINVERTEX { FLOAT _x, _y, _z; FLOAT _u, _v; TERRAINVERTEX(FLOAT x, FLOAT y, FLOAT z, FLOAT u, FLOAT v) :_x(x), _y(y), _z(z), _u(u), _v(v) {} static const DWORD FVF = D3DFVF_XYZ | D3DFVF_TEX1; }; public: TerrainClass(IDirect3DDevice9 *pd3dDevice); //캯 virtual ~TerrainClass(void); // public: BOOL LoadTerrainFromFile(wchar_t *pRawFileName, wchar_t *pTextureFile); //ļظ߶ͼĺ BOOL InitTerrain(INT nRows, INT nCols, FLOAT fSpace, FLOAT fScale); //γʼ BOOL RenderTerrain(D3DXMATRIX *pMatWorld, BOOL bDrawFrame=FALSE); //Ⱦ }; ================================================ FILE: Direct3D-Game-Demo/D3Ddemo18/CameraClass.cpp ================================================ //============================================================================= // Name: CameraClass.cpp // Des: һװʵԴļ // 2013 310 Create by dzī //============================================================================= #include "CameraClass.h" #ifndef WINDOW_WIDTH #define WINDOW_WIDTH 800 //Ϊڿȶĺ꣬Էڴ˴޸Ĵڿ #define WINDOW_HEIGHT 600 //Ϊڸ߶ȶĺ꣬Էڴ˴޸Ĵڸ߶ #endif //----------------------------------------------------------------------------- // Desc: 캯 //----------------------------------------------------------------------------- CameraClass::CameraClass(IDirect3DDevice9 *pd3dDevice) { m_pd3dDevice = pd3dDevice; m_vRightVector = D3DXVECTOR3(1.0f, 0.0f, 0.0f); // ĬXغ m_vUpVector = D3DXVECTOR3(0.0f, 1.0f, 0.0f); // ĬYغ m_vLookVector = D3DXVECTOR3(0.0f, 0.0f, 1.0f); // ĬϹ۲Zغ m_vCameraPosition = D3DXVECTOR3(0.0f, 0.0f, -250.0f); // ĬΪ(0.0f, 0.0f, -250.0f) m_vTargetPosition = D3DXVECTOR3(0.0f, 0.0f, 0.0f);//ĬϹ۲ĿλΪ(0.0f, 0.0f, 0.0f); } //----------------------------------------------------------------------------- // NameCameraClass::CalculateViewMatrix( ) // Desc: ݸľȡ任 //----------------------------------------------------------------------------- VOID CameraClass::CalculateViewMatrix(D3DXMATRIX *pMatrix) { //1.Ȱ3淶ʹ໥ֱΪһ D3DXVec3Normalize(&m_vLookVector, &m_vLookVector); //淶۲ D3DXVec3Cross(&m_vUpVector, &m_vLookVector, &m_vRightVector); // ۲ֱ D3DXVec3Normalize(&m_vUpVector, &m_vUpVector); // 淶 D3DXVec3Cross(&m_vRightVector, &m_vUpVector, &m_vLookVector); // ֱ D3DXVec3Normalize(&m_vRightVector, &m_vRightVector); // 淶 // 2.ȡ任 //дȡ任ĵһ pMatrix->_11 = m_vRightVector.x; // Rx pMatrix->_12 = m_vUpVector.x; // Ux pMatrix->_13 = m_vLookVector.x; // Lx pMatrix->_14 = 0.0f; //дȡ任ĵڶ pMatrix->_21 = m_vRightVector.y; // Ry pMatrix->_22 = m_vUpVector.y; // Uy pMatrix->_23 = m_vLookVector.y; // Ly pMatrix->_24 = 0.0f; //дȡ任ĵ pMatrix->_31 = m_vRightVector.z; // Rz pMatrix->_32 = m_vUpVector.z; // Uz pMatrix->_33 = m_vLookVector.z; // Lz pMatrix->_34 = 0.0f; //дȡ任ĵ pMatrix->_41 = -D3DXVec3Dot(&m_vRightVector, &m_vCameraPosition); // -P*R pMatrix->_42 = -D3DXVec3Dot(&m_vUpVector, &m_vCameraPosition); // -P*U pMatrix->_43 = -D3DXVec3Dot(&m_vLookVector, &m_vCameraPosition); // -P*L pMatrix->_44 = 1.0f; } //----------------------------------------------------------------------------- // NameCameraClass::SetTargetPosition( ) // Desc: Ĺ۲λ //----------------------------------------------------------------------------- VOID CameraClass::SetTargetPosition(D3DXVECTOR3 *pLookat) { //ȿpLookatǷΪĬֵNULL if (pLookat != NULL) m_vTargetPosition = (*pLookat); else m_vTargetPosition = D3DXVECTOR3(0.0f, 0.0f, 1.0f); m_vLookVector = m_vTargetPosition - m_vCameraPosition;//۲λüλãõ۲췽 D3DXVec3Normalize(&m_vLookVector, &m_vLookVector);//淶m_vLookVector //淶m_vUpVectorm_vRightVector D3DXVec3Cross(&m_vUpVector, &m_vLookVector, &m_vRightVector); D3DXVec3Normalize(&m_vUpVector, &m_vUpVector); D3DXVec3Cross(&m_vRightVector, &m_vUpVector, &m_vLookVector); D3DXVec3Normalize(&m_vRightVector, &m_vRightVector); } //----------------------------------------------------------------------------- // NameCameraClass::SetCameraPosition( ) // Desc: ڵλ //----------------------------------------------------------------------------- VOID CameraClass::SetCameraPosition(D3DXVECTOR3 *pVector) { D3DXVECTOR3 V = D3DXVECTOR3(0.0f, 0.0f, -250.0f); m_vCameraPosition = pVector ? (*pVector) : V;//ĿpVectorΪĻ //*pVectorֵm_vCameraPosition=*pVector //򷵻Vֵm_vCameraPosition=V } //----------------------------------------------------------------------------- // NameCameraClass::SetViewMatrix( ) // Desc: ȡ任 //----------------------------------------------------------------------------- VOID CameraClass::SetViewMatrix(D3DXMATRIX *pMatrix) { //pMatrixֵһж if (pMatrix) m_matView = *pMatrix; else CalculateViewMatrix(&m_matView); m_pd3dDevice->SetTransform(D3DTS_VIEW, &m_matView); //ȡ任ֱֵҷϷ͹۲ m_vRightVector = D3DXVECTOR3(m_matView._11, m_matView._12, m_matView._13); m_vUpVector = D3DXVECTOR3(m_matView._21, m_matView._22, m_matView._23); m_vLookVector = D3DXVECTOR3(m_matView._31, m_matView._32, m_matView._33); } //----------------------------------------------------------------------------- // NameCameraClass::SetProjMatrix( ) // Desc: ͶӰ任 //----------------------------------------------------------------------------- VOID CameraClass::SetProjMatrix(D3DXMATRIX *pMatrix) { //жֵûУûеĻͼһ if (pMatrix != NULL) m_matProj = *pMatrix; else D3DXMatrixPerspectiveFovLH(&m_matProj, D3DX_PI / 4.0f, (float)((double)WINDOW_WIDTH/WINDOW_HEIGHT), 1.0f, 300000.0f);//ӽԶһ㣬Ͳ¿Զ m_pd3dDevice->SetTransform(D3DTS_PROJECTION, &m_matProj);//ͶӰ任 } //----------------------------------------------------------------------------- // NameCameraClass::MoveAlongRightVec( ) // Desc: ƽfUnitsλ //----------------------------------------------------------------------------- VOID CameraClass::MoveAlongRightVec(FLOAT fUnits) { //ֱӳfUnitsۼӾ m_vCameraPosition += m_vRightVector * fUnits; m_vTargetPosition += m_vRightVector * fUnits; } //----------------------------------------------------------------------------- // NameCameraClass::MoveAlongUpVec( ) // Desc: ƽfUnitsλ //----------------------------------------------------------------------------- VOID CameraClass::MoveAlongUpVec(FLOAT fUnits) { //ֱӳfUnitsۼӾ m_vCameraPosition += m_vUpVector * fUnits; m_vTargetPosition += m_vUpVector * fUnits; } //----------------------------------------------------------------------------- // NameCameraClass::MoveAlongLookVec( ) // Desc: ع۲ƽfUnitsλ //----------------------------------------------------------------------------- VOID CameraClass::MoveAlongLookVec(FLOAT fUnits) { //ֱӳfUnitsۼӾ m_vCameraPosition += m_vLookVector * fUnits; m_vTargetPosition += m_vLookVector * fUnits; } //----------------------------------------------------------------------------- // NameCameraClass::RotationRightVec( ) // Desc: תfAngleȵλĽǶ //----------------------------------------------------------------------------- VOID CameraClass::RotationRightVec(FLOAT fAngle) { D3DXMATRIX R; D3DXMatrixRotationAxis(&R, &m_vRightVector, fAngle);//m_vRightVectorתfAngleǶȵR D3DXVec3TransformCoord(&m_vUpVector, &m_vUpVector, &R);//m_vUpVectorm_vRightVectorתfAngleǶ D3DXVec3TransformCoord(&m_vLookVector, &m_vLookVector, &R);//m_vLookVectorm_vRightVectorתfAngleǶ m_vTargetPosition = m_vLookVector * D3DXVec3Length(&m_vCameraPosition);//һ¹۲λãģ= } //----------------------------------------------------------------------------- // NameCameraClass::RotationUpVec( ) // Desc: תfAngleȵλĽǶ //----------------------------------------------------------------------------- VOID CameraClass::RotationUpVec(FLOAT fAngle) { D3DXMATRIX R; D3DXMatrixRotationAxis(&R, &m_vUpVector, fAngle);//m_vUpVectorתfAngleǶȵR D3DXVec3TransformCoord(&m_vRightVector, &m_vRightVector, &R);//m_vRightVectorm_vUpVectorתfAngleǶ D3DXVec3TransformCoord(&m_vLookVector, &m_vLookVector, &R);//m_vLookVectorm_vUpVectorתfAngleǶ m_vTargetPosition = m_vLookVector * D3DXVec3Length(&m_vCameraPosition);//һ¹۲λãģ= } //----------------------------------------------------------------------------- // NameCameraClass::RotationLookVec( ) // Desc: ع۲תfAngleȵλĽǶ //----------------------------------------------------------------------------- VOID CameraClass::RotationLookVec(FLOAT fAngle) { D3DXMATRIX R; D3DXMatrixRotationAxis(&R, &m_vLookVector, fAngle);//m_vLookVectorתfAngleǶȵR D3DXVec3TransformCoord(&m_vRightVector, &m_vRightVector, &R);//m_vRightVectorm_vLookVectorתfAngleǶ D3DXVec3TransformCoord(&m_vUpVector, &m_vUpVector, &R);//m_vUpVectorm_vLookVectorתfAngleǶ m_vTargetPosition = m_vLookVector * D3DXVec3Length(&m_vCameraPosition);//һ¹۲λãģ= } //----------------------------------------------------------------------------- // Desc: //----------------------------------------------------------------------------- CameraClass::~CameraClass(void) { } ================================================ FILE: Direct3D-Game-Demo/D3Ddemo18/CameraClass.h ================================================ //============================================================================= // Name: CameraClass.h // Des: һװʵͷļ // 2013 310 Create by dzī //============================================================================= #pragma once #include #include class CameraClass { private: //Ա D3DXVECTOR3 m_vRightVector; // ҷ D3DXVECTOR3 m_vUpVector; // Ϸ D3DXVECTOR3 m_vLookVector; // ۲췽 D3DXVECTOR3 m_vCameraPosition; // λõ D3DXVECTOR3 m_vTargetPosition; //Ŀ۲λõ D3DXMATRIX m_matView; // ȡ任 D3DXMATRIX m_matProj; // ͶӰ任 LPDIRECT3DDEVICE9 m_pd3dDevice; //Direct3D豸 public: //һȡ任ĺ VOID CalculateViewMatrix(D3DXMATRIX *pMatrix); //ȡ任 //Getϵк VOID GetProjMatrix(D3DXMATRIX *pMatrix) { *pMatrix = m_matProj; } //صǰͶӰ VOID GetCameraPosition(D3DXVECTOR3 *pVector) { *pVector = m_vCameraPosition; } //صǰλþ VOID GetLookVector(D3DXVECTOR3 *pVector) { *pVector = m_vLookVector; } //صǰĹ۲ //ĸSetϵкעDzĬֵNULLģʱдҲ VOID SetTargetPosition(D3DXVECTOR3 *pLookat = NULL); //Ŀ۲λ VOID SetCameraPosition(D3DXVECTOR3 *pVector = NULL); //ڵλ VOID SetViewMatrix(D3DXMATRIX *pMatrix = NULL); //ȡ任 VOID SetProjMatrix(D3DXMATRIX *pMatrix = NULL); //ͶӰ任 public: // ظƽƵ VOID MoveAlongRightVec(FLOAT fUnits); // rightƶ VOID MoveAlongUpVec(FLOAT fUnits); // upƶ VOID MoveAlongLookVec(FLOAT fUnits); // lookƶ // Ƹת VOID RotationRightVec(FLOAT fAngle); // rightѡ VOID RotationUpVec(FLOAT fAngle); // upת VOID RotationLookVec(FLOAT fAngle); // lookת public: //캯 CameraClass(IDirect3DDevice9 *pd3dDevice); //캯 virtual ~CameraClass(void); // }; ================================================ FILE: Direct3D-Game-Demo/D3Ddemo18/D3DUtil.h ================================================ //***************************************************************************************** // Desc: D3DUtil.hͷļڹĶ // 2013 203 Create by dzī //***************************************************************************************** #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 ================================================ FILE: Direct3D-Game-Demo/D3Ddemo18/D3Ddemo18.cpp ================================================ //-----------------------------------˵---------------------------------------------- // :D3Ddemo18 // 20134 Create by dzī // IJ¾άյʵ ʾ // زijɽ // ģزij˫6 //------------------------------------------------------------------------------------------------ //-----------------------------------궨岿֡-------------------------------------------- // һЩ //------------------------------------------------------------------------------------------------ #define WINDOW_WIDTH 932 //Ϊڿȶĺ꣬Էڴ˴޸Ĵڿ #define WINDOW_HEIGHT 700 //Ϊڸ߶ȶĺ꣬Էڴ˴޸Ĵڸ߶ #define WINDOW_TITLE _T("ϨϷ롿IJ¾άյʵ ") //Ϊڱⶨĺ //-----------------------------------ͷļ֡--------------------------------------- // ͷļ //------------------------------------------------------------------------------------------------ #include #include #include #include #include "DirectInputClass.h" #include "CameraClass.h" #include "TerrainClass.h" #include "SkyBoxClass.h" //-----------------------------------ļ֡--------------------------------------- // Ŀļ //------------------------------------------------------------------------------------------------ #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; // LPD3DXMESH g_pMesh = NULL; // D3DMATERIAL9* g_pMaterials= NULL; // IJϢ LPDIRECT3DTEXTURE9* g_pTextures = NULL; // Ϣ DWORD g_dwNumMtrls = 0; // ʵĿ LPD3DXMESH g_cylinder = NULL; // D3DMATERIAL9 g_MaterialCylinder; //ӵIJ DInputClass* g_pDInput = NULL; //DInputClassָʵ CameraClass* g_pCamera = NULL; //ָʵ TerrainClass* g_pTerrain = NULL; //ָʵ SkyBoxClass* g_pSkyBox=NULL; //պָʵ //-----------------------------------ȫֺ֡------------------------------------- // ȫֺֹδıʶϵд //------------------------------------------------------------------------------------------------ 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 HelpText_Render(HWND hwnd); //-----------------------------------WinMain( )-------------------------------------- // WindowsӦóںǵij↑ʼ //------------------------------------------------------------------------------------------------ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nShowCmd) { //ʼһĴ WNDCLASSEX wndClass = { 0 }; //WINDCLASSEXһ࣬wndClassʵWINDCLASSEX֮󴰿ڵĸʼ wndClass.cbSize = sizeof( WNDCLASSEX ) ; //ýṹֽС wndClass.style = CS_HREDRAW | CS_VREDRAW; //ôڵʽ wndClass.lpfnWndProc = WndProc; //ָ򴰿ڹָ̺ wndClass.cbClsExtra = 0; wndClass.cbWndExtra = 0; wndClass.hInstance = hInstance; //ָڹ̵ijʵ wndClass.hIcon=(HICON)::LoadImage(NULL,_T("GameMedia\\icon.ico"),IMAGE_ICON,0,0,LR_DEFAULTSIZE|LR_LOADFROMFILE); //ȫֵ::LoadImageӱؼԶicoͼ wndClass.hCursor = LoadCursor( NULL, IDC_ARROW ); //ָĹ wndClass.hbrBackground=(HBRUSH)GetStockObject(GRAY_BRUSH); //ΪhbrBackgroundԱָһɫˢ wndClass.lpszMenuName = NULL; //һԿַָֹ˵Դ֡ wndClass.lpszClassName = _T("ForTheDreamOfGameDevelop"); //һԿַָֹ֡ if( !RegisterClassEx( &wndClass ) ) //괰ںҪԴעᣬܴ͵Ĵ return -1; HWND hwnd = CreateWindow( _T("ForTheDreamOfGameDevelop"),WINDOW_TITLE, //ϲּĴںCreateWindow WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, WINDOW_WIDTH, WINDOW_HEIGHT, NULL, NULL, hInstance, NULL ); //Direct3DԴijʼʧmessageboxʾ if (!(S_OK==Direct3D_Init (hwnd,hInstance))) { MessageBox(hwnd, _T("Direct3Dʼʧ~"), _T("dzīϢ"), 0); //ʹMessageBoxһϢ } PlaySound(L"GameMedia\\ɽԭ.wav", NULL, SND_FILENAME | SND_ASYNC|SND_LOOP); //ѭű MoveWindow(hwnd,200,10,WINDOW_WIDTH,WINDOW_HEIGHT,true); //ʾʱλãϽλĻ꣨2000 ShowWindow( hwnd, nShowCmd ); //Win32ShowWindowʾ UpdateWindow(hwnd); //Դڽи£·Ҫװһ //DirectInputijʼ g_pDInput = new DInputClass(); g_pDInput->Init(hwnd,hInstance,DISCL_FOREGROUND | DISCL_NONEXCLUSIVE,DISCL_FOREGROUND | DISCL_NONEXCLUSIVE); //Ϣѭ 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); //ȾлȾ } } UnregisterClass(_T("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_CleanUpCOMӿڶ PostQuitMessage( 0 ); //ϵͳиֹ߳ӦWM_DESTROYϢ break; //switch default: //caseϣִиdefault return DefWindowProc( hwnd, message, wParam, lParam ); //ȱʡĴڹΪӦóûдĴϢṩȱʡĴ } return 0; //˳ } //-----------------------------------Direct3D_Init( )---------------------------------- // Direct3DʼDirect3Dijʼ //------------------------------------------------------------------------------------------------ HRESULT Direct3D_Init(HWND hwnd,HINSTANCE hInstance) { //-------------------------------------------------------------------------------------- // Direct3DʼIJ֮һӿڡDirect3Dӿڶ, ԱøDirect3D󴴽Direct3D豸 //-------------------------------------------------------------------------------------- LPDIRECT3D9 pD3D = NULL; //Direct3DӿڶĴ if( NULL == ( pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) ) //ʼDirect3Dӿڶ󣬲DirectX汾Э return E_FAIL; //-------------------------------------------------------------------------------------- // Direct3DʼIJ֮,ȡϢȡӲ豸Ϣ //-------------------------------------------------------------------------------------- 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ʼIJ֮ݡ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; d3dpp.EnableAutoDepthStencil = true; d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8; d3dpp.Flags = 0; d3dpp.FullScreen_RefreshRateInHz = 0; d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; //-------------------------------------------------------------------------------------- // Direct3DʼIJ֮ģ豸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( )-------------------------------------- // ȾԴʼڴ˺нҪȾԴijʼ //-------------------------------------------------------------------------------------------------- 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ļм LPD3DXBUFFER pAdjBuffer = NULL; LPD3DXBUFFER pMtrlBuffer = NULL; D3DXLoadMeshFromX(L"95.X", D3DXMESH_MANAGED, g_pd3dDevice, &pAdjBuffer, &pMtrlBuffer, NULL, &g_dwNumMtrls, &g_pMesh); // ȡʺ D3DXMATERIAL *pMtrls = (D3DXMATERIAL*)pMtrlBuffer->GetBufferPointer(); //һD3DXMATERIALṹڶȡʺϢ g_pMaterials = new D3DMATERIAL9[g_dwNumMtrls]; g_pTextures = new LPDIRECT3DTEXTURE9[g_dwNumMtrls]; for (DWORD i=0; iSetLight(0, &light); g_pd3dDevice->LightEnable(0, true); g_pd3dDevice->SetRenderState(D3DRS_NORMALIZENORMALS, true); g_pd3dDevice->SetRenderState(D3DRS_SPECULARENABLE, true); // ʼ g_pCamera = new CameraClass(g_pd3dDevice); g_pCamera->SetCameraPosition(&D3DXVECTOR3(0.0f, 1000.0f, -1200.0f)); //ڵλ g_pCamera->SetTargetPosition(&D3DXVECTOR3(0.0f, 1200.0f, 0.0f)); //Ŀ۲ڵλ g_pCamera->SetViewMatrix(); //ȡ任 g_pCamera->SetProjMatrix(); //ͶӰ任 // ʼ g_pTerrain = new TerrainClass(g_pd3dDevice); g_pTerrain->LoadTerrainFromFile(L"GameMedia\\heighmap.raw", L"GameMedia\\terrainstone.jpg"); //ļظ߶ͼ g_pTerrain->InitTerrain(200, 200, 30.0f, 6.0f); //ĸֱֵǶ࣬ϵ //ʼն g_pSkyBox = new SkyBoxClass( g_pd3dDevice ); g_pSkyBox->LoadSkyTextureFromFile(L"GameMedia\\frontsnow1.jpg",L"GameMedia\\backsnow1.jpg",L"GameMedia\\leftsnow1.jpg",L"GameMedia\\rightsnow1.jpg", L"GameMedia\\topsnow1.jpg");//ļǰҡ5ͼ g_pSkyBox->InitSkyBox(20000); //պеı߳ return S_OK; } //-----------------------------------Direct3D_Update( )-------------------------------- // ǼʱȾ뵫Ҫʱõģ簴ĸģ //-------------------------------------------------------------------------------------------------- void Direct3D_Update( HWND hwnd) { //ʹDirectInputȡ g_pDInput->GetInput(); // ƶӽ if (g_pDInput->IsKeyDown(DIK_A)) g_pCamera->MoveAlongRightVec(-0.9f); if (g_pDInput->IsKeyDown(DIK_D)) g_pCamera->MoveAlongRightVec( 0.9f); if (g_pDInput->IsKeyDown(DIK_W)) g_pCamera->MoveAlongLookVec( 0.9f); if (g_pDInput->IsKeyDown(DIK_S)) g_pCamera->MoveAlongLookVec(-0.9f); if (g_pDInput->IsKeyDown(DIK_R)) g_pCamera->MoveAlongUpVec( 0.9f); if (g_pDInput->IsKeyDown(DIK_F)) g_pCamera->MoveAlongUpVec(-0.9f); //תӽ if (g_pDInput->IsKeyDown(DIK_LEFT)) g_pCamera->RotationUpVec(-0.003f); if (g_pDInput->IsKeyDown(DIK_RIGHT)) g_pCamera->RotationUpVec( 0.003f); if (g_pDInput->IsKeyDown(DIK_UP)) g_pCamera->RotationRightVec(-0.003f); if (g_pDInput->IsKeyDown(DIK_DOWN)) g_pCamera->RotationRightVec( 0.003f); if (g_pDInput->IsKeyDown(DIK_Q)) g_pCamera->RotationLookVec(0.001f); if (g_pDInput->IsKeyDown(DIK_E)) g_pCamera->RotationLookVec( -0.001f); //ת g_pCamera->RotationUpVec(g_pDInput->MouseDX()* 0.001f); g_pCamera->RotationRightVec(g_pDInput->MouseDY() * 0.001f); //ֿƹ۲ static FLOAT fPosZ=0.0f; fPosZ += g_pDInput->MouseDZ()*0.03f; //㲢ȡ任 D3DXMATRIX matView; g_pCamera->CalculateViewMatrix(&matView); g_pd3dDevice->SetTransform(D3DTS_VIEW, &matView); //ȷ任浽g_matWorld D3DXMatrixTranslation(&g_matWorld, 0.0f, 0.0f, fPosZ); //δƶ POINT lt,rb; RECT rect; GetClientRect(hwnd,&rect); //ȡôڲ //ϵlt lt.x = rect.left; lt.y = rect.top; //rb rb.x = rect.right; rb.y = rect.bottom; //ltrbĴתΪĻ ClientToScreen(hwnd,<); ClientToScreen(hwnd,&rb); //Ļ趨 rect.left = lt.x; rect.top = lt.y; rect.right = rb.x; rect.bottom = rb.y; //ƶ ClipCursor(&rect); ShowCursor(false); // } //-----------------------------------Direct3D_Render( )------------------------------- // ʹDirect3DȾ //-------------------------------------------------------------------------------------------------- void Direct3D_Render(HWND hwnd) { //-------------------------------------------------------------------------------------- // Direct3DȾ岽֮һ //-------------------------------------------------------------------------------------- g_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER|D3DCLEAR_STENCIL, D3DCOLOR_XRGB(100, 255, 255), 1.0f, 0); //-------------------------------------------------------------------------------------- // Direct3DȾ岽֮ʼ //-------------------------------------------------------------------------------------- g_pd3dDevice->BeginScene(); // ʼ //-------------------------------------------------------------------------------------- // Direct3DȾ岽֮ʽ //-------------------------------------------------------------------------------------- // D3DXMATRIX TransMatrix, RotMatrix, FinalMatrix; D3DXMatrixRotationX(&RotMatrix, -D3DX_PI * 0.5f); g_pd3dDevice->SetMaterial(&g_MaterialCylinder); for(int i = 0; i < 4; i++) { D3DXMatrixTranslation(&TransMatrix, -300.0f, 0.0f, -350.0f + (i * 500.0f)); FinalMatrix = RotMatrix * TransMatrix ; g_pd3dDevice->SetTransform(D3DTS_WORLD, &FinalMatrix); g_cylinder->DrawSubset(0); D3DXMatrixTranslation(&TransMatrix, 300.0f, 0.0f, -350.0f + (i * 500.0f)); FinalMatrix = RotMatrix * TransMatrix ; g_pd3dDevice->SetTransform(D3DTS_WORLD, &FinalMatrix); g_cylinder->DrawSubset(0); } // D3DXMATRIX mScal,mRot2,mTrans,mFinal; //һЩ׼ԴƷо任 D3DXMatrixTranslation(&mTrans,0.0f,600.0f,200.0f); D3DXMatrixScaling(&mScal,3.0f,3.0f,3.0f); mFinal=mScal*mTrans*g_matWorld; g_pd3dDevice->SetTransform(D3DTS_WORLD, &mFinal);//ģ͵Ϊ׼ // һforѭģ͵ֵĻ for (DWORD i = 0; i < g_dwNumMtrls; i++) { g_pd3dDevice->SetMaterial(&g_pMaterials[i]); //ô˲ֵIJ g_pd3dDevice->SetTexture(0, g_pTextures[i]);//ô˲ֵ g_pMesh->DrawSubset(i); //ƴ˲ } //Ƶ g_pTerrain->RenderTerrain(&g_matWorld, false); //ȾΣҵڶΪfalseʾȾε߿ // D3DXMATRIX matSky,matTransSky,matRotSky; D3DXMatrixTranslation(&matTransSky,0.0f,-3500.0f,0.0f); D3DXMatrixRotationY(&matRotSky, -0.000005f*timeGetTime()); //ת, ģƲ˶Ч matSky=matTransSky*matRotSky; g_pSkyBox->RenderSkyBox(&matSky, false); //Ϣ HelpText_Render(hwnd); //-------------------------------------------------------------------------------------- // Direct3DȾ岽֮ġ //-------------------------------------------------------------------------------------- g_pd3dDevice->EndScene(); // //-------------------------------------------------------------------------------------- // Direct3DȾ岽֮塿ʾת //-------------------------------------------------------------------------------------- g_pd3dDevice->Present(NULL, NULL, NULL, NULL); // תʾ } //-----------------------------------HelpText_Render( )------------------------------- // װ˰Ϣĺ //-------------------------------------------------------------------------------------------------- void HelpText_Render(HWND hwnd) { //һΣڻȡھ RECT formatRect; GetClientRect(hwnd, &formatRect); //ڴϽǴʾÿ֡ formatRect.top = 5; 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.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" Wǰ S ", -1, &formatRect, DT_SINGLELINE | DT_NOCLIP | DT_LEFT, D3DCOLOR_RGBA(255,200,0,255)); formatRect.top += 25; g_pTextHelper->DrawText(NULL, L" A Dҷ", -1, &formatRect, DT_SINGLELINE | DT_NOCLIP | DT_LEFT, D3DCOLOR_RGBA(255,200,0,255)); formatRect.top += 25; g_pTextHelper->DrawText(NULL, L" RֱϷ Fֱ·", -1, &formatRect, DT_SINGLELINE | DT_NOCLIP | DT_LEFT, D3DCOLOR_RGBA(255,200,0,255)); formatRect.top += 25; g_pTextHelper->DrawText(NULL, L" Qб Eб", -1, &formatRect, DT_SINGLELINE | DT_NOCLIP | DT_LEFT, D3DCOLOR_RGBA(255,200,0,255)); formatRect.top += 25; g_pTextHelper->DrawText(NULL, L" ϡ¡ҷƶӽDZ仯 ", -1, &formatRect, DT_SINGLELINE | DT_NOCLIP | DT_LEFT, D3DCOLOR_RGBA(255,200,0,255)); formatRect.top += 25; g_pTextHelper->DrawText(NULL, L" ֣ģY᷽ƶ", -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)); } //-----------------------------------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ӿڶ for (DWORD i = 0; iCreateDevice( GUID_SysKeyboard, &m_KeyboardDevice, NULL )); HR( m_KeyboardDevice->SetCooperativeLevel( hWnd, keyboardCoopFlags)); HR( m_KeyboardDevice->SetDataFormat( &c_dfDIKeyboard )); HR( m_KeyboardDevice->Acquire( )); HR( m_KeyboardDevice->Poll( )); //豸ijʼ 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; } //----------------------------------------------------------------------------- // NameDInputClass::GetInput() // Desc: ڻȡϢĺ //----------------------------------------------------------------------------- void DInputClass::GetInput() { 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); } } //----------------------------------------------------------------------------- // NameDInputClass::IsKeyDown() // Desc: жϼijǷ //----------------------------------------------------------------------------- bool DInputClass::IsKeyDown(int iKey) { if(m_keyBuffer[iKey] & 0x80) return true; else return false; } //----------------------------------------------------------------------------- // NameDInputClass::IsMouseButtonDown() // Desc: жijǷ //----------------------------------------------------------------------------- bool DInputClass::IsMouseButtonDown(int button) { return (m_MouseState.rgbButtons[button] & 0x80) != 0; } //----------------------------------------------------------------------------- // NameDInputClass::MouseDX // Desc: ָXֵ //----------------------------------------------------------------------------- float DInputClass::MouseDX() { return (float)m_MouseState.lX; } //----------------------------------------------------------------------------- // NameDInputClass::MouseDY // Desc: ָYֵ //----------------------------------------------------------------------------- float DInputClass::MouseDY() { return (float)m_MouseState.lY; } //----------------------------------------------------------------------------- // NameDInputClass::MouseDZ // Desc: ָZֵ֣ //----------------------------------------------------------------------------- float DInputClass::MouseDZ() { return (float)m_MouseState.lZ; } //----------------------------------------------------------------------------- // Desc: //----------------------------------------------------------------------------- DInputClass::~DInputClass(void) { 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); } ================================================ FILE: Direct3D-Game-Demo/D3Ddemo18/DirectInputClass.h ================================================ //============================================================================= // Name: DirectInputClass.h // Des: װDirectInput봦ͷļ // 2013 203 Create by dzī //============================================================================= #pragma once #include "D3DUtil.h" #define DIRECTINPUT_VERSION 0x0800 #include //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); //жϼijǷ bool IsMouseButtonDown(int button); //ж갴Ƿ񱻰 float MouseDX(); //Xֵ float MouseDY(); //Yֵ float MouseDZ(); //Zֵ public: DInputClass(void); //캯 ~DInputClass(void); // }; ================================================ FILE: Direct3D-Game-Demo/D3Ddemo18/SkyBoxClass.cpp ================================================ //============================================================================= // Name: SkyBoxClass.cpp // Des: һװάպϵͳԴļ // 2013 324 Create by dzī //============================================================================= #include "d3dx9.h" #include "SkyBoxClass.h" #include "D3DUtil.h" //------------------------------------------------------------------------------------------------- // Desc: 캯 //------------------------------------------------------------------------------------------------- SkyBoxClass::SkyBoxClass( LPDIRECT3DDEVICE9 pDevice ) { //ֵ m_pVertexBuffer=NULL; m_pd3dDevice=pDevice; for(int i=0; i<5; i++) m_pTexture[i] = NULL; m_Length = 0.0f; } //------------------------------------------------------------------------------------------------- // Name: SkyBoxClass::InitSkyBox( ) // Desc: պгʼ㻺ĸֵ //------------------------------------------------------------------------------------------------- BOOL SkyBoxClass::InitSkyBox( float Length ) { m_Length=Length; //1.㻺 m_pd3dDevice->CreateVertexBuffer( 20 * sizeof(SKYBOXVERTEX), 0, D3DFVF_SKYBOX, D3DPOOL_MANAGED, &m_pVertexBuffer, 0 ); //һṹѶ׼ SKYBOXVERTEX vertices[] = { //ǰĸ { -m_Length/2, 0.0f, m_Length/2, 0.0f, 1.0f, }, { -m_Length/2, m_Length/2, m_Length/2, 0.0f, 0.0f, }, { m_Length/2, 0.0f, m_Length/2, 1.0f, 1.0f, }, { m_Length/2, m_Length/2, m_Length/2, 1.0f, 0.0f, }, //ĸ { m_Length/2, 0.0f, -m_Length/2, 0.0f, 1.0f, }, { m_Length/2, m_Length/2, -m_Length/2, 0.0f, 0.0f, }, { -m_Length/2, 0.0f, -m_Length/2, 1.0f, 1.0f, }, { -m_Length/2, m_Length/2, -m_Length/2, 1.0f, 0.0f, }, //ĸ { -m_Length/2, 0.0f, -m_Length/2, 0.0f, 1.0f, }, { -m_Length/2, m_Length/2, -m_Length/2, 0.0f, 0.0f, }, { -m_Length/2, 0.0f, m_Length/2, 1.0f, 1.0f, }, { -m_Length/2, m_Length/2, m_Length/2, 1.0f, 0.0f, }, //ĸ { m_Length/2, 0.0f, m_Length/2, 0.0f, 1.0f, }, { m_Length/2, m_Length/2, m_Length/2, 0.0f, 0.0f, }, { m_Length/2, 0.0f, -m_Length/2, 1.0f, 1.0f, }, { m_Length/2, m_Length/2, -m_Length/2, 1.0f, 0.0f, }, //ĸ { m_Length/2, m_Length/2, -m_Length/2, 1.0f, 0.0f, }, { m_Length/2, m_Length/2, m_Length/2, 1.0f, 1.0f, }, { -m_Length/2, m_Length/2, -m_Length/2, 0.0f, 0.0f, }, { -m_Length/2, m_Length/2, m_Length/2, 0.0f, 1.0f, }, }; //׼䶥 void* pVertices; //2. m_pVertexBuffer->Lock( 0, 0, (void**)&pVertices, 0 ); //3.ʡѽṹеֱӿ㻺 memcpy( pVertices, vertices, sizeof(vertices) ); //4. m_pVertexBuffer->Unlock(); return TRUE; } //------------------------------------------------------------------------------------------------- // Name: SkyBoxClass::LoadSkyTextureFromFile( ) // Desc: պغ //------------------------------------------------------------------------------------------------- BOOL SkyBoxClass::LoadSkyTextureFromFile(wchar_t *pFrontTextureFile, wchar_t *pBackTextureFile,wchar_t *pLeftTextureFile, wchar_t *pRightTextureFile,wchar_t *pTopTextureFile) { //ļ D3DXCreateTextureFromFile( m_pd3dDevice , pFrontTextureFile, &m_pTexture[0] ); //ǰ D3DXCreateTextureFromFile( m_pd3dDevice , pBackTextureFile, &m_pTexture[1] ); // D3DXCreateTextureFromFile( m_pd3dDevice , pLeftTextureFile, &m_pTexture[2] ); // D3DXCreateTextureFromFile( m_pd3dDevice , pRightTextureFile, &m_pTexture[3] ); // D3DXCreateTextureFromFile( m_pd3dDevice , pTopTextureFile, &m_pTexture[4] ); // return TRUE; } //-------------------------------------------------------------------------------------- // Name: SkyBoxClass::RenderSkyBox() // Desc: ƳպУͨڶѡǷƳ߿ //-------------------------------------------------------------------------------------- void SkyBoxClass::RenderSkyBox( D3DXMATRIX *pMatWorld, BOOL bRenderFrame ) { m_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1); //ɫϵĵһɫֵ m_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE ); //ɫϵĵһֵȡɫֵ m_pd3dDevice->SetTransform( D3DTS_WORLD, pMatWorld ); // m_pd3dDevice->SetStreamSource(0,m_pVertexBuffer, 0, sizeof(SKYBOXVERTEX)); //ѰļϢĶ㻺Ⱦˮ m_pd3dDevice->SetFVF(D3DFVF_SKYBOX); //FVFʽ //һforѭ5Ƴ for(int i =0; i<5; i++) { m_pd3dDevice->SetTexture(0, m_pTexture[i]); m_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, i*4, 2); } //ǷȾ߿Ĵ if (bRenderFrame) //ҪȾ߿Ļ { m_pd3dDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME); //ģʽΪ߿ //һforѭ5߿Ƴ for(int i =0; i<5; i++) { m_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, i*4, 2); //ƶ } m_pd3dDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID); //ģʽʵ } } //------------------------------------------------------------------------------------------------- // Desc: //------------------------------------------------------------------------------------------------- SkyBoxClass::~SkyBoxClass(void) { SAFE_RELEASE( m_pVertexBuffer ); for(int i=0; i<5; i++) { SAFE_RELEASE( m_pTexture[i] ); } } ================================================ FILE: Direct3D-Game-Demo/D3Ddemo18/SkyBoxClass.h ================================================ //============================================================================= // Name: SkyBoxClass.h // Des: һװάպϵͳͷļ // 2013 324 Create by dzī //============================================================================= #pragma once #include "D3DUtil.h" //ΪպඨһFVFʽ struct SKYBOXVERTEX { float x,y,z; float u,v; }; #define D3DFVF_SKYBOX D3DFVF_XYZ|D3DFVF_TEX1 class SkyBoxClass { private: LPDIRECT3DDEVICE9 m_pd3dDevice; //D3D豸 LPDIRECT3DVERTEXBUFFER9 m_pVertexBuffer; //㻺 LPDIRECT3DTEXTURE9 m_pTexture[5]; //5ӿڶ float m_Length; //պб߳ public: SkyBoxClass( LPDIRECT3DDEVICE9 pDevice ); //캯 virtual ~SkyBoxClass(void); // public: BOOL InitSkyBox( float Length ); //ʼպк BOOL LoadSkyTextureFromFile(wchar_t *pFrontTextureFile, wchar_t *pBackTextureFile,wchar_t *pLeftTextureFile, wchar_t *pRightTextureFile,wchar_t *pTopTextureFile); //ļպϵ VOID RenderSkyBox( D3DXMATRIX *pMatWorld, BOOL bRenderFrame ); //Ⱦպ,ݵһ趨պ󣬵ڶѡǷȾ߿ }; ================================================ FILE: Direct3D-Game-Demo/D3Ddemo18/TerrainClass.cpp ================================================ //============================================================================= // Name: TerrainClass.cpp // Des: һװάϵͳԴļ // 2013 317 Create by dzī //============================================================================= #include "TerrainClass.h" //----------------------------------------------------------------------------- // Desc: 캯 //----------------------------------------------------------------------------- TerrainClass::TerrainClass(IDirect3DDevice9* pd3dDevice) { //Աֵ m_pd3dDevice = pd3dDevice; m_pTexture = NULL; m_pIndexBuffer = NULL; m_pVertexBuffer = NULL; m_nCellsPerRow = 0; m_nCellsPerCol = 0; m_nVertsPerRow = 0; m_nVertsPerCol = 0; m_nNumVertices = 0; m_fTerrainWidth = 0.0f; m_fTerrainDepth = 0.0f; m_fCellSpacing = 0.0f; m_fHeightScale = 0.0f; } //-------------------------------------------------------------------------------------- // Name: TerrainClass::LoadTerrainFromFile() // Desc: صθ߶ϢԼ //-------------------------------------------------------------------------------------- BOOL TerrainClass::LoadTerrainFromFile(wchar_t *pRawFileName, wchar_t *pTextureFile) { // ļжȡ߶Ϣ std::ifstream inFile; inFile.open(pRawFileName, std::ios::binary); //öƵķʽļ inFile.seekg(0,std::ios::end); //ļָƶļĩβ std::vector inData(inFile.tellg()); //ģ嶨һvector͵ıinDataʼֵΪǰλãС inFile.seekg(std::ios::beg); //ļָƶļĿͷ׼ȡ߶Ϣ inFile.read((char*)&inData[0], inData.size()); //ؼһȡ߶Ϣ inFile.close(); //Թرļ m_vHeightInfo.resize(inData.size()); //m_vHeightInfoߴȡΪijߴ //inDataеֵm_vHeightInfo for (unsigned int i=0; iCreateVertexBuffer(m_nNumVertices * sizeof(TERRAINVERTEX), D3DUSAGE_WRITEONLY, TERRAINVERTEX::FVF, D3DPOOL_MANAGED, &m_pVertexBuffer, 0))) return FALSE; //2 TERRAINVERTEX *pVertices = NULL; m_pVertexBuffer->Lock(0, 0, (void**)&pVertices, 0); //3ʣֵ FLOAT fStartX = -m_fTerrainWidth / 2.0f, fEndX = m_fTerrainWidth / 2.0f; //ָʼͽXֵ FLOAT fStartZ = m_fTerrainDepth / 2.0f, fEndZ = -m_fTerrainDepth / 2.0f; //ָʼͽZֵ FLOAT fCoordU = 10.0f / (FLOAT)m_nCellsPerRow; //ָĺֵ FLOAT fCoordV = 10.0f / (FLOAT)m_nCellsPerCol; //ֵָ int nIndex = 0, i = 0, j = 0; for (float z = fStartZ; z >=fEndZ; z -= m_fCellSpacing, i++) //Z귽ʼ㵽мı { j = 0; for (float x = fStartX; x <=fEndX; x += m_fCellSpacing, j++) //X귽ʼ㵽мı { nIndex = i * m_nCellsPerRow + j; //ָǰڶ㻺еλ pVertices[nIndex] = TERRAINVERTEX(x, m_vHeightInfo[nIndex], z, j*fCoordU, i*fCoordV); //Ѷλڸ߶ͼжӦĸԼ긳ֵǰĶ nIndex++; //Լ1 } } //4 m_pVertexBuffer->Unlock(); //--------------------------------------------------------------- // ε //--------------------------------------------------------------- //1. if (FAILED(m_pd3dDevice->CreateIndexBuffer(m_nNumVertices * 6 *sizeof(WORD), D3DUSAGE_WRITEONLY, D3DFMT_INDEX16, D3DPOOL_MANAGED, &m_pIndexBuffer, 0))) return FALSE; //2. WORD* pIndices = NULL; m_pIndexBuffer->Lock(0, 0, (void**)&pIndices, 0); //3.ʣֵ nIndex = 0; for(int row = 0; row < m_nCellsPerRow-1; row++) //ÿ { for(int col = 0; col < m_nCellsPerCol-1; col++) //ÿ { //ABC pIndices[nIndex] = row * m_nCellsPerRow + col; //A pIndices[nIndex+1] = row * m_nCellsPerRow + col + 1; //B pIndices[nIndex+2] = (row+1) * m_nCellsPerRow + col; //C //CBD pIndices[nIndex+3] = (row+1) * m_nCellsPerRow + col; //C pIndices[nIndex+4] = row * m_nCellsPerRow + col + 1; //B pIndices[nIndex+5] = (row+1) * m_nCellsPerRow + col + 1;//D //һԪ6 nIndex += 6; //Լ6 } } //4 m_pIndexBuffer->Unlock(); return TRUE; } //-------------------------------------------------------------------------------------- // Name: TerrainClass::RenderTerrain() // Desc: ƳΣͨڶѡǷƳ߿ //-------------------------------------------------------------------------------------- BOOL TerrainClass::RenderTerrain(D3DXMATRIX *pMatWorld, BOOL bRenderFrame) { m_pd3dDevice->SetStreamSource(0, m_pVertexBuffer, 0, sizeof(TERRAINVERTEX)); m_pd3dDevice->SetFVF(TERRAINVERTEX::FVF);//ָʹõʽĺ m_pd3dDevice->SetIndices(m_pIndexBuffer);// m_pd3dDevice->SetTexture(0, m_pTexture);// m_pd3dDevice->SetRenderState(D3DRS_LIGHTING, FALSE); //رչ m_pd3dDevice->SetTransform(D3DTS_WORLD, pMatWorld); // m_pd3dDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, m_nNumVertices, 0, m_nNumVertices * 2); //ƶ m_pd3dDevice->SetRenderState(D3DRS_LIGHTING, TRUE); //򿪹 m_pd3dDevice->SetTexture(0, 0); //ÿ //ǷȾ߿Ĵ if (bRenderFrame) //ҪȾ߿Ļ { m_pd3dDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME); //ģʽΪ߿ m_pd3dDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, m_nNumVertices, 0, m_nNumVertices * 2); //ƶ m_pd3dDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID); //ģʽʵ } return TRUE; } //----------------------------------------------------------------------------- // Desc: //----------------------------------------------------------------------------- TerrainClass::~TerrainClass(void) { SAFE_RELEASE(m_pTexture); SAFE_RELEASE(m_pIndexBuffer); SAFE_RELEASE(m_pVertexBuffer); } ================================================ FILE: Direct3D-Game-Demo/D3Ddemo18/TerrainClass.h ================================================ //============================================================================= // Name: TerrainClass.h // Des: һװάϵͳͷļ // 2013 317 Create by dzī //============================================================================= #pragma once #include #include #include #include #include "D3DUtil.h" class TerrainClass { private: LPDIRECT3DDEVICE9 m_pd3dDevice; //D3D豸 LPDIRECT3DTEXTURE9 m_pTexture; // LPDIRECT3DINDEXBUFFER9 m_pIndexBuffer; //㻺 LPDIRECT3DVERTEXBUFFER9 m_pVertexBuffer; // int m_nCellsPerRow; // ÿеĵԪ int m_nCellsPerCol; // ÿеĵԪ int m_nVertsPerRow; // ÿеĶ int m_nVertsPerCol; // ÿеĶ int m_nNumVertices; // FLOAT m_fTerrainWidth; // εĿ FLOAT m_fTerrainDepth; // ε FLOAT m_fCellSpacing; // Ԫļ FLOAT m_fHeightScale; // ߶ϵ std::vector m_vHeightInfo; // ڴŸ߶Ϣ //һεFVFʽ struct TERRAINVERTEX { FLOAT _x, _y, _z; FLOAT _u, _v; TERRAINVERTEX(FLOAT x, FLOAT y, FLOAT z, FLOAT u, FLOAT v) :_x(x), _y(y), _z(z), _u(u), _v(v) {} static const DWORD FVF = D3DFVF_XYZ | D3DFVF_TEX1; }; public: TerrainClass(IDirect3DDevice9 *pd3dDevice); //캯 virtual ~TerrainClass(void); // public: BOOL LoadTerrainFromFile(wchar_t *pRawFileName, wchar_t *pTextureFile); //ļظ߶ͼĺ BOOL InitTerrain(INT nRows, INT nCols, FLOAT fSpace, FLOAT fScale); //γʼ BOOL RenderTerrain(D3DXMATRIX *pMatWorld, BOOL bDrawFrame=FALSE); //Ⱦ }; ================================================ FILE: Direct3D-Game-Demo/D3Ddemo19/CameraClass.cpp ================================================ //============================================================================= // Name: CameraClass.cpp // Des: һװʵԴļ // 2013 310 Create by dzī //============================================================================= #include "CameraClass.h" #ifndef WINDOW_WIDTH #define WINDOW_WIDTH 800 //Ϊڿȶĺ꣬Էڴ˴޸Ĵڿ #define WINDOW_HEIGHT 600 //Ϊڸ߶ȶĺ꣬Էڴ˴޸Ĵڸ߶ #endif //----------------------------------------------------------------------------- // Desc: 캯 //----------------------------------------------------------------------------- CameraClass::CameraClass(IDirect3DDevice9 *pd3dDevice) { m_pd3dDevice = pd3dDevice; m_vRightVector = D3DXVECTOR3(1.0f, 0.0f, 0.0f); // ĬXغ m_vUpVector = D3DXVECTOR3(0.0f, 1.0f, 0.0f); // ĬYغ m_vLookVector = D3DXVECTOR3(0.0f, 0.0f, 1.0f); // ĬϹ۲Zغ m_vCameraPosition = D3DXVECTOR3(0.0f, 0.0f, -250.0f); // ĬΪ(0.0f, 0.0f, -250.0f) m_vTargetPosition = D3DXVECTOR3(0.0f, 0.0f, 0.0f);//ĬϹ۲ĿλΪ(0.0f, 0.0f, 0.0f); } //----------------------------------------------------------------------------- // NameCameraClass::CalculateViewMatrix( ) // Desc: ݸľȡ任 //----------------------------------------------------------------------------- VOID CameraClass::CalculateViewMatrix(D3DXMATRIX *pMatrix) { //1.Ȱ3淶ʹ໥ֱΪһ D3DXVec3Normalize(&m_vLookVector, &m_vLookVector); //淶۲ D3DXVec3Cross(&m_vUpVector, &m_vLookVector, &m_vRightVector); // ۲ֱ D3DXVec3Normalize(&m_vUpVector, &m_vUpVector); // 淶 D3DXVec3Cross(&m_vRightVector, &m_vUpVector, &m_vLookVector); // ֱ D3DXVec3Normalize(&m_vRightVector, &m_vRightVector); // 淶 // 2.ȡ任 //дȡ任ĵһ pMatrix->_11 = m_vRightVector.x; // Rx pMatrix->_12 = m_vUpVector.x; // Ux pMatrix->_13 = m_vLookVector.x; // Lx pMatrix->_14 = 0.0f; //дȡ任ĵڶ pMatrix->_21 = m_vRightVector.y; // Ry pMatrix->_22 = m_vUpVector.y; // Uy pMatrix->_23 = m_vLookVector.y; // Ly pMatrix->_24 = 0.0f; //дȡ任ĵ pMatrix->_31 = m_vRightVector.z; // Rz pMatrix->_32 = m_vUpVector.z; // Uz pMatrix->_33 = m_vLookVector.z; // Lz pMatrix->_34 = 0.0f; //дȡ任ĵ pMatrix->_41 = -D3DXVec3Dot(&m_vRightVector, &m_vCameraPosition); // -P*R pMatrix->_42 = -D3DXVec3Dot(&m_vUpVector, &m_vCameraPosition); // -P*U pMatrix->_43 = -D3DXVec3Dot(&m_vLookVector, &m_vCameraPosition); // -P*L pMatrix->_44 = 1.0f; } //----------------------------------------------------------------------------- // NameCameraClass::SetTargetPosition( ) // Desc: Ĺ۲λ //----------------------------------------------------------------------------- VOID CameraClass::SetTargetPosition(D3DXVECTOR3 *pLookat) { //ȿpLookatǷΪĬֵNULL if (pLookat != NULL) m_vTargetPosition = (*pLookat); else m_vTargetPosition = D3DXVECTOR3(0.0f, 0.0f, 1.0f); m_vLookVector = m_vTargetPosition - m_vCameraPosition;//۲λüλãõ۲췽 D3DXVec3Normalize(&m_vLookVector, &m_vLookVector);//淶m_vLookVector //淶m_vUpVectorm_vRightVector D3DXVec3Cross(&m_vUpVector, &m_vLookVector, &m_vRightVector); D3DXVec3Normalize(&m_vUpVector, &m_vUpVector); D3DXVec3Cross(&m_vRightVector, &m_vUpVector, &m_vLookVector); D3DXVec3Normalize(&m_vRightVector, &m_vRightVector); } //----------------------------------------------------------------------------- // NameCameraClass::SetCameraPosition( ) // Desc: ڵλ //----------------------------------------------------------------------------- VOID CameraClass::SetCameraPosition(D3DXVECTOR3 *pVector) { D3DXVECTOR3 V = D3DXVECTOR3(0.0f, 0.0f, -250.0f); m_vCameraPosition = pVector ? (*pVector) : V;//ĿpVectorΪĻ //*pVectorֵm_vCameraPosition=*pVector //򷵻Vֵm_vCameraPosition=V } //----------------------------------------------------------------------------- // NameCameraClass::SetViewMatrix( ) // Desc: ȡ任 //----------------------------------------------------------------------------- VOID CameraClass::SetViewMatrix(D3DXMATRIX *pMatrix) { //pMatrixֵһж if (pMatrix) m_matView = *pMatrix; else CalculateViewMatrix(&m_matView); m_pd3dDevice->SetTransform(D3DTS_VIEW, &m_matView); //ȡ任ֱֵҷϷ͹۲ m_vRightVector = D3DXVECTOR3(m_matView._11, m_matView._12, m_matView._13); m_vUpVector = D3DXVECTOR3(m_matView._21, m_matView._22, m_matView._23); m_vLookVector = D3DXVECTOR3(m_matView._31, m_matView._32, m_matView._33); } //----------------------------------------------------------------------------- // NameCameraClass::SetProjMatrix( ) // Desc: ͶӰ任 //----------------------------------------------------------------------------- VOID CameraClass::SetProjMatrix(D3DXMATRIX *pMatrix) { //жֵûУûеĻͼһ if (pMatrix != NULL) m_matProj = *pMatrix; else D3DXMatrixPerspectiveFovLH(&m_matProj, D3DX_PI / 4.0f, (float)((double)WINDOW_WIDTH/WINDOW_HEIGHT), 1.0f, 300000.0f);//ӽԶһ㣬Ͳ¿Զ m_pd3dDevice->SetTransform(D3DTS_PROJECTION, &m_matProj);//ͶӰ任 } //----------------------------------------------------------------------------- // NameCameraClass::MoveAlongRightVec( ) // Desc: ƽfUnitsλ //----------------------------------------------------------------------------- VOID CameraClass::MoveAlongRightVec(FLOAT fUnits) { //ֱӳfUnitsۼӾ m_vCameraPosition += m_vRightVector * fUnits; m_vTargetPosition += m_vRightVector * fUnits; } //----------------------------------------------------------------------------- // NameCameraClass::MoveAlongUpVec( ) // Desc: ƽfUnitsλ //----------------------------------------------------------------------------- VOID CameraClass::MoveAlongUpVec(FLOAT fUnits) { //ֱӳfUnitsۼӾ m_vCameraPosition += m_vUpVector * fUnits; m_vTargetPosition += m_vUpVector * fUnits; } //----------------------------------------------------------------------------- // NameCameraClass::MoveAlongLookVec( ) // Desc: ع۲ƽfUnitsλ //----------------------------------------------------------------------------- VOID CameraClass::MoveAlongLookVec(FLOAT fUnits) { //ֱӳfUnitsۼӾ m_vCameraPosition += m_vLookVector * fUnits; m_vTargetPosition += m_vLookVector * fUnits; } //----------------------------------------------------------------------------- // NameCameraClass::RotationRightVec( ) // Desc: תfAngleȵλĽǶ //----------------------------------------------------------------------------- VOID CameraClass::RotationRightVec(FLOAT fAngle) { D3DXMATRIX R; D3DXMatrixRotationAxis(&R, &m_vRightVector, fAngle);//m_vRightVectorתfAngleǶȵR D3DXVec3TransformCoord(&m_vUpVector, &m_vUpVector, &R);//m_vUpVectorm_vRightVectorתfAngleǶ D3DXVec3TransformCoord(&m_vLookVector, &m_vLookVector, &R);//m_vLookVectorm_vRightVectorתfAngleǶ m_vTargetPosition = m_vLookVector * D3DXVec3Length(&m_vCameraPosition);//һ¹۲λãģ= } //----------------------------------------------------------------------------- // NameCameraClass::RotationUpVec( ) // Desc: תfAngleȵλĽǶ //----------------------------------------------------------------------------- VOID CameraClass::RotationUpVec(FLOAT fAngle) { D3DXMATRIX R; D3DXMatrixRotationAxis(&R, &m_vUpVector, fAngle);//m_vUpVectorתfAngleǶȵR D3DXVec3TransformCoord(&m_vRightVector, &m_vRightVector, &R);//m_vRightVectorm_vUpVectorתfAngleǶ D3DXVec3TransformCoord(&m_vLookVector, &m_vLookVector, &R);//m_vLookVectorm_vUpVectorתfAngleǶ m_vTargetPosition = m_vLookVector * D3DXVec3Length(&m_vCameraPosition);//һ¹۲λãģ= } //----------------------------------------------------------------------------- // NameCameraClass::RotationLookVec( ) // Desc: ع۲תfAngleȵλĽǶ //----------------------------------------------------------------------------- VOID CameraClass::RotationLookVec(FLOAT fAngle) { D3DXMATRIX R; D3DXMatrixRotationAxis(&R, &m_vLookVector, fAngle);//m_vLookVectorתfAngleǶȵR D3DXVec3TransformCoord(&m_vRightVector, &m_vRightVector, &R);//m_vRightVectorm_vLookVectorתfAngleǶ D3DXVec3TransformCoord(&m_vUpVector, &m_vUpVector, &R);//m_vUpVectorm_vLookVectorתfAngleǶ m_vTargetPosition = m_vLookVector * D3DXVec3Length(&m_vCameraPosition);//һ¹۲λãģ= } //----------------------------------------------------------------------------- // Desc: //----------------------------------------------------------------------------- CameraClass::~CameraClass(void) { } ================================================ FILE: Direct3D-Game-Demo/D3Ddemo19/CameraClass.h ================================================ //============================================================================= // Name: CameraClass.h // Des: һװʵͷļ // 2013 310 Create by dzī //============================================================================= #pragma once #include #include class CameraClass { private: //Ա D3DXVECTOR3 m_vRightVector; // ҷ D3DXVECTOR3 m_vUpVector; // Ϸ D3DXVECTOR3 m_vLookVector; // ۲췽 D3DXVECTOR3 m_vCameraPosition; // λõ D3DXVECTOR3 m_vTargetPosition; //Ŀ۲λõ D3DXMATRIX m_matView; // ȡ任 D3DXMATRIX m_matProj; // ͶӰ任 LPDIRECT3DDEVICE9 m_pd3dDevice; //Direct3D豸 public: //һȡ任ĺ VOID CalculateViewMatrix(D3DXMATRIX *pMatrix); //ȡ任 //Getϵк VOID GetProjMatrix(D3DXMATRIX *pMatrix) { *pMatrix = m_matProj; } //صǰͶӰ VOID GetCameraPosition(D3DXVECTOR3 *pVector) { *pVector = m_vCameraPosition; } //صǰλþ VOID GetLookVector(D3DXVECTOR3 *pVector) { *pVector = m_vLookVector; } //صǰĹ۲ //ĸSetϵкעDzĬֵNULLģʱдҲ VOID SetTargetPosition(D3DXVECTOR3 *pLookat = NULL); //Ŀ۲λ VOID SetCameraPosition(D3DXVECTOR3 *pVector = NULL); //ڵλ VOID SetViewMatrix(D3DXMATRIX *pMatrix = NULL); //ȡ任 VOID SetProjMatrix(D3DXMATRIX *pMatrix = NULL); //ͶӰ任 public: // ظƽƵ VOID MoveAlongRightVec(FLOAT fUnits); // rightƶ VOID MoveAlongUpVec(FLOAT fUnits); // upƶ VOID MoveAlongLookVec(FLOAT fUnits); // lookƶ // Ƹת VOID RotationRightVec(FLOAT fAngle); // rightת VOID RotationUpVec(FLOAT fAngle); // upת VOID RotationLookVec(FLOAT fAngle); // lookת public: //캯 CameraClass(IDirect3DDevice9 *pd3dDevice); //캯 virtual ~CameraClass(void); // }; ================================================ FILE: Direct3D-Game-Demo/D3Ddemo19/D3DUtil.h ================================================ //***************************************************************************************** // Desc: D3DUtil.hͷļڹĶ // 2013 203 Create by dzī //***************************************************************************************** #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 ================================================ FILE: Direct3D-Game-Demo/D3Ddemo19/D3Ddemo19.cpp ================================================ //-----------------------------------˵---------------------------------------------- // :D3Ddemo19 // 20134 Create by dzī // ΨѩƮάϵͳʵ ʾ // زij ħ3 // ģزijӢ޵6 ư //------------------------------------------------------------------------------------------------ //-----------------------------------궨岿֡-------------------------------------------- // һЩ //------------------------------------------------------------------------------------------------ #define WINDOW_WIDTH 932 //Ϊڿȶĺ꣬Էڴ˴޸Ĵڿ #define WINDOW_HEIGHT 700 //Ϊڸ߶ȶĺ꣬Էڴ˴޸Ĵڸ߶ #define WINDOW_TITLE _T("ϨϷ롿 ѩʵΨϵͳ") //Ϊڱⶨĺ //-----------------------------------ͷļ֡--------------------------------------- // ͷļ //------------------------------------------------------------------------------------------------ #include #include #include #include #include "DirectInputClass.h" #include "CameraClass.h" #include "TerrainClass.h" #include "SkyBoxClass.h" #include "SnowParticleClass.h" //-----------------------------------ļ֡--------------------------------------- // Ŀļ //------------------------------------------------------------------------------------------------ #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; // LPD3DXMESH g_pMesh = NULL; // D3DMATERIAL9* g_pMaterials= NULL; // IJϢ LPDIRECT3DTEXTURE9* g_pTextures = NULL; // Ϣ DWORD g_dwNumMtrls = 0; // ʵĿ LPD3DXMESH g_cylinder = NULL; // D3DMATERIAL9 g_MaterialCylinder; //ӵIJ D3DLIGHT9 g_Light; //ȫֹ DInputClass* g_pDInput = NULL; //DInputClassָʵ CameraClass* g_pCamera = NULL; //ָʵ TerrainClass* g_pTerrain = NULL; //ָʵ SkyBoxClass* g_pSkyBox=NULL; //պָʵ SnowParticleClass* g_pSnowParticles = NULL; //ѩϵͳָʵ //-----------------------------------ȫֺ֡------------------------------------- // ȫֺֹδıʶϵд //------------------------------------------------------------------------------------------------ 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,FLOAT fTimeDelta); void Direct3D_Update( HWND hwnd,FLOAT fTimeDelta); void Direct3D_CleanUp( ); float Get_FPS(); void HelpText_Render(HWND hwnd); //-----------------------------------WinMain( )-------------------------------------- // WindowsӦóںǵij↑ʼ //------------------------------------------------------------------------------------------------ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nShowCmd) { //ʼһĴ WNDCLASSEX wndClass={0} ; //WINDCLASSEXһ࣬wndClassʵWINDCLASSEX֮󴰿ڵĸʼ wndClass.cbSize = sizeof( WNDCLASSEX ) ; //ýṹֽС wndClass.style = CS_HREDRAW | CS_VREDRAW; //ôڵʽ wndClass.lpfnWndProc = WndProc; //ָ򴰿ڹָ̺ wndClass.cbClsExtra = 0; wndClass.cbWndExtra = 0; wndClass.hInstance = hInstance; //ָڹ̵ijʵ wndClass.hIcon=(HICON)::LoadImage(NULL,_T("GameMedia\\icon.ico"),IMAGE_ICON,0,0,LR_DEFAULTSIZE|LR_LOADFROMFILE); //ȫֵ::LoadImageӱؼԶicoͼ wndClass.hCursor = LoadCursor( NULL, IDC_ARROW ); //ָĹ wndClass.hbrBackground=(HBRUSH)GetStockObject(GRAY_BRUSH); //ΪhbrBackgroundԱָһɫˢ wndClass.lpszMenuName = NULL; //һԿַָֹ˵Դ֡ wndClass.lpszClassName = _T("ForTheDreamOfGameDevelop"); //һԿַָֹ֡ if( !RegisterClassEx( &wndClass ) ) //괰ںҪԴעᣬܴ͵Ĵ return -1; HWND hwnd = CreateWindow( _T("ForTheDreamOfGameDevelop"),WINDOW_TITLE, //ϲּĴںCreateWindow WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, WINDOW_WIDTH, WINDOW_HEIGHT, NULL, NULL, hInstance, NULL ); //Direct3DԴijʼʧmessageboxʾ if (!(S_OK==Direct3D_Init (hwnd,hInstance))) { MessageBox(hwnd, _T("Direct3Dʼʧ~"), _T("dzīϢ"), 0); //ʹMessageBoxһϢ } PlaySound(L"GameMedia\\NightElf1.wav", NULL, SND_FILENAME | SND_ASYNC|SND_LOOP); //ѭű MoveWindow(hwnd,200,10,WINDOW_WIDTH,WINDOW_HEIGHT,true); //ʾʱλãϽλĻ꣨2000 ShowWindow( hwnd, nShowCmd ); //Win32ShowWindowʾ UpdateWindow(hwnd); //Դڽи£·Ҫװһ //DirectInputijʼ g_pDInput = new DInputClass(); g_pDInput->Init(hwnd,hInstance,DISCL_FOREGROUND | DISCL_NONEXCLUSIVE,DISCL_FOREGROUND | DISCL_NONEXCLUSIVE); //Ϣѭ MSG msg = { 0 }; //ʼmsg while( msg.message != WM_QUIT ) //ʹwhileѭ { static FLOAT fLastTime = (float)::timeGetTime(); static FLOAT fCurrTime = (float)::timeGetTime(); static FLOAT fTimeDelta = 0.0f; fCurrTime = (float)::timeGetTime(); fTimeDelta = (fCurrTime - fLastTime) / 1000.0f; fLastTime = fCurrTime; if( PeekMessage( &msg, 0, 0, 0, PM_REMOVE ) ) //鿴ӦóϢУϢʱеϢɷȥ { TranslateMessage( &msg ); //ϢתΪַϢ DispatchMessage( &msg ); //úַһϢڳ } else { Direct3D_Update(hwnd,fTimeDelta); //øºлĸ Direct3D_Render(hwnd,fTimeDelta); //ȾлȾ } } UnregisterClass(_T("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,0.0f); //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_CleanUpCOMӿڶ PostQuitMessage( 0 ); //ϵͳиֹ߳ӦWM_DESTROYϢ break; //switch default: //caseϣִиdefault return DefWindowProc( hwnd, message, wParam, lParam ); //ȱʡĴڹΪӦóûдĴϢṩȱʡĴ } return 0; //˳ } //-----------------------------------Direct3D_Init( )---------------------------------- // Direct3DʼDirect3Dijʼ //------------------------------------------------------------------------------------------------ HRESULT Direct3D_Init(HWND hwnd,HINSTANCE hInstance) { //-------------------------------------------------------------------------------------- // Direct3DʼIJ֮һӿڡDirect3Dӿڶ, ԱøDirect3D󴴽Direct3D豸 //-------------------------------------------------------------------------------------- LPDIRECT3D9 pD3D = NULL; //Direct3DӿڶĴ if( NULL == ( pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) ) //ʼDirect3Dӿڶ󣬲DirectX汾Э return E_FAIL; //-------------------------------------------------------------------------------------- // Direct3DʼIJ֮,ȡϢȡӲ豸Ϣ //-------------------------------------------------------------------------------------- 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ʼIJ֮ݡ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; d3dpp.EnableAutoDepthStencil = true; d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8; d3dpp.Flags = 0; d3dpp.FullScreen_RefreshRateInHz = 0; d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; //-------------------------------------------------------------------------------------- // Direct3DʼIJ֮ģ豸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( )-------------------------------------- // ȾԴʼڴ˺нҪȾԴijʼ //-------------------------------------------------------------------------------------------------- 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ļм LPD3DXBUFFER pAdjBuffer = NULL; LPD3DXBUFFER pMtrlBuffer = NULL; D3DXLoadMeshFromX(L"angle.X", D3DXMESH_MANAGED, g_pd3dDevice, &pAdjBuffer, &pMtrlBuffer, NULL, &g_dwNumMtrls, &g_pMesh); // ȡʺ D3DXMATERIAL *pMtrls = (D3DXMATERIAL*)pMtrlBuffer->GetBufferPointer(); //һD3DXMATERIALṹڶȡʺϢ g_pMaterials = new D3DMATERIAL9[g_dwNumMtrls]; g_pTextures = new LPDIRECT3DTEXTURE9[g_dwNumMtrls]; for (DWORD i=0; iSetLight(0, &g_Light); g_pd3dDevice->LightEnable(0, true); g_pd3dDevice->SetRenderState(D3DRS_NORMALIZENORMALS, true); g_pd3dDevice->SetRenderState(D3DRS_SPECULARENABLE, true); // ʼ g_pCamera = new CameraClass(g_pd3dDevice); g_pCamera->SetCameraPosition(&D3DXVECTOR3(0.0f, 1400.0f, -1800.0f)); //ڵλ g_pCamera->SetTargetPosition(&D3DXVECTOR3(0.0f, 1200.0f, 0.0f)); //Ŀ۲ڵλ g_pCamera->SetViewMatrix(); //ȡ任 g_pCamera->SetProjMatrix(); //ͶӰ任 // ʼ g_pTerrain = new TerrainClass(g_pd3dDevice); g_pTerrain->LoadTerrainFromFile(L"GameMedia\\heighmap.raw", L"GameMedia\\terrainstone.jpg"); //ļظ߶ͼ g_pTerrain->InitTerrain(200, 200, 60.0f, 8.0f); //ĸֱֵǶ࣬ϵ //ʼն g_pSkyBox = new SkyBoxClass( g_pd3dDevice ); g_pSkyBox->LoadSkyTextureFromFile(L"GameMedia\\TropicalSunnyDayFront2048.png",L"GameMedia\\TropicalSunnyDayBack2048.png",L"GameMedia\\TropicalSunnyDayRight2048.png",L"GameMedia\\TropicalSunnyDayLeft2048.png", L"GameMedia\\TropicalSunnyDayUp2048.png");//ļǰҡ5ͼ g_pSkyBox->InitSkyBox(50000); //պеı߳ //ʼѩϵͳ g_pSnowParticles = new SnowParticleClass(g_pd3dDevice); g_pSnowParticles->InitSnowParticle(); return S_OK; } //-----------------------------------Direct3D_Update( )-------------------------------- // ǼʱȾ뵫Ҫʱõģ簴ĸģ //-------------------------------------------------------------------------------------------------- void Direct3D_Update( HWND hwnd,FLOAT fTimeDelta) { //ʹDirectInputȡ g_pDInput->GetInput(); // ƶӽ if (g_pDInput->IsKeyDown(DIK_A)) g_pCamera->MoveAlongRightVec(-3.0f); if (g_pDInput->IsKeyDown(DIK_D)) g_pCamera->MoveAlongRightVec( 3.0f); if (g_pDInput->IsKeyDown(DIK_W)) g_pCamera->MoveAlongLookVec( 3.0f); if (g_pDInput->IsKeyDown(DIK_S)) g_pCamera->MoveAlongLookVec(-3.0f); if (g_pDInput->IsKeyDown(DIK_R)) g_pCamera->MoveAlongUpVec( 3.0f); if (g_pDInput->IsKeyDown(DIK_F)) g_pCamera->MoveAlongUpVec(-3.0f); //תӽ if (g_pDInput->IsKeyDown(DIK_LEFT)) g_pCamera->RotationUpVec(-0.003f); if (g_pDInput->IsKeyDown(DIK_RIGHT)) g_pCamera->RotationUpVec( 0.003f); if (g_pDInput->IsKeyDown(DIK_UP)) g_pCamera->RotationRightVec(-0.003f); if (g_pDInput->IsKeyDown(DIK_DOWN)) g_pCamera->RotationRightVec( 0.003f); if (g_pDInput->IsKeyDown(DIK_Q)) g_pCamera->RotationLookVec(0.003f); if (g_pDInput->IsKeyDown(DIK_E)) g_pCamera->RotationLookVec( -0.003f); //ת g_pCamera->RotationUpVec(g_pDInput->MouseDX()* 0.001f); g_pCamera->RotationRightVec(g_pDInput->MouseDY() * 0.001f); //ֿƹ۲ static FLOAT fPosZ=0.0f; fPosZ += g_pDInput->MouseDZ()*0.03f; //㲢ȡ任 D3DXMATRIX matView; g_pCamera->CalculateViewMatrix(&matView); g_pd3dDevice->SetTransform(D3DTS_VIEW, &matView); //ȷ任浽g_matWorld D3DXMatrixTranslation(&g_matWorld, 0.0f, 0.0f, fPosZ); //δƶ POINT lt,rb; RECT rect; GetClientRect(hwnd,&rect); //ȡôڲ //ϵlt lt.x = rect.left; lt.y = rect.top; //rb rb.x = rect.right; rb.y = rect.bottom; //ltrbĴתΪĻ ClientToScreen(hwnd,<); ClientToScreen(hwnd,&rb); //Ļ趨 rect.left = lt.x; rect.top = lt.y; rect.right = rb.x; rect.bottom = rb.y; //ƶ ClipCursor(&rect); ShowCursor(false); // } //-----------------------------------Direct3D_Render( )------------------------------- // ʹDirect3DȾ //-------------------------------------------------------------------------------------------------- void Direct3D_Render(HWND hwnd,FLOAT fTimeDelta) { //-------------------------------------------------------------------------------------- // Direct3DȾ岽֮һ //-------------------------------------------------------------------------------------- g_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER|D3DCLEAR_STENCIL, D3DCOLOR_XRGB(100, 255, 255), 1.0f, 0); //-------------------------------------------------------------------------------------- // Direct3DȾ岽֮ʼ //-------------------------------------------------------------------------------------- g_pd3dDevice->BeginScene(); // ʼ //-------------------------------------------------------------------------------------- // Direct3DȾ岽֮ʽ //-------------------------------------------------------------------------------------- // D3DXMATRIX mScal,mRot2,mTrans,mFinal; //һЩ׼ԴƷо任 D3DXMatrixTranslation(&mTrans,50.0f,1200.0f,0.0f); D3DXMatrixScaling(&mScal,3.0f,3.0f,3.0f); mFinal=mScal*mTrans*g_matWorld; g_pd3dDevice->SetTransform(D3DTS_WORLD, &mFinal);//ģ͵Ϊ׼ // һforѭģ͵ֵĻ for (DWORD i = 0; i < g_dwNumMtrls; i++) { g_pd3dDevice->SetMaterial(&g_pMaterials[i]); //ô˲ֵIJ g_pd3dDevice->SetTexture(0, g_pTextures[i]);//ô˲ֵ g_pMesh->DrawSubset(i); //ƴ˲ } // D3DXMATRIX TransMatrix, RotMatrix, FinalMatrix; D3DXMatrixRotationX(&RotMatrix, -D3DX_PI * 0.5f); g_pd3dDevice->SetLight(0, &g_Light); g_pd3dDevice->SetMaterial(&g_MaterialCylinder); g_pd3dDevice->SetTexture(0, NULL);//ô˲ֵ for(int i = 0; i < 4; i++) { D3DXMatrixTranslation(&TransMatrix, -300.0f, 0.0f, -350.0f + (i * 500.0f)); FinalMatrix = RotMatrix * TransMatrix ; g_pd3dDevice->SetTransform(D3DTS_WORLD, &FinalMatrix); g_cylinder->DrawSubset(0); D3DXMatrixTranslation(&TransMatrix, 300.0f, 0.0f, -350.0f + (i * 500.0f)); FinalMatrix = RotMatrix * TransMatrix ; g_pd3dDevice->SetTransform(D3DTS_WORLD, &FinalMatrix); g_cylinder->DrawSubset(0); } //Ƶ g_pTerrain->RenderTerrain(&g_matWorld, false); //ȾΣҵڶΪfalseʾȾε߿ // D3DXMATRIX matSky,matTransSky,matRotSky; D3DXMatrixTranslation(&matTransSky,0.0f,-12000.0f,0.0f); D3DXMatrixRotationY(&matRotSky, -0.000005f*timeGetTime()); //ת, ģƲ˶Ч matSky=matTransSky*matRotSky; g_pSkyBox->RenderSkyBox(&matSky, false); //ѩϵͳ g_pSnowParticles->UpdateSnowParticle(fTimeDelta); g_pSnowParticles->RenderSnowParticle(); //Ϣ HelpText_Render(hwnd); //-------------------------------------------------------------------------------------- // Direct3DȾ岽֮ġ //-------------------------------------------------------------------------------------- g_pd3dDevice->EndScene(); // //-------------------------------------------------------------------------------------- // Direct3DȾ岽֮塿ʾת //-------------------------------------------------------------------------------------- g_pd3dDevice->Present(NULL, NULL, NULL, NULL); // תʾ } //-----------------------------------HelpText_Render( )------------------------------- // װ˰Ϣĺ //-------------------------------------------------------------------------------------------------- void HelpText_Render(HWND hwnd) { //һΣڻȡھ RECT formatRect; GetClientRect(hwnd, &formatRect); //ڴϽǴʾÿ֡ formatRect.top = 5; 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.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" Wǰ S ", -1, &formatRect, DT_SINGLELINE | DT_NOCLIP | DT_LEFT, D3DCOLOR_RGBA(255,200,0,255)); formatRect.top += 25; g_pTextHelper->DrawText(NULL, L" A Dҷ", -1, &formatRect, DT_SINGLELINE | DT_NOCLIP | DT_LEFT, D3DCOLOR_RGBA(255,200,0,255)); formatRect.top += 25; g_pTextHelper->DrawText(NULL, L" RֱϷ Fֱ·", -1, &formatRect, DT_SINGLELINE | DT_NOCLIP | DT_LEFT, D3DCOLOR_RGBA(255,200,0,255)); formatRect.top += 25; g_pTextHelper->DrawText(NULL, L" Qб Eб", -1, &formatRect, DT_SINGLELINE | DT_NOCLIP | DT_LEFT, D3DCOLOR_RGBA(255,200,0,255)); formatRect.top += 25; g_pTextHelper->DrawText(NULL, L" ϡ¡ҷƶӽDZ仯 ", -1, &formatRect, DT_SINGLELINE | DT_NOCLIP | DT_LEFT, D3DCOLOR_RGBA(255,200,0,255)); formatRect.top += 25; g_pTextHelper->DrawText(NULL, L" ֣ģY᷽ƶ", -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)); } //-----------------------------------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ӿڶ for (DWORD i = 0; iCreateDevice( GUID_SysKeyboard, &m_KeyboardDevice, NULL )); HR( m_KeyboardDevice->SetCooperativeLevel( hWnd, keyboardCoopFlags)); HR( m_KeyboardDevice->SetDataFormat( &c_dfDIKeyboard )); HR( m_KeyboardDevice->Acquire( )); HR( m_KeyboardDevice->Poll( )); //豸ijʼ 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; } //----------------------------------------------------------------------------- // NameDInputClass::GetInput() // Desc: ڻȡϢĺ //----------------------------------------------------------------------------- void DInputClass::GetInput() { 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); } } //----------------------------------------------------------------------------- // NameDInputClass::IsKeyDown() // Desc: жϼijǷ //----------------------------------------------------------------------------- bool DInputClass::IsKeyDown(int iKey) { if(m_keyBuffer[iKey] & 0x80) return true; else return false; } //----------------------------------------------------------------------------- // NameDInputClass::IsMouseButtonDown() // Desc: жijǷ //----------------------------------------------------------------------------- bool DInputClass::IsMouseButtonDown(int button) { return (m_MouseState.rgbButtons[button] & 0x80) != 0; } //----------------------------------------------------------------------------- // NameDInputClass::MouseDX // Desc: ָXֵ //----------------------------------------------------------------------------- float DInputClass::MouseDX() { return (float)m_MouseState.lX; } //----------------------------------------------------------------------------- // NameDInputClass::MouseDY // Desc: ָYֵ //----------------------------------------------------------------------------- float DInputClass::MouseDY() { return (float)m_MouseState.lY; } //----------------------------------------------------------------------------- // NameDInputClass::MouseDZ // Desc: ָZֵ֣ //----------------------------------------------------------------------------- float DInputClass::MouseDZ() { return (float)m_MouseState.lZ; } //----------------------------------------------------------------------------- // Desc: //----------------------------------------------------------------------------- DInputClass::~DInputClass(void) { 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); } ================================================ FILE: Direct3D-Game-Demo/D3Ddemo19/DirectInputClass.h ================================================ //============================================================================= // Name: DirectInputClass.h // Des: װDirectInput봦ͷļ // 2013 203 Create by dzī //============================================================================= #pragma once #include "D3DUtil.h" #define DIRECTINPUT_VERSION 0x0800 #include //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); //жϼijǷ bool IsMouseButtonDown(int button); //ж갴Ƿ񱻰 float MouseDX(); //Xֵ float MouseDY(); //Yֵ float MouseDZ(); //Zֵ public: DInputClass(void); //캯 ~DInputClass(void); // }; ================================================ FILE: Direct3D-Game-Demo/D3Ddemo19/SkyBoxClass.cpp ================================================ //============================================================================= // Name: SkyBoxClass.cpp // Des: һװάպϵͳԴļ // 2013 324 Create by dzī //============================================================================= #include "d3dx9.h" #include "SkyBoxClass.h" #include "D3DUtil.h" //------------------------------------------------------------------------------------------------- // Desc: 캯 //------------------------------------------------------------------------------------------------- SkyBoxClass::SkyBoxClass( LPDIRECT3DDEVICE9 pDevice ) { //ֵ m_pVertexBuffer=NULL; m_pd3dDevice=pDevice; for(int i=0; i<5; i++) m_pTexture[i] = NULL; m_Length = 0.0f; } //------------------------------------------------------------------------------------------------- // Name: SkyBoxClass::InitSkyBox( ) // Desc: պгʼ㻺ĸֵ //------------------------------------------------------------------------------------------------- BOOL SkyBoxClass::InitSkyBox( float Length ) { m_Length=Length; //1.㻺 m_pd3dDevice->CreateVertexBuffer( 20 * sizeof(SKYBOXVERTEX), 0, D3DFVF_SKYBOX, D3DPOOL_MANAGED, &m_pVertexBuffer, 0 ); //һṹѶ׼ SKYBOXVERTEX vertices[] = { //ǰĸ { -m_Length/2, 0.0f, m_Length/2, 0.0f, 1.0f, }, { -m_Length/2, m_Length/2, m_Length/2, 0.0f, 0.0f, }, { m_Length/2, 0.0f, m_Length/2, 1.0f, 1.0f, }, { m_Length/2, m_Length/2, m_Length/2, 1.0f, 0.0f, }, //ĸ { m_Length/2, 0.0f, -m_Length/2, 0.0f, 1.0f, }, { m_Length/2, m_Length/2, -m_Length/2, 0.0f, 0.0f, }, { -m_Length/2, 0.0f, -m_Length/2, 1.0f, 1.0f, }, { -m_Length/2, m_Length/2, -m_Length/2, 1.0f, 0.0f, }, //ĸ { -m_Length/2, 0.0f, -m_Length/2, 0.0f, 1.0f, }, { -m_Length/2, m_Length/2, -m_Length/2, 0.0f, 0.0f, }, { -m_Length/2, 0.0f, m_Length/2, 1.0f, 1.0f, }, { -m_Length/2, m_Length/2, m_Length/2, 1.0f, 0.0f, }, //ĸ { m_Length/2, 0.0f, m_Length/2, 0.0f, 1.0f, }, { m_Length/2, m_Length/2, m_Length/2, 0.0f, 0.0f, }, { m_Length/2, 0.0f, -m_Length/2, 1.0f, 1.0f, }, { m_Length/2, m_Length/2, -m_Length/2, 1.0f, 0.0f, }, //ĸ { m_Length/2, m_Length/2, -m_Length/2, 1.0f, 0.0f, }, { m_Length/2, m_Length/2, m_Length/2, 1.0f, 1.0f, }, { -m_Length/2, m_Length/2, -m_Length/2, 0.0f, 0.0f, }, { -m_Length/2, m_Length/2, m_Length/2, 0.0f, 1.0f, }, }; //׼䶥 void* pVertices; //2. m_pVertexBuffer->Lock( 0, 0, (void**)&pVertices, 0 ); //3.ʡѽṹеֱӿ㻺 memcpy( pVertices, vertices, sizeof(vertices) ); //4. m_pVertexBuffer->Unlock(); return TRUE; } //------------------------------------------------------------------------------------------------- // Name: SkyBoxClass::LoadSkyTextureFromFile( ) // Desc: պغ //------------------------------------------------------------------------------------------------- BOOL SkyBoxClass::LoadSkyTextureFromFile( wchar_t *pFrontTextureFile, wchar_t *pBackTextureFile, wchar_t *pLeftTextureFile, wchar_t *pRightTextureFile, wchar_t *pTopTextureFile) { //ļ D3DXCreateTextureFromFile( m_pd3dDevice , pFrontTextureFile, &m_pTexture[0] ); //ǰ D3DXCreateTextureFromFile( m_pd3dDevice , pBackTextureFile, &m_pTexture[1] ); // D3DXCreateTextureFromFile( m_pd3dDevice , pLeftTextureFile, &m_pTexture[2] ); // D3DXCreateTextureFromFile( m_pd3dDevice , pRightTextureFile, &m_pTexture[3] ); // D3DXCreateTextureFromFile( m_pd3dDevice , pTopTextureFile, &m_pTexture[4] ); // return TRUE; } //-------------------------------------------------------------------------------------- // Name: SkyBoxClass::RenderSkyBox() // Desc: ƳպУͨڶѡǷƳ߿ //-------------------------------------------------------------------------------------- void SkyBoxClass::RenderSkyBox( D3DXMATRIX *pMatWorld, BOOL bRenderFrame ) { m_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1); //ɫϵĵһɫֵ m_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE ); //ɫϵĵһֵȡɫֵ m_pd3dDevice->SetTransform( D3DTS_WORLD, pMatWorld ); // m_pd3dDevice->SetStreamSource(0,m_pVertexBuffer, 0, sizeof(SKYBOXVERTEX)); //ѰļϢĶ㻺Ⱦˮ m_pd3dDevice->SetFVF(D3DFVF_SKYBOX); //FVFʽ //һforѭ5Ƴ for(int i =0; i<5; i++) { m_pd3dDevice->SetTexture(0, m_pTexture[i]); m_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, i*4, 2); } //ǷȾ߿Ĵ if (bRenderFrame) //ҪȾ߿Ļ { m_pd3dDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME); //ģʽΪ߿ //һforѭ5߿Ƴ for(int i =0; i<5; i++) { m_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, i*4, 2); //ƶ } m_pd3dDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID); //ģʽʵ } } //------------------------------------------------------------------------------------------------- // Desc: //------------------------------------------------------------------------------------------------- SkyBoxClass::~SkyBoxClass(void) { SAFE_RELEASE( m_pVertexBuffer ); for(int i=0; i<5; i++) { SAFE_RELEASE( m_pTexture[i] ); } } ================================================ FILE: Direct3D-Game-Demo/D3Ddemo19/SkyBoxClass.h ================================================ //============================================================================= // Name: SkyBoxClass.h // Des: һװάպϵͳͷļ // 2013 324 Create by dzī //============================================================================= #pragma once #include "D3DUtil.h" //ΪպඨһFVFʽ struct SKYBOXVERTEX { float x,y,z; float u,v; }; #define D3DFVF_SKYBOX D3DFVF_XYZ|D3DFVF_TEX1 class SkyBoxClass { private: LPDIRECT3DDEVICE9 m_pd3dDevice; //D3D豸 LPDIRECT3DVERTEXBUFFER9 m_pVertexBuffer; //㻺 LPDIRECT3DTEXTURE9 m_pTexture[5]; //5ӿڶ float m_Length; //պб߳ public: SkyBoxClass( LPDIRECT3DDEVICE9 pDevice ); //캯 virtual ~SkyBoxClass(void); // public: BOOL InitSkyBox( float Length ); //ʼպк BOOL LoadSkyTextureFromFile(wchar_t *pFrontTextureFile, wchar_t *pBackTextureFile,wchar_t *pLeftTextureFile, wchar_t *pRightTextureFile,wchar_t *pTopTextureFile); //ļպϵ VOID RenderSkyBox( D3DXMATRIX *pMatWorld, BOOL bRenderFrame ); //Ⱦպ,ݵһ趨պ󣬵ڶѡǷȾ߿ }; ================================================ FILE: Direct3D-Game-Demo/D3Ddemo19/SnowParticleClass.cpp ================================================ //============================================================================= // Name: SnowParticleClass.cpp // Des: һװѩϵͳϵͳԴļ // 2013 331 Create by dzī //============================================================================= #include "d3dx9.h" #include "SnowParticleClass.h" //------------------------------------------------------------------------------------------------- // Desc: 캯 //------------------------------------------------------------------------------------------------- SnowParticleClass::SnowParticleClass(LPDIRECT3DDEVICE9 pd3dDevice) { //ֵ m_pd3dDevice=pd3dDevice; m_pVertexBuffer=NULL; for(int i=0; i<5; i++) m_pTexture[i] = NULL; } //------------------------------------------------------------------------------------------------- // Name: SnowParticleClass::InitSnowParticle( ) // Desc: ϵͳʼ //------------------------------------------------------------------------------------------------- HRESULT SnowParticleClass::InitSnowParticle( ) { //ʼѩ srand(GetTickCount()); for(int i=0; iCreateVertexBuffer( 4*sizeof(POINTVERTEX), 0, D3DFVF_POINTVERTEX,D3DPOOL_MANAGED, &m_pVertexBuffer, NULL ); //ѩӶ㻺 POINTVERTEX vertices[] = { { -30.0f, 0.0f, 0.0f, 0.0f, 1.0f, }, { -30.0f, 60.0f, 0.0f, 0.0f, 0.0f, }, { 30.0f, 0.0f, 0.0f, 1.0f, 1.0f, }, { 30.0f, 60.0f, 0.0f, 1.0f, 0.0f, } }; // VOID* pVertices; m_pVertexBuffer->Lock( 0, sizeof(vertices), (void**)&pVertices, 0 ); // memcpy( pVertices, vertices, sizeof(vertices) ); // m_pVertexBuffer->Unlock(); //6ѩ D3DXCreateTextureFromFile( m_pd3dDevice, L"GameMedia\\snow1.jpg", &m_pTexture[0] ); D3DXCreateTextureFromFile( m_pd3dDevice, L"GameMedia\\snow2.jpg", &m_pTexture[1] ); D3DXCreateTextureFromFile( m_pd3dDevice, L"GameMedia\\snow3.jpg", &m_pTexture[2] ); D3DXCreateTextureFromFile( m_pd3dDevice, L"GameMedia\\snow4.jpg", &m_pTexture[3] ); D3DXCreateTextureFromFile( m_pd3dDevice, L"GameMedia\\snow5.jpg", &m_pTexture[4] ); D3DXCreateTextureFromFile( m_pd3dDevice, L"GameMedia\\snow6.jpg", &m_pTexture[5] ); return S_OK; } //------------------------------------------------------------------------------------------------- // Name: SnowParticleClass::UpdateSnowParticle( ) // Desc: ϵͳº //------------------------------------------------------------------------------------------------- HRESULT SnowParticleClass::UpdateSnowParticle( float fElapsedTime) { //һforѭÿѩӵĵǰλúͽǶ for(int i=0; iSetRenderState( D3DRS_LIGHTING, false ); //״̬ m_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1); //ɫϵĵһɫֵ m_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE ); //ɫϵĵһֵȡɫֵ m_pd3dDevice->SetSamplerState( 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR ); //С״̬ m_pd3dDevice->SetSamplerState( 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR ); //Ŵ״̬ //Alphaϵ m_pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, true); //Alpha m_pd3dDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ONE); //ԴϵΪ1 m_pd3dDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE); //ĿϵΪ1 //޳ģʽΪ޳κ m_pd3dDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE ); //Ⱦѩ for(int i=0; iSetTransform( D3DTS_WORLD, &matWorld); //Ⱦǰѩ m_pd3dDevice->SetTexture( 0, m_pTexture[m_Snows[i].TextureIndex] ); // m_pd3dDevice->SetStreamSource(0, m_pVertexBuffer, 0, sizeof(POINTVERTEX)); //ѰļϢĶ㻺Ⱦˮ m_pd3dDevice->SetFVF(D3DFVF_POINTVERTEX); //FVFʽ m_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2); // } //ָȾ״̬Alpha ޳״̬ m_pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, false); m_pd3dDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_CCW ); m_pd3dDevice->SetRenderState( D3DRS_LIGHTING, true ); return S_OK; } //------------------------------------------------------------------------------------------------- // Desc: //------------------------------------------------------------------------------------------------- SnowParticleClass::~SnowParticleClass() { SAFE_RELEASE(m_pVertexBuffer); for(int i=0;i<3; i++) { SAFE_RELEASE(m_pTexture[i]); } } ================================================ FILE: Direct3D-Game-Demo/D3Ddemo19/SnowParticleClass.h ================================================ //============================================================================= // Name: SnowParticleClass.h // Des: һװѩϵͳϵͳͷļ // 2013 331 Create by dzī //============================================================================= #pragma once #include "D3DUtil.h" #define PARTICLE_NUMBER 15000 //ѩԿáͯЬȡСһ㡣 #define SNOW_SYSTEM_LENGTH_X 20000 //ѩij #define SNOW_SYSTEM_WIDTH_Z 20000 //ѩĿ #define SNOW_SYSTEM_HEIGHT_Y 20000 //ѩĸ߶ //------------------------------------------------------------------------------------------------- //ѩӵFVFṹͶʽ //------------------------------------------------------------------------------------------------- struct POINTVERTEX { float x, y, z; //λ float u,v ; // }; #define D3DFVF_POINTVERTEX (D3DFVF_XYZ|D3DFVF_TEX1) //------------------------------------------------------------------------------------------------- // Desc: ѩӽṹĶ //------------------------------------------------------------------------------------------------- struct SNOWPARTICLE { float x, y, z; //λ float RotationY; //ѩYתǶ float RotationX; //ѩXתǶ float FallSpeed; //ѩ½ٶ float RotationSpeed; //ѩתٶ int TextureIndex; // }; //------------------------------------------------------------------------------------------------- // Desc: ϵͳĶ //------------------------------------------------------------------------------------------------- class SnowParticleClass { private: LPDIRECT3DDEVICE9 m_pd3dDevice; //D3D豸 SNOWPARTICLE m_Snows[PARTICLE_NUMBER]; //ѩ LPDIRECT3DVERTEXBUFFER9 m_pVertexBuffer; //Ӷ㻺 LPDIRECT3DTEXTURE9 m_pTexture[6]; //ѩ public: SnowParticleClass(LPDIRECT3DDEVICE9 pd3dDevice); //캯 ~SnowParticleClass(); // HRESULT InitSnowParticle(); //ϵͳʼ HRESULT UpdateSnowParticle( float fElapsedTime); //ϵͳº HRESULT RenderSnowParticle( ); //ϵͳȾ }; ================================================ FILE: Direct3D-Game-Demo/D3Ddemo19/TerrainClass.cpp ================================================ //============================================================================= // Name: TerrainClass.cpp // Des: һװάϵͳԴļ // 2013 317 Create by dzī //============================================================================= #include "TerrainClass.h" //----------------------------------------------------------------------------- // Desc: 캯 //----------------------------------------------------------------------------- TerrainClass::TerrainClass(IDirect3DDevice9* pd3dDevice) { //Աֵ m_pd3dDevice = pd3dDevice; m_pTexture = NULL; m_pIndexBuffer = NULL; m_pVertexBuffer = NULL; m_nCellsPerRow = 0; m_nCellsPerCol = 0; m_nVertsPerRow = 0; m_nVertsPerCol = 0; m_nNumVertices = 0; m_fTerrainWidth = 0.0f; m_fTerrainDepth = 0.0f; m_fCellSpacing = 0.0f; m_fHeightScale = 0.0f; } //-------------------------------------------------------------------------------------- // Name: TerrainClass::LoadTerrainFromFile() // Desc: صθ߶ϢԼ //-------------------------------------------------------------------------------------- BOOL TerrainClass::LoadTerrainFromFile(wchar_t *pRawFileName, wchar_t *pTextureFile) { // ļжȡ߶Ϣ std::ifstream inFile; inFile.open(pRawFileName, std::ios::binary); //öƵķʽļ inFile.seekg(0,std::ios::end); //ļָƶļĩβ std::vector inData(inFile.tellg()); //ģ嶨һvector͵ıinDataʼֵΪǰλãС inFile.seekg(std::ios::beg); //ļָƶļĿͷ׼ȡ߶Ϣ inFile.read((char*)&inData[0], inData.size()); //ؼһȡ߶Ϣ inFile.close(); //Թرļ m_vHeightInfo.resize(inData.size()); //m_vHeightInfoߴȡΪijߴ //inDataеֵm_vHeightInfo for (unsigned int i=0; iCreateVertexBuffer(m_nNumVertices * sizeof(TERRAINVERTEX), D3DUSAGE_WRITEONLY, TERRAINVERTEX::FVF, D3DPOOL_MANAGED, &m_pVertexBuffer, 0))) return FALSE; //2 TERRAINVERTEX *pVertices = NULL; m_pVertexBuffer->Lock(0, 0, (void**)&pVertices, 0); //3ʣֵ FLOAT fStartX = -m_fTerrainWidth / 2.0f, fEndX = m_fTerrainWidth / 2.0f; //ָʼͽXֵ FLOAT fStartZ = m_fTerrainDepth / 2.0f, fEndZ = -m_fTerrainDepth / 2.0f; //ָʼͽZֵ FLOAT fCoordU = 10.0f / (FLOAT)m_nCellsPerRow; //ָĺֵ FLOAT fCoordV = 10.0f / (FLOAT)m_nCellsPerCol; //ֵָ int nIndex = 0, i = 0, j = 0; for (float z = fStartZ; z >=fEndZ; z -= m_fCellSpacing, i++) //Z귽ʼ㵽мı { j = 0; for (float x = fStartX; x <=fEndX; x += m_fCellSpacing, j++) //X귽ʼ㵽мı { nIndex = i * m_nCellsPerRow + j; //ָǰڶ㻺еλ pVertices[nIndex] = TERRAINVERTEX(x, m_vHeightInfo[nIndex], z, j*fCoordU, i*fCoordV); //Ѷλڸ߶ͼжӦĸԼ긳ֵǰĶ nIndex++; //Լ1 } } //4 m_pVertexBuffer->Unlock(); //--------------------------------------------------------------- // ε //--------------------------------------------------------------- //1. if (FAILED(m_pd3dDevice->CreateIndexBuffer(m_nNumVertices * 6 *sizeof(WORD), D3DUSAGE_WRITEONLY, D3DFMT_INDEX16, D3DPOOL_MANAGED, &m_pIndexBuffer, 0))) return FALSE; //2. WORD* pIndices = NULL; m_pIndexBuffer->Lock(0, 0, (void**)&pIndices, 0); //3.ʣֵ nIndex = 0; for(int row = 0; row < m_nCellsPerRow-1; row++) //ÿ { for(int col = 0; col < m_nCellsPerCol-1; col++) //ÿ { //ABC pIndices[nIndex] = row * m_nCellsPerRow + col; //A pIndices[nIndex+1] = row * m_nCellsPerRow + col + 1; //B pIndices[nIndex+2] = (row+1) * m_nCellsPerRow + col; //C //CBD pIndices[nIndex+3] = (row+1) * m_nCellsPerRow + col; //C pIndices[nIndex+4] = row * m_nCellsPerRow + col + 1; //B pIndices[nIndex+5] = (row+1) * m_nCellsPerRow + col + 1;//D //һԪ6 nIndex += 6; //Լ6 } } //4 m_pIndexBuffer->Unlock(); return TRUE; } //-------------------------------------------------------------------------------------- // Name: TerrainClass::RenderTerrain() // Desc: ƳΣͨڶѡǷƳ߿ //-------------------------------------------------------------------------------------- BOOL TerrainClass::RenderTerrain(D3DXMATRIX *pMatWorld, BOOL bRenderFrame) { m_pd3dDevice->SetStreamSource(0, m_pVertexBuffer, 0, sizeof(TERRAINVERTEX)); m_pd3dDevice->SetFVF(TERRAINVERTEX::FVF);//ָʹõʽĺ m_pd3dDevice->SetIndices(m_pIndexBuffer);// m_pd3dDevice->SetTexture(0, m_pTexture);// m_pd3dDevice->SetRenderState(D3DRS_LIGHTING, FALSE); //رչ m_pd3dDevice->SetTransform(D3DTS_WORLD, pMatWorld); // m_pd3dDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, m_nNumVertices, 0, m_nNumVertices * 2); //ƶ m_pd3dDevice->SetRenderState(D3DRS_LIGHTING, TRUE); //򿪹 m_pd3dDevice->SetTexture(0, 0); //ÿ //ǷȾ߿Ĵ if (bRenderFrame) //ҪȾ߿Ļ { m_pd3dDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME); //ģʽΪ߿ m_pd3dDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, m_nNumVertices, 0, m_nNumVertices * 2); //ƶ m_pd3dDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID); //ģʽʵ } return TRUE; } //----------------------------------------------------------------------------- // Desc: //----------------------------------------------------------------------------- TerrainClass::~TerrainClass(void) { SAFE_RELEASE(m_pTexture); SAFE_RELEASE(m_pIndexBuffer); SAFE_RELEASE(m_pVertexBuffer); } ================================================ FILE: Direct3D-Game-Demo/D3Ddemo19/TerrainClass.h ================================================ //============================================================================= // Name: TerrainClass.h // Des: һװάϵͳͷļ // 2013 317 Create by dzī //============================================================================= #pragma once #include #include #include #include #include "D3DUtil.h" class TerrainClass { private: LPDIRECT3DDEVICE9 m_pd3dDevice; //D3D豸 LPDIRECT3DTEXTURE9 m_pTexture; // LPDIRECT3DINDEXBUFFER9 m_pIndexBuffer; //㻺 LPDIRECT3DVERTEXBUFFER9 m_pVertexBuffer; // int m_nCellsPerRow; // ÿеĵԪ int m_nCellsPerCol; // ÿеĵԪ int m_nVertsPerRow; // ÿеĶ int m_nVertsPerCol; // ÿеĶ int m_nNumVertices; // FLOAT m_fTerrainWidth; // εĿ FLOAT m_fTerrainDepth; // ε FLOAT m_fCellSpacing; // Ԫļ FLOAT m_fHeightScale; // ߶ϵ std::vector m_vHeightInfo; // ڴŸ߶Ϣ //һεFVFʽ struct TERRAINVERTEX { FLOAT _x, _y, _z; FLOAT _u, _v; TERRAINVERTEX(FLOAT x, FLOAT y, FLOAT z, FLOAT u, FLOAT v) :_x(x), _y(y), _z(z), _u(u), _v(v) {} static const DWORD FVF = D3DFVF_XYZ | D3DFVF_TEX1; }; public: TerrainClass(IDirect3DDevice9 *pd3dDevice); //캯 virtual ~TerrainClass(void); // public: BOOL LoadTerrainFromFile(wchar_t *pRawFileName, wchar_t *pTextureFile); //ļظ߶ͼĺ BOOL InitTerrain(INT nRows, INT nCols, FLOAT fSpace, FLOAT fScale); //γʼ BOOL RenderTerrain(D3DXMATRIX *pMatWorld, BOOL bDrawFrame=FALSE); //Ⱦ }; ================================================ FILE: Direct3D-Game-Demo/D3Ddemo2/D3Ddemo2.cpp ================================================ //-----------------------------------˵---------------------------------------------- // :D3Ddemo2 // 20134 Create by dzī // Direct3DȾ岽 ʾ //------------------------------------------------------------------------------------------------ //-----------------------------------ͷļ֡--------------------------------------- // ͷļ //------------------------------------------------------------------------------------------------ #include #include #include //-----------------------------------ļ֡--------------------------------------- // Ŀļ //------------------------------------------------------------------------------------------------ #pragma comment(lib,"winmm.lib") //PlaySoundļ #pragma comment(lib,"d3d9.lib") #pragma comment(lib,"d3dx9.lib") //-----------------------------------궨岿֡-------------------------------------------- // һЩ //------------------------------------------------------------------------------------------------ #define WINDOW_WIDTH 800 //Ϊڿȶĺ꣬Էڴ˴޸Ĵڿ #define WINDOW_HEIGHT 600 //Ϊڸ߶ȶĺ꣬Էڴ˴޸Ĵڸ߶ #define WINDOW_TITLE L"ϨϷ롿Direct3DȾ岽 ʾ" //Ϊڱⶨĺ #define SAFE_RELEASE(p) { if(p) { (p)->Release(); (p)=NULL; } } //һȫͷź꣬ںCOMӿָͷ //-----------------------------------ȫֱ֡------------------------------------- // ȫֱ //------------------------------------------------------------------------------------------------ LPDIRECT3DDEVICE9 g_pd3dDevice = NULL; //Direct3D豸 ID3DXFont* g_pFont=NULL; //COMӿ float g_FPS = 0.0f; //һ͵ı֡ wchar_t g_strFPS[50]; //֡ʵַ //-----------------------------------ȫֺ֡------------------------------------- // ȫֺֹδıʶϵд //------------------------------------------------------------------------------------------------ LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam );//ڹ̺ HRESULT Direct3D_Init(HWND hwnd); //нDirect3Dijʼ HRESULT Objects_Init(HWND hwnd); //нҪƵԴʼ VOID Direct3D_Render(HWND hwnd); //нDirect3DȾд VOID Direct3D_CleanUp( ); //COMԴԼԴ float Get_FPS(); //-----------------------------------WinMain( )-------------------------------------- // WindowsӦóںǵij↑ʼ //------------------------------------------------------------------------------------------------ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nShowCmd) { //1ڴIJ֮һʼһĴ 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; //ָڹ̵ijʵ 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ڴIJ֮עᴰ if( !RegisterClassEx( &wndClass ) ) //괰ںҪԴעᣬܴ͵Ĵ return -1; //3ڴIJ֮ʽ HWND hwnd = CreateWindow( L"ForTheDreamOfGameDevelop",WINDOW_TITLE, //ϲּĴںCreateWindow WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, WINDOW_WIDTH, WINDOW_HEIGHT, NULL, NULL, hInstance, NULL ); //Direct3DԴijʼʧmessageboxʾ if (!(S_OK==Direct3D_Init (hwnd))) { MessageBox(hwnd, _T("Direct3Dʼʧ~"), _T("dzīϢ"), 0); //ʹMessageBoxһϢ } //4ڴIJ֮ģڵƶʾ MoveWindow(hwnd,250,80,WINDOW_WIDTH,WINDOW_HEIGHT,true); //ʾʱλãʹϽλڣ250,80 ShowWindow( hwnd, nShowCmd ); //ShowWindowʾ UpdateWindow(hwnd); //Դڽи£·Ҫװһ PlaySound(L"Final Fantasy XIII.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_Render(hwnd); //Ⱦ } } //6ע UnregisterClass(L"ForTheDreamOfGameDevelop", wndClass.hInstance); //׼ע return 0; } //-----------------------------------WndProc( )-------------------------------------- // ڹ̺WndProc,ԴϢд //------------------------------------------------------------------------------------------------ LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ) { switch( message ) //switch俪ʼ { case WM_PAINT: // ǿͻػϢ Direct3D_Render(hwnd); //Direct3DȾ ValidateRect(hwnd, NULL); // ¿ͻʾ break; //switch case WM_KEYDOWN: // Ǽ̰Ϣ if (wParam == VK_ESCAPE) // µļESC DestroyWindow(hwnd); // ٴ, һWM_DESTROYϢ break; //switch case WM_DESTROY: //ǴϢ Direct3D_CleanUp(); //ԶԴGame_CleanUp˳ǰԴ PostQuitMessage( 0 ); //ϵͳиֹ߳ӦWM_DESTROYϢ break; //switch default: //caseϣִиdefault return DefWindowProc( hwnd, message, wParam, lParam ); //ȱʡĴڹ } return 0; //˳ } //-----------------------------------Direct3D_Init( )-------------------------------------- // Direct3DʼDirect3Dijʼ //------------------------------------------------------------------------------------------------ HRESULT Direct3D_Init(HWND hwnd) { //-------------------------------------------------------------------------------------- // Direct3DʼIJ֮һӿڡDirect3Dӿڶ, ԱøDirect3D󴴽Direct3D豸 //-------------------------------------------------------------------------------------- LPDIRECT3D9 pD3D = NULL; //Direct3DӿڶĴ if( NULL == ( pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) ) //ʼDirect3Dӿڶ󣬲DirectX汾Э return E_FAIL; //-------------------------------------------------------------------------------------- // Direct3DʼIJ֮,ȡϢȡӲ豸Ϣ //-------------------------------------------------------------------------------------- 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ʼIJ֮ݡD3DPRESENT_PARAMETERSṹ //-------------------------------------------------------------------------------------- D3DPRESENT_PARAMETERS d3dpp; ZeroMemory(&d3dpp, sizeof(d3dpp)); d3dpp.BackBufferWidth = WINDOW_WIDTH; d3dpp.BackBufferHeight = WINDOW_HEIGHT; d3dpp.BackBufferFormat = D3DFMT_A8R8G8B8; d3dpp.BackBufferCount = 1; d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE; d3dpp.MultiSampleQuality = 0; d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; d3dpp.hDeviceWindow = hwnd; d3dpp.Windowed = true; d3dpp.EnableAutoDepthStencil = true; d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8; d3dpp.Flags = 0; d3dpp.FullScreen_RefreshRateInHz = 0; d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; //-------------------------------------------------------------------------------------- // Direct3DʼIJ֮ģ豸Direct3D豸ӿ //-------------------------------------------------------------------------------------- if(FAILED(pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, vp, &d3dpp, &g_pd3dDevice))) return E_FAIL; SAFE_RELEASE(pD3D) //LPDIRECT3D9ӿڶʹɣǽͷŵ if(!(S_OK==Objects_Init(hwnd))) return E_FAIL; //һObjects_InitȾԴijʼ return S_OK; } //-----------------------------------Object_Init( )-------------------------------------- // ȾԴʼڴ˺нҪȾԴijʼ //-------------------------------------------------------------------------------------------------- HRESULT Objects_Init(HWND hwnd) { // if(FAILED(D3DXCreateFont(g_pd3dDevice, 36, 0, 0, 1, false, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, DEFAULT_QUALITY, 0, _T("΢ź"), &g_pFont))) return E_FAIL; srand(timeGetTime()); //ϵͳʱʼ return S_OK; } //-----------------------------------Direct3D_Render( )------------------------------- // ʹDirect3DȾ //-------------------------------------------------------------------------------------------------- void Direct3D_Render(HWND hwnd) { //-------------------------------------------------------------------------------------- // Direct3DȾ岽֮һ //-------------------------------------------------------------------------------------- g_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0); //һΣڻȡھ RECT formatRect; GetClientRect(hwnd, &formatRect); //-------------------------------------------------------------------------------------- // Direct3DȾ岽֮ʼ //-------------------------------------------------------------------------------------- g_pd3dDevice->BeginScene(); // ʼ //-------------------------------------------------------------------------------------- // Direct3DȾ岽֮ʽƣдĶ //-------------------------------------------------------------------------------------- //ڴϽǴʾÿ֡ int charCount = swprintf_s(g_strFPS, 20, _T("FPS:%0.3f"), Get_FPS() ); g_pFont->DrawText(NULL, g_strFPS, charCount , &formatRect, DT_TOP | DT_RIGHT, D3DCOLOR_XRGB(255,39,136)); //100дһ formatRect.top = 100;//ֵָ g_pFont->DrawText(0, _T("ϨϷ롿"), -1, &formatRect, DT_CENTER, D3DCOLOR_XRGB(68,139,256)); //250дڶ formatRect.top = 250; g_pFont->DrawText(0, _T("Ϸ磬~"), -1, &formatRect, DT_CENTER, D3DCOLOR_XRGB(255,255,255)); //400д formatRect.top = 400; g_pFont->DrawText(0, _T("˰"), -1, &formatRect, DT_CENTER, D3DCOLOR_XRGB(rand() % 256, rand() % 256, rand() % 256));//RGBֵ˰Ч //-------------------------------------------------------------------------------------- // 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( )-------------------------------- // Դڴ˺нг˳ǰԴ //--------------------------------------------------------------------------------------------------- void Direct3D_CleanUp() { //ͷCOMӿڶ SAFE_RELEASE(g_pFont) SAFE_RELEASE(g_pd3dDevice) } ================================================ FILE: Direct3D-Game-Demo/D3Ddemo20/CameraClass.cpp ================================================ //============================================================================= // Name: CameraClass.cpp // Des: һװʵԴļ // 2013 310 Create by dzī //============================================================================= #include "CameraClass.h" #ifndef WINDOW_WIDTH #define WINDOW_WIDTH 800 //Ϊڿȶĺ꣬Էڴ˴޸Ĵڿ #define WINDOW_HEIGHT 600 //Ϊڸ߶ȶĺ꣬Էڴ˴޸Ĵڸ߶ #endif //----------------------------------------------------------------------------- // Desc: 캯 //----------------------------------------------------------------------------- CameraClass::CameraClass(IDirect3DDevice9 *pd3dDevice) { m_pd3dDevice = pd3dDevice; m_vRightVector = D3DXVECTOR3(1.0f, 0.0f, 0.0f); // ĬXغ m_vUpVector = D3DXVECTOR3(0.0f, 1.0f, 0.0f); // ĬYغ m_vLookVector = D3DXVECTOR3(0.0f, 0.0f, 1.0f); // ĬϹ۲Zغ m_vCameraPosition = D3DXVECTOR3(0.0f, 0.0f, -250.0f); // ĬΪ(0.0f, 0.0f, -250.0f) m_vTargetPosition = D3DXVECTOR3(0.0f, 0.0f, 0.0f);//ĬϹ۲ĿλΪ(0.0f, 0.0f, 0.0f); } //----------------------------------------------------------------------------- // NameCameraClass::CalculateViewMatrix( ) // Desc: ݸľȡ任 //----------------------------------------------------------------------------- VOID CameraClass::CalculateViewMatrix(D3DXMATRIX *pMatrix) { //1.Ȱ3淶ʹ໥ֱΪһ D3DXVec3Normalize(&m_vLookVector, &m_vLookVector); //淶۲ D3DXVec3Cross(&m_vUpVector, &m_vLookVector, &m_vRightVector); // ۲ֱ D3DXVec3Normalize(&m_vUpVector, &m_vUpVector); // 淶 D3DXVec3Cross(&m_vRightVector, &m_vUpVector, &m_vLookVector); // ֱ D3DXVec3Normalize(&m_vRightVector, &m_vRightVector); // 淶 // 2.ȡ任 //дȡ任ĵһ pMatrix->_11 = m_vRightVector.x; // Rx pMatrix->_12 = m_vUpVector.x; // Ux pMatrix->_13 = m_vLookVector.x; // Lx pMatrix->_14 = 0.0f; //дȡ任ĵڶ pMatrix->_21 = m_vRightVector.y; // Ry pMatrix->_22 = m_vUpVector.y; // Uy pMatrix->_23 = m_vLookVector.y; // Ly pMatrix->_24 = 0.0f; //дȡ任ĵ pMatrix->_31 = m_vRightVector.z; // Rz pMatrix->_32 = m_vUpVector.z; // Uz pMatrix->_33 = m_vLookVector.z; // Lz pMatrix->_34 = 0.0f; //дȡ任ĵ pMatrix->_41 = -D3DXVec3Dot(&m_vRightVector, &m_vCameraPosition); // -P*R pMatrix->_42 = -D3DXVec3Dot(&m_vUpVector, &m_vCameraPosition); // -P*U pMatrix->_43 = -D3DXVec3Dot(&m_vLookVector, &m_vCameraPosition); // -P*L pMatrix->_44 = 1.0f; } //----------------------------------------------------------------------------- // NameCameraClass::SetTargetPosition( ) // Desc: Ĺ۲λ //----------------------------------------------------------------------------- VOID CameraClass::SetTargetPosition(D3DXVECTOR3 *pLookat) { //ȿpLookatǷΪĬֵNULL if (pLookat != NULL) m_vTargetPosition = (*pLookat); else m_vTargetPosition = D3DXVECTOR3(0.0f, 0.0f, 1.0f); m_vLookVector = m_vTargetPosition - m_vCameraPosition;//۲λüλãõ۲췽 D3DXVec3Normalize(&m_vLookVector, &m_vLookVector);//淶m_vLookVector //淶m_vUpVectorm_vRightVector D3DXVec3Cross(&m_vUpVector, &m_vLookVector, &m_vRightVector); D3DXVec3Normalize(&m_vUpVector, &m_vUpVector); D3DXVec3Cross(&m_vRightVector, &m_vUpVector, &m_vLookVector); D3DXVec3Normalize(&m_vRightVector, &m_vRightVector); } //----------------------------------------------------------------------------- // NameCameraClass::SetCameraPosition( ) // Desc: ڵλ //----------------------------------------------------------------------------- VOID CameraClass::SetCameraPosition(D3DXVECTOR3 *pVector) { D3DXVECTOR3 V = D3DXVECTOR3(0.0f, 0.0f, -250.0f); m_vCameraPosition = pVector ? (*pVector) : V;//ĿpVectorΪĻ //*pVectorֵm_vCameraPosition=*pVector //򷵻Vֵm_vCameraPosition=V } //----------------------------------------------------------------------------- // NameCameraClass::SetViewMatrix( ) // Desc: ȡ任 //----------------------------------------------------------------------------- VOID CameraClass::SetViewMatrix(D3DXMATRIX *pMatrix) { //pMatrixֵһж if (pMatrix) m_matView = *pMatrix; else CalculateViewMatrix(&m_matView); m_pd3dDevice->SetTransform(D3DTS_VIEW, &m_matView); //ȡ任ֱֵҷϷ͹۲ m_vRightVector = D3DXVECTOR3(m_matView._11, m_matView._12, m_matView._13); m_vUpVector = D3DXVECTOR3(m_matView._21, m_matView._22, m_matView._23); m_vLookVector = D3DXVECTOR3(m_matView._31, m_matView._32, m_matView._33); } //----------------------------------------------------------------------------- // NameCameraClass::SetProjMatrix( ) // Desc: ͶӰ任 //----------------------------------------------------------------------------- VOID CameraClass::SetProjMatrix(D3DXMATRIX *pMatrix) { //жֵûУûеĻͼһ if (pMatrix != NULL) m_matProj = *pMatrix; else D3DXMatrixPerspectiveFovLH(&m_matProj, D3DX_PI / 4.0f, (float)((double)WINDOW_WIDTH/WINDOW_HEIGHT), 1.0f, 300000.0f);//ӽԶһ㣬Ͳ¿Զ m_pd3dDevice->SetTransform(D3DTS_PROJECTION, &m_matProj);//ͶӰ任 } //----------------------------------------------------------------------------- // NameCameraClass::MoveAlongRightVec( ) // Desc: ƽfUnitsλ //----------------------------------------------------------------------------- VOID CameraClass::MoveAlongRightVec(FLOAT fUnits) { //ֱӳfUnitsۼӾ m_vCameraPosition += m_vRightVector * fUnits; m_vTargetPosition += m_vRightVector * fUnits; } //----------------------------------------------------------------------------- // NameCameraClass::MoveAlongUpVec( ) // Desc: ƽfUnitsλ //----------------------------------------------------------------------------- VOID CameraClass::MoveAlongUpVec(FLOAT fUnits) { //ֱӳfUnitsۼӾ m_vCameraPosition += m_vUpVector * fUnits; m_vTargetPosition += m_vUpVector * fUnits; } //----------------------------------------------------------------------------- // NameCameraClass::MoveAlongLookVec( ) // Desc: ع۲ƽfUnitsλ //----------------------------------------------------------------------------- VOID CameraClass::MoveAlongLookVec(FLOAT fUnits) { //ֱӳfUnitsۼӾ m_vCameraPosition += m_vLookVector * fUnits; m_vTargetPosition += m_vLookVector * fUnits; } //----------------------------------------------------------------------------- // NameCameraClass::RotationRightVec( ) // Desc: תfAngleȵλĽǶ //----------------------------------------------------------------------------- VOID CameraClass::RotationRightVec(FLOAT fAngle) { D3DXMATRIX R; D3DXMatrixRotationAxis(&R, &m_vRightVector, fAngle);//m_vRightVectorתfAngleǶȵR D3DXVec3TransformCoord(&m_vUpVector, &m_vUpVector, &R);//m_vUpVectorm_vRightVectorתfAngleǶ D3DXVec3TransformCoord(&m_vLookVector, &m_vLookVector, &R);//m_vLookVectorm_vRightVectorתfAngleǶ m_vTargetPosition = m_vLookVector * D3DXVec3Length(&m_vCameraPosition);//һ¹۲λãģ= } //----------------------------------------------------------------------------- // NameCameraClass::RotationUpVec( ) // Desc: תfAngleȵλĽǶ //----------------------------------------------------------------------------- VOID CameraClass::RotationUpVec(FLOAT fAngle) { D3DXMATRIX R; D3DXMatrixRotationAxis(&R, &m_vUpVector, fAngle);//m_vUpVectorתfAngleǶȵR D3DXVec3TransformCoord(&m_vRightVector, &m_vRightVector, &R);//m_vRightVectorm_vUpVectorתfAngleǶ D3DXVec3TransformCoord(&m_vLookVector, &m_vLookVector, &R);//m_vLookVectorm_vUpVectorתfAngleǶ m_vTargetPosition = m_vLookVector * D3DXVec3Length(&m_vCameraPosition);//һ¹۲λãģ= } //----------------------------------------------------------------------------- // NameCameraClass::RotationLookVec( ) // Desc: ع۲תfAngleȵλĽǶ //----------------------------------------------------------------------------- VOID CameraClass::RotationLookVec(FLOAT fAngle) { D3DXMATRIX R; D3DXMatrixRotationAxis(&R, &m_vLookVector, fAngle);//m_vLookVectorתfAngleǶȵR D3DXVec3TransformCoord(&m_vRightVector, &m_vRightVector, &R);//m_vRightVectorm_vLookVectorתfAngleǶ D3DXVec3TransformCoord(&m_vUpVector, &m_vUpVector, &R);//m_vUpVectorm_vLookVectorתfAngleǶ m_vTargetPosition = m_vLookVector * D3DXVec3Length(&m_vCameraPosition);//һ¹۲λãģ= } //----------------------------------------------------------------------------- // Desc: //----------------------------------------------------------------------------- CameraClass::~CameraClass(void) { } ================================================ FILE: Direct3D-Game-Demo/D3Ddemo20/CameraClass.h ================================================ //============================================================================= // Name: CameraClass.h // Des: һװʵͷļ // 2013 310 Create by dzī //============================================================================= #pragma once #include #include class CameraClass { private: //Ա D3DXVECTOR3 m_vRightVector; // ҷ D3DXVECTOR3 m_vUpVector; // Ϸ D3DXVECTOR3 m_vLookVector; // ۲췽 D3DXVECTOR3 m_vCameraPosition; // λõ D3DXVECTOR3 m_vTargetPosition; //Ŀ۲λõ D3DXMATRIX m_matView; // ȡ任 D3DXMATRIX m_matProj; // ͶӰ任 LPDIRECT3DDEVICE9 m_pd3dDevice; //Direct3D豸 public: //һȡ任ĺ VOID CalculateViewMatrix(D3DXMATRIX *pMatrix); //ȡ任 //Getϵк VOID GetProjMatrix(D3DXMATRIX *pMatrix) { *pMatrix = m_matProj; } //صǰͶӰ VOID GetCameraPosition(D3DXVECTOR3 *pVector) { *pVector = m_vCameraPosition; } //صǰλþ VOID GetLookVector(D3DXVECTOR3 *pVector) { *pVector = m_vLookVector; } //صǰĹ۲ //ĸSetϵкעDzĬֵNULLģʱдҲ VOID SetTargetPosition(D3DXVECTOR3 *pLookat = NULL); //Ŀ۲λ VOID SetCameraPosition(D3DXVECTOR3 *pVector = NULL); //ڵλ VOID SetViewMatrix(D3DXMATRIX *pMatrix = NULL); //ȡ任 VOID SetProjMatrix(D3DXMATRIX *pMatrix = NULL); //ͶӰ任 public: // ظƽƵ VOID MoveAlongRightVec(FLOAT fUnits); // rightƶ VOID MoveAlongUpVec(FLOAT fUnits); // upƶ VOID MoveAlongLookVec(FLOAT fUnits); // lookƶ // Ƹת VOID RotationRightVec(FLOAT fAngle); // rightת VOID RotationUpVec(FLOAT fAngle); // upת VOID RotationLookVec(FLOAT fAngle); // lookת public: //캯 CameraClass(IDirect3DDevice9 *pd3dDevice); //캯 virtual ~CameraClass(void); // }; ================================================ FILE: Direct3D-Game-Demo/D3Ddemo20/D3DUtil.h ================================================ //***************************************************************************************** // Desc: D3DUtil.hͷļڹĶ // 2013 203 Create by dzī //***************************************************************************************** #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 #ifndef SAFE_DELETE_ARRAY #define SAFE_DELETE_ARRAY(p) { if(p) { delete[] (p); (p)=NULL; } } #endif ================================================ FILE: Direct3D-Game-Demo/D3Ddemo20/D3Ddemo20.cpp ================================================ //-----------------------------------˵---------------------------------------------- // :D3Ddemo20 // 20134 Create by dzī // Ľ٣Ϸģ͵ ʾ // زij ħ3 // ģزijӢ޵6 ư //------------------------------------------------------------------------------------------------ //-----------------------------------궨岿֡-------------------------------------------- // һЩ //------------------------------------------------------------------------------------------------ #define WINDOW_WIDTH 932 //Ϊڿȶĺ꣬Էڴ˴޸Ĵڿ #define WINDOW_HEIGHT 700 //Ϊڸ߶ȶĺ꣬Էڴ˴޸Ĵڸ߶ #define WINDOW_TITLE _T("ϨϷ롿Ľ٣Ϸģ͵ ") //Ϊڱⶨĺ //-----------------------------------ͷļ֡--------------------------------------- // ͷļ //------------------------------------------------------------------------------------------------ #include #include #include #include #include "DirectInputClass.h" #include "CameraClass.h" #include "TerrainClass.h" #include "SkyBoxClass.h" #include "SnowParticleClass.h" #include "XFileModelClass.h" //-----------------------------------ļ֡--------------------------------------- // Ŀļ //------------------------------------------------------------------------------------------------ #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; // D3DLIGHT9 g_Light; //ȫֹ DInputClass* g_pDInput = NULL; //DInputClassָʵ CameraClass* g_pCamera = NULL; //ָʵ TerrainClass* g_pTerrain = NULL; //ָʵ SkyBoxClass* g_pSkyBox=NULL; //պָʵ SnowParticleClass* g_pSnowParticles = NULL; //ѩϵͳָʵ XFileModelClass* g_pXFileModel1 = NULL; //ģĵһ XFileModelClass* g_pXFileModel2 = NULL; //ģĵڶ XFileModelClass* g_pXFileModel3 = NULL; //ģĵ XFileModelClass* g_pXFileModel4 = NULL; //ģĵĸ //-----------------------------------ȫֺ֡------------------------------------- // ȫֺֹδıʶϵд //------------------------------------------------------------------------------------------------ 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,FLOAT fTimeDelta); void Direct3D_Update( HWND hwnd,FLOAT fTimeDelta); void Direct3D_CleanUp( ); float Get_FPS(); void HelpText_Render(HWND hwnd); //-----------------------------------WinMain( )-------------------------------------- // WindowsӦóںǵij↑ʼ //------------------------------------------------------------------------------------------------ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nShowCmd) { //1ڴIJ֮һʼһĴ 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; //ָڹ̵ijʵ wndClass.hIcon=(HICON)::LoadImage(NULL,L"GameMedia\\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ڴIJ֮עᴰ if( !RegisterClassEx( &wndClass ) ) //괰ںҪԴעᣬܴ͵Ĵ return -1; //3ڴIJ֮ʽ HWND hwnd = CreateWindow( L"ForTheDreamOfGameDevelop",WINDOW_TITLE, //ϲּĴںCreateWindow WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, WINDOW_WIDTH, WINDOW_HEIGHT, NULL, NULL, hInstance, NULL ); //Direct3DԴijʼʧmessageboxʾ if (!(S_OK==Direct3D_Init (hwnd,hInstance))) { MessageBox(hwnd, _T("Direct3Dʼʧ~"), _T("dzīϢ"), 0); //ʹMessageBoxһϢ } //4ڴIJ֮ģڵƶʾ MoveWindow(hwnd,150,20,WINDOW_WIDTH,WINDOW_HEIGHT,true); //ʾʱλãʹϽλڣ150,20 ShowWindow( hwnd, nShowCmd ); //ShowWindowʾ UpdateWindow(hwnd); //Դڽи£·Ҫװһ //DirectInputijʼ g_pDInput = new DInputClass(); g_pDInput->Init(hwnd,hInstance,DISCL_FOREGROUND | DISCL_NONEXCLUSIVE,DISCL_FOREGROUND | DISCL_NONEXCLUSIVE); //ǰ̨Ƕռģʽ PlaySound(L"GameMedia\\-.wav", NULL, SND_FILENAME | SND_ASYNC|SND_LOOP); //ѭű //5Ϣѭ MSG msg = { 0 }; //ʼmsg while( msg.message != WM_QUIT ) //ʹwhileѭ { static FLOAT fLastTime = (float)::timeGetTime(); static FLOAT fCurrTime = (float)::timeGetTime(); static FLOAT fTimeDelta = 0.0f; fCurrTime = (float)::timeGetTime(); fTimeDelta = (fCurrTime - fLastTime) / 1000.0f; fLastTime = fCurrTime; if( PeekMessage( &msg, 0, 0, 0, PM_REMOVE ) ) //鿴ӦóϢУϢʱеϢɷȥ { TranslateMessage( &msg ); //ϢתΪַϢ DispatchMessage( &msg ); //úַһϢڳ } else { Direct3D_Update(hwnd,fTimeDelta); //øºлĸ Direct3D_Render(hwnd,fTimeDelta); //ȾлȾ } } //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,0.0f); //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_CleanUpCOMӿڶ PostQuitMessage( 0 ); //ϵͳиֹ߳ӦWM_DESTROYϢ break; //switch default: //caseϣִиdefault return DefWindowProc( hwnd, message, wParam, lParam ); //ȱʡĴڹΪӦóûдĴϢṩȱʡĴ } return 0; //˳ } //-----------------------------------Direct3D_Init( )---------------------------------- // Direct3DʼDirect3Dijʼ //------------------------------------------------------------------------------------------------ HRESULT Direct3D_Init(HWND hwnd,HINSTANCE hInstance) { //-------------------------------------------------------------------------------------- // Direct3DʼIJ֮һӿڡDirect3Dӿڶ, ԱøDirect3D󴴽Direct3D豸 //-------------------------------------------------------------------------------------- LPDIRECT3D9 pD3D = NULL; //Direct3DӿڶĴ if( NULL == ( pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) ) //ʼDirect3Dӿڶ󣬲DirectX汾Э return E_FAIL; //-------------------------------------------------------------------------------------- // Direct3DʼIJ֮,ȡϢȡӲ豸Ϣ //-------------------------------------------------------------------------------------- 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ʼIJ֮ݡ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; d3dpp.EnableAutoDepthStencil = true; d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8; d3dpp.Flags = 0; d3dpp.FullScreen_RefreshRateInHz = 0; d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; //-------------------------------------------------------------------------------------- // Direct3DʼIJ֮ģ豸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( )-------------------------------------- // ȾԴʼڴ˺нҪȾԴijʼ //-------------------------------------------------------------------------------------------------- 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); // ù ::ZeroMemory(&g_Light, sizeof(g_Light)); g_Light.Type = D3DLIGHT_DIRECTIONAL; g_Light.Ambient = D3DXCOLOR(0.7f, 0.7f, 0.7f, 1.0f); g_Light.Diffuse = D3DXCOLOR(1.0f, 1.0f, 1.0f, 1.0f); g_Light.Specular = D3DXCOLOR(0.9f, 0.9f, 0.9f, 1.0f); g_Light.Direction = D3DXVECTOR3(1.0f, 1.0f, 1.0f); g_pd3dDevice->SetLight(0, &g_Light); g_pd3dDevice->LightEnable(0, true); g_pd3dDevice->SetRenderState(D3DRS_NORMALIZENORMALS, true); g_pd3dDevice->SetRenderState(D3DRS_SPECULARENABLE, true); // ʼ g_pCamera = new CameraClass(g_pd3dDevice); g_pCamera->SetCameraPosition(&D3DXVECTOR3(0.0f, 1200.0f, -2100.0f)); //ڵλ g_pCamera->SetTargetPosition(&D3DXVECTOR3(0.0f, 700.0f, 0.0f)); //Ŀ۲ڵλ g_pCamera->SetViewMatrix(); //ȡ任 g_pCamera->SetProjMatrix(); //ͶӰ任 // ʼ g_pTerrain = new TerrainClass(g_pd3dDevice); g_pTerrain->LoadTerrainFromFile(L"GameMedia\\heighmap.raw", L"GameMedia\\terrainstone.jpg"); //ļظ߶ͼ g_pTerrain->InitTerrain(200, 200, 60.0f, 8.0f); //ĸֱֵǶ࣬ϵ //ʼն g_pSkyBox = new SkyBoxClass( g_pd3dDevice ); g_pSkyBox->LoadSkyTextureFromFile(L"GameMedia\\SunSetFront2048.png",L"GameMedia\\SunSetBack2048.png",L"GameMedia\\SunSetRight2048.png",L"GameMedia\\SunSetLeft2048.png", L"GameMedia\\SunSetUp2048.png");//ļǰҡ5ͼ g_pSkyBox->InitSkyBox(50000); //պеı߳ //ʼѩϵͳ g_pSnowParticles = new SnowParticleClass(g_pd3dDevice); g_pSnowParticles->InitSnowParticle(); HRESULT hr; //һģ g_pXFileModel1 = new XFileModelClass(g_pd3dDevice); HR( g_pXFileModel1->LoadModelFromXFile(L"knight.X" )); //ڶģ g_pXFileModel2 = new XFileModelClass(g_pd3dDevice); HR( g_pXFileModel2->LoadModelFromXFile(L"dragon.X" )); //ģ g_pXFileModel3 = new XFileModelClass(g_pd3dDevice); HR( g_pXFileModel3->LoadModelFromXFile(L"Demon.X" )); //ĸģ g_pXFileModel4 = new XFileModelClass(g_pd3dDevice); HR( g_pXFileModel4->LoadModelFromXFile(L"angle.X" )); return S_OK; } //-----------------------------------Direct3D_Update( )-------------------------------- // ǼʱȾ뵫Ҫʱõģ簴ĸģ //-------------------------------------------------------------------------------------------------- void Direct3D_Update( HWND hwnd,FLOAT fTimeDelta) { //ʹDirectInputȡ g_pDInput->GetInput(); // ƶӽ if (g_pDInput->IsKeyDown(DIK_A)) g_pCamera->MoveAlongRightVec(-3.0f); if (g_pDInput->IsKeyDown(DIK_D)) g_pCamera->MoveAlongRightVec( 3.0f); if (g_pDInput->IsKeyDown(DIK_W)) g_pCamera->MoveAlongLookVec( 3.0f); if (g_pDInput->IsKeyDown(DIK_S)) g_pCamera->MoveAlongLookVec(-3.0f); if (g_pDInput->IsKeyDown(DIK_R)) g_pCamera->MoveAlongUpVec( 3.0f); if (g_pDInput->IsKeyDown(DIK_F)) g_pCamera->MoveAlongUpVec(-3.0f); //תӽ if (g_pDInput->IsKeyDown(DIK_LEFT)) g_pCamera->RotationUpVec(-0.003f); if (g_pDInput->IsKeyDown(DIK_RIGHT)) g_pCamera->RotationUpVec( 0.003f); if (g_pDInput->IsKeyDown(DIK_UP)) g_pCamera->RotationRightVec(-0.003f); if (g_pDInput->IsKeyDown(DIK_DOWN)) g_pCamera->RotationRightVec( 0.003f); if (g_pDInput->IsKeyDown(DIK_Q)) g_pCamera->RotationLookVec(0.001f); if (g_pDInput->IsKeyDown(DIK_E)) g_pCamera->RotationLookVec( -0.001f); //ת g_pCamera->RotationUpVec(g_pDInput->MouseDX()* 0.0006f); g_pCamera->RotationRightVec(g_pDInput->MouseDY() * 0.0006f); //ֿƹ۲ static FLOAT fPosZ=0.0f; fPosZ += g_pDInput->MouseDZ()*0.03f; //㲢ȡ任 D3DXMATRIX matView; g_pCamera->CalculateViewMatrix(&matView); g_pd3dDevice->SetTransform(D3DTS_VIEW, &matView); //ȷ任浽g_matWorld D3DXMatrixTranslation(&g_matWorld, 0.0f, 0.0f, fPosZ); //δƶ POINT lt,rb; RECT rect; GetClientRect(hwnd,&rect); //ȡôڲ //ϵlt lt.x = rect.left; lt.y = rect.top; //rb rb.x = rect.right; rb.y = rect.bottom; //ltrbĴתΪĻ ClientToScreen(hwnd,<); ClientToScreen(hwnd,&rb); //Ļ趨 rect.left = lt.x; rect.top = lt.y; rect.right = rb.x; rect.bottom = rb.y; //ƶ ClipCursor(&rect); ShowCursor(false); // } //-----------------------------------Direct3D_Render( )------------------------------- // ʹDirect3DȾ //-------------------------------------------------------------------------------------------------- void Direct3D_Render(HWND hwnd,FLOAT fTimeDelta) { //-------------------------------------------------------------------------------------- // Direct3DȾ岽֮һ //-------------------------------------------------------------------------------------- g_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER|D3DCLEAR_STENCIL, D3DCOLOR_XRGB(100, 255, 255), 1.0f, 0); //-------------------------------------------------------------------------------------- // Direct3DȾ岽֮ʼ //-------------------------------------------------------------------------------------- g_pd3dDevice->BeginScene(); // ʼ //-------------------------------------------------------------------------------------- // Direct3DȾ岽֮ʽ //-------------------------------------------------------------------------------------- //-----------------------------Ϸģ͡----------------------------- //һЩ׼ģͽо任 D3DXMATRIX mScal1,mScal2,mTrans1,mTrans2,mTrans3,mTrans4; D3DXMATRIX mFinal1,mFinal2,mFinal3,mFinal4; //һģ͵ĻƣǡϡģͺʵȻٻ D3DXMatrixTranslation(&mTrans1,50.0f,400.0f,0.0f); D3DXMatrixScaling(&mScal1,3.0f,3.0f,3.0f); mFinal1=mTrans1*mScal1*g_matWorld; g_pd3dDevice->SetTransform(D3DTS_WORLD, &mFinal1);//ģ͵Ϊ׼ g_pXFileModel1->RenderModel( ); //ڶģ͵ĻƣǡϡģͺʵȻٻ D3DXMatrixTranslation(&mTrans2, 200.0f, 0.0f, 0.0f); mFinal2=mTrans2*mFinal1; g_pd3dDevice->SetTransform(D3DTS_WORLD, &mFinal2); g_pXFileModel2->RenderModel( ); //ģ͵ĻƣǡϡģͺʵȻٻ D3DXMatrixTranslation(&mTrans3, -200.0f, 0.0f, 0.0f); mFinal3=mTrans3*mFinal1; g_pd3dDevice->SetTransform(D3DTS_WORLD, &mFinal3); g_pXFileModel3->RenderModel( ); //ĸģ͵ĻƣǡϡģͺʵȻٻ D3DXMatrixScaling(&mScal2,10.0f,10.0f,10.0f); D3DXMatrixTranslation(&mTrans4, 10.0f, 20.0f, 250.0f); mFinal4=mTrans4*mScal2*mFinal1; g_pd3dDevice->SetTransform(D3DTS_WORLD, &mFinal4); g_pXFileModel4->RenderModel( ); //-----------------------------ƵΡ----------------------------- g_pTerrain->RenderTerrain(&g_matWorld, false); //ȾΣҵڶΪfalseʾȾε߿ //-----------------------------ա----------------------------- D3DXMATRIX matSky,matTransSky,matRotSky; D3DXMatrixTranslation(&matTransSky,0.0f,-12000.0f,0.0f); D3DXMatrixRotationY(&matRotSky, -0.00002f*timeGetTime()); //ת, ģƲ˶Ч matSky=matTransSky*matRotSky; g_pSkyBox->RenderSkyBox(&matSky, false); //-----------------------------ѩϵͳ----------------------------- g_pSnowParticles->UpdateSnowParticle(fTimeDelta); g_pSnowParticles->RenderSnowParticle(); //-----------------------------Ϣ----------------------------- HelpText_Render(hwnd); //-------------------------------------------------------------------------------------- // Direct3DȾ岽֮ġ //-------------------------------------------------------------------------------------- g_pd3dDevice->EndScene(); // //-------------------------------------------------------------------------------------- // Direct3DȾ岽֮塿ʾת //-------------------------------------------------------------------------------------- g_pd3dDevice->Present(NULL, NULL, NULL, NULL); // תʾ } //-----------------------------------HelpText_Render( )------------------------------- // װ˰Ϣĺ //-------------------------------------------------------------------------------------------------- void HelpText_Render(HWND hwnd) { //һΣڻȡھ RECT formatRect; GetClientRect(hwnd, &formatRect); //ڴϽǴʾÿ֡ formatRect.top = 5; 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.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" Wǰ S ", -1, &formatRect, DT_SINGLELINE | DT_NOCLIP | DT_LEFT, D3DCOLOR_RGBA(255,200,0,255)); formatRect.top += 25; g_pTextHelper->DrawText(NULL, L" A Dҷ", -1, &formatRect, DT_SINGLELINE | DT_NOCLIP | DT_LEFT, D3DCOLOR_RGBA(255,200,0,255)); formatRect.top += 25; g_pTextHelper->DrawText(NULL, L" RֱϷ Fֱ·", -1, &formatRect, DT_SINGLELINE | DT_NOCLIP | DT_LEFT, D3DCOLOR_RGBA(255,200,0,255)); formatRect.top += 25; g_pTextHelper->DrawText(NULL, L" Qб Eб", -1, &formatRect, DT_SINGLELINE | DT_NOCLIP | DT_LEFT, D3DCOLOR_RGBA(255,200,0,255)); formatRect.top += 25; g_pTextHelper->DrawText(NULL, L" ϡ¡ҷƶӽDZ仯 ", -1, &formatRect, DT_SINGLELINE | DT_NOCLIP | DT_LEFT, D3DCOLOR_RGBA(255,200,0,255)); formatRect.top += 25; g_pTextHelper->DrawText(NULL, L" ֣ģY᷽ƶ", -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)); } //-----------------------------------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_DELETE(g_pDInput); SAFE_RELEASE(g_pd3dDevice); SAFE_RELEASE(g_pTextAdaperName) SAFE_RELEASE(g_pTextHelper) SAFE_RELEASE(g_pTextInfor) SAFE_RELEASE(g_pTextFPS) SAFE_RELEASE(g_pd3dDevice) } ================================================ FILE: Direct3D-Game-Demo/D3Ddemo20/DirectInputClass.cpp ================================================ //============================================================================= // Desc: DirectInput봦Դļ // 2013 203 Create by dzī //============================================================================= #include "DirectInputClass.h" //----------------------------------------------------------------------------- // Desc: 캯 //----------------------------------------------------------------------------- DInputClass::DInputClass() { m_pDirectInput = NULL; m_KeyboardDevice = NULL; ZeroMemory(m_keyBuffer,sizeof(char)*256); m_MouseDevice= NULL; ZeroMemory(&m_MouseState, sizeof(m_MouseState)); } //----------------------------------------------------------------------------- // NameDInputClass::Init( // Desc: ʼDirectInput̼豸 //----------------------------------------------------------------------------- HRESULT DInputClass::Init( HWND hWnd,HINSTANCE hInstance,DWORD keyboardCoopFlags, DWORD mouseCoopFlags ) { HRESULT hr; //ʼһIDirectInput8ӿڶ HR(DirectInput8Create( hInstance, DIRECTINPUT_VERSION, IID_IDirectInput8,(void**)&m_pDirectInput,NULL )); //м豸ijʼ HR( m_pDirectInput->CreateDevice( GUID_SysKeyboard, &m_KeyboardDevice, NULL )); HR( m_KeyboardDevice->SetCooperativeLevel( hWnd, keyboardCoopFlags)); HR( m_KeyboardDevice->SetDataFormat( &c_dfDIKeyboard )); HR( m_KeyboardDevice->Acquire( )); HR( m_KeyboardDevice->Poll( )); //豸ijʼ 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; } //----------------------------------------------------------------------------- // NameDInputClass::GetInput() // Desc: ڻȡϢĺ //----------------------------------------------------------------------------- void DInputClass::GetInput() { 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); } } //----------------------------------------------------------------------------- // NameDInputClass::IsKeyDown() // Desc: жϼijǷ //----------------------------------------------------------------------------- bool DInputClass::IsKeyDown(int iKey) { if(m_keyBuffer[iKey] & 0x80) return true; else return false; } //----------------------------------------------------------------------------- // NameDInputClass::IsMouseButtonDown() // Desc: жijǷ //----------------------------------------------------------------------------- bool DInputClass::IsMouseButtonDown(int button) { return (m_MouseState.rgbButtons[button] & 0x80) != 0; } //----------------------------------------------------------------------------- // NameDInputClass::MouseDX // Desc: ָXֵ //----------------------------------------------------------------------------- float DInputClass::MouseDX() { return (float)m_MouseState.lX; } //----------------------------------------------------------------------------- // NameDInputClass::MouseDY // Desc: ָYֵ //----------------------------------------------------------------------------- float DInputClass::MouseDY() { return (float)m_MouseState.lY; } //----------------------------------------------------------------------------- // NameDInputClass::MouseDZ // Desc: ָZֵ֣ //----------------------------------------------------------------------------- float DInputClass::MouseDZ() { return (float)m_MouseState.lZ; } //----------------------------------------------------------------------------- // Desc: //----------------------------------------------------------------------------- DInputClass::~DInputClass(void) { 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); } ================================================ FILE: Direct3D-Game-Demo/D3Ddemo20/DirectInputClass.h ================================================ //============================================================================= // Name: DirectInputClass.h // Des: װDirectInput봦ͷļ // 2013 203 Create by dzī //============================================================================= #pragma once #include "D3DUtil.h" #define DIRECTINPUT_VERSION 0x0800 #include //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); //жϼijǷ bool IsMouseButtonDown(int button); //ж갴Ƿ񱻰 float MouseDX(); //Xֵ float MouseDY(); //Yֵ float MouseDZ(); //Zֵ public: DInputClass(void); //캯 ~DInputClass(void); // }; ================================================ FILE: Direct3D-Game-Demo/D3Ddemo20/SkyBoxClass.cpp ================================================ //============================================================================= // Name: SkyBoxClass.cpp // Des: һװάպϵͳԴļ // 2013 324 Create by dzī //============================================================================= #include "d3dx9.h" #include "SkyBoxClass.h" #include "D3DUtil.h" //------------------------------------------------------------------------------------------------- // Desc: 캯 //------------------------------------------------------------------------------------------------- SkyBoxClass::SkyBoxClass( LPDIRECT3DDEVICE9 pDevice ) { //ֵ m_pVertexBuffer=NULL; m_pd3dDevice=pDevice; for(int i=0; i<5; i++) m_pTexture[i] = NULL; m_Length = 0.0f; } //------------------------------------------------------------------------------------------------- // Name: SkyBoxClass::InitSkyBox( ) // Desc: պгʼ㻺ĸֵ //------------------------------------------------------------------------------------------------- BOOL SkyBoxClass::InitSkyBox( float Length ) { m_Length=Length; //1.㻺 m_pd3dDevice->CreateVertexBuffer( 20 * sizeof(SKYBOXVERTEX), 0, D3DFVF_SKYBOX, D3DPOOL_MANAGED, &m_pVertexBuffer, 0 ); //һṹѶ׼ SKYBOXVERTEX vertices[] = { //ǰĸ { -m_Length/2, 0.0f, m_Length/2, 0.0f, 1.0f, }, { -m_Length/2, m_Length/2, m_Length/2, 0.0f, 0.0f, }, { m_Length/2, 0.0f, m_Length/2, 1.0f, 1.0f, }, { m_Length/2, m_Length/2, m_Length/2, 1.0f, 0.0f, }, //ĸ { m_Length/2, 0.0f, -m_Length/2, 0.0f, 1.0f, }, { m_Length/2, m_Length/2, -m_Length/2, 0.0f, 0.0f, }, { -m_Length/2, 0.0f, -m_Length/2, 1.0f, 1.0f, }, { -m_Length/2, m_Length/2, -m_Length/2, 1.0f, 0.0f, }, //ĸ { -m_Length/2, 0.0f, -m_Length/2, 0.0f, 1.0f, }, { -m_Length/2, m_Length/2, -m_Length/2, 0.0f, 0.0f, }, { -m_Length/2, 0.0f, m_Length/2, 1.0f, 1.0f, }, { -m_Length/2, m_Length/2, m_Length/2, 1.0f, 0.0f, }, //ĸ { m_Length/2, 0.0f, m_Length/2, 0.0f, 1.0f, }, { m_Length/2, m_Length/2, m_Length/2, 0.0f, 0.0f, }, { m_Length/2, 0.0f, -m_Length/2, 1.0f, 1.0f, }, { m_Length/2, m_Length/2, -m_Length/2, 1.0f, 0.0f, }, //ĸ { m_Length/2, m_Length/2, -m_Length/2, 1.0f, 0.0f, }, { m_Length/2, m_Length/2, m_Length/2, 1.0f, 1.0f, }, { -m_Length/2, m_Length/2, -m_Length/2, 0.0f, 0.0f, }, { -m_Length/2, m_Length/2, m_Length/2, 0.0f, 1.0f, }, }; //׼䶥 void* pVertices; //2. m_pVertexBuffer->Lock( 0, 0, (void**)&pVertices, 0 ); //3.ʡѽṹеֱӿ㻺 memcpy( pVertices, vertices, sizeof(vertices) ); //4. m_pVertexBuffer->Unlock(); return TRUE; } //------------------------------------------------------------------------------------------------- // Name: SkyBoxClass::LoadSkyTextureFromFile( ) // Desc: պغ //------------------------------------------------------------------------------------------------- BOOL SkyBoxClass::LoadSkyTextureFromFile( wchar_t *pFrontTextureFile, wchar_t *pBackTextureFile, wchar_t *pLeftTextureFile, wchar_t *pRightTextureFile, wchar_t *pTopTextureFile) { //ļ D3DXCreateTextureFromFile( m_pd3dDevice , pFrontTextureFile, &m_pTexture[0] ); //ǰ D3DXCreateTextureFromFile( m_pd3dDevice , pBackTextureFile, &m_pTexture[1] ); // D3DXCreateTextureFromFile( m_pd3dDevice , pLeftTextureFile, &m_pTexture[2] ); // D3DXCreateTextureFromFile( m_pd3dDevice , pRightTextureFile, &m_pTexture[3] ); // D3DXCreateTextureFromFile( m_pd3dDevice , pTopTextureFile, &m_pTexture[4] ); // return TRUE; } //-------------------------------------------------------------------------------------- // Name: SkyBoxClass::RenderSkyBox() // Desc: ƳպУͨڶѡǷƳ߿ //-------------------------------------------------------------------------------------- void SkyBoxClass::RenderSkyBox( D3DXMATRIX *pMatWorld, BOOL bRenderFrame ) { m_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1); //ɫϵĵһɫֵ m_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE ); //ɫϵĵһֵȡɫֵ m_pd3dDevice->SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_MIRROR); m_pd3dDevice->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_MIRROR); m_pd3dDevice->SetTransform( D3DTS_WORLD, pMatWorld ); // m_pd3dDevice->SetStreamSource(0,m_pVertexBuffer, 0, sizeof(SKYBOXVERTEX)); //ѰļϢĶ㻺Ⱦˮ m_pd3dDevice->SetFVF(D3DFVF_SKYBOX); //FVFʽ //һforѭ5Ƴ for(int i =0; i<5; i++) { m_pd3dDevice->SetTexture(0, m_pTexture[i]); m_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, i*4, 2); } //ǷȾ߿Ĵ if (bRenderFrame) //ҪȾ߿Ļ { m_pd3dDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME); //ģʽΪ߿ //һforѭ5߿Ƴ for(int i =0; i<5; i++) { m_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, i*4, 2); //ƶ } m_pd3dDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID); //ģʽʵ } } //------------------------------------------------------------------------------------------------- // Desc: //------------------------------------------------------------------------------------------------- SkyBoxClass::~SkyBoxClass(void) { SAFE_RELEASE( m_pVertexBuffer ); for(int i=0; i<5; i++) { SAFE_RELEASE( m_pTexture[i] ); } } ================================================ FILE: Direct3D-Game-Demo/D3Ddemo20/SkyBoxClass.h ================================================ //============================================================================= // Name: SkyBoxClass.h // Des: һװάպϵͳͷļ // 2013 324 Create by dzī //============================================================================= #pragma once #include "D3DUtil.h" //ΪպඨһFVFʽ struct SKYBOXVERTEX { float x,y,z; float u,v; }; #define D3DFVF_SKYBOX D3DFVF_XYZ|D3DFVF_TEX1 class SkyBoxClass { private: LPDIRECT3DDEVICE9 m_pd3dDevice; //D3D豸 LPDIRECT3DVERTEXBUFFER9 m_pVertexBuffer; //㻺 LPDIRECT3DTEXTURE9 m_pTexture[5]; //5ӿڶ float m_Length; //պб߳ public: SkyBoxClass( LPDIRECT3DDEVICE9 pDevice ); //캯 virtual ~SkyBoxClass(void); // public: BOOL InitSkyBox( float Length ); //ʼպк BOOL LoadSkyTextureFromFile(wchar_t *pFrontTextureFile, wchar_t *pBackTextureFile,wchar_t *pLeftTextureFile, wchar_t *pRightTextureFile,wchar_t *pTopTextureFile); //ļպϵ VOID RenderSkyBox( D3DXMATRIX *pMatWorld, BOOL bRenderFrame ); //Ⱦպ,ݵһ趨պ󣬵ڶѡǷȾ߿ }; ================================================ FILE: Direct3D-Game-Demo/D3Ddemo20/SnowParticleClass.cpp ================================================ //============================================================================= // Name: SnowParticleClass.cpp // Des: һװѩϵͳϵͳԴļ // 2013 331 Create by dzī //============================================================================= #include "d3dx9.h" #include "SnowParticleClass.h" //------------------------------------------------------------------------------------------------- // Desc: 캯 //------------------------------------------------------------------------------------------------- SnowParticleClass::SnowParticleClass(LPDIRECT3DDEVICE9 pd3dDevice) { //ֵ m_pd3dDevice=pd3dDevice; m_pVertexBuffer=NULL; for(int i=0; i<5; i++) m_pTexture[i] = NULL; } //------------------------------------------------------------------------------------------------- // Name: SnowParticleClass::InitSnowParticle( ) // Desc: ϵͳʼ //------------------------------------------------------------------------------------------------- HRESULT SnowParticleClass::InitSnowParticle( ) { //ʼѩ srand(GetTickCount()); for(int i=0; iCreateVertexBuffer( 4*sizeof(POINTVERTEX), 0, D3DFVF_POINTVERTEX,D3DPOOL_MANAGED, &m_pVertexBuffer, NULL ); //ѩӶ㻺 POINTVERTEX vertices[] = { { -30.0f, 0.0f, 0.0f, 0.0f, 1.0f, }, { -30.0f, 60.0f, 0.0f, 0.0f, 0.0f, }, { 30.0f, 0.0f, 0.0f, 1.0f, 1.0f, }, { 30.0f, 60.0f, 0.0f, 1.0f, 0.0f, } }; // VOID* pVertices; m_pVertexBuffer->Lock( 0, sizeof(vertices), (void**)&pVertices, 0 ); // memcpy( pVertices, vertices, sizeof(vertices) ); // m_pVertexBuffer->Unlock(); //6ѩ D3DXCreateTextureFromFile( m_pd3dDevice, L"GameMedia\\snow1.jpg", &m_pTexture[0] ); D3DXCreateTextureFromFile( m_pd3dDevice, L"GameMedia\\snow2.jpg", &m_pTexture[1] ); D3DXCreateTextureFromFile( m_pd3dDevice, L"GameMedia\\snow3.jpg", &m_pTexture[2] ); D3DXCreateTextureFromFile( m_pd3dDevice, L"GameMedia\\snow4.jpg", &m_pTexture[3] ); D3DXCreateTextureFromFile( m_pd3dDevice, L"GameMedia\\snow5.jpg", &m_pTexture[4] ); D3DXCreateTextureFromFile( m_pd3dDevice, L"GameMedia\\snow6.jpg", &m_pTexture[5] ); return S_OK; } //------------------------------------------------------------------------------------------------- // Name: SnowParticleClass::UpdateSnowParticle( ) // Desc: ϵͳº //------------------------------------------------------------------------------------------------- HRESULT SnowParticleClass::UpdateSnowParticle( float fElapsedTime) { //һforѭÿѩӵĵǰλúͽǶ for(int i=0; iSetRenderState( D3DRS_LIGHTING, false ); //״̬ m_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1); //ɫϵĵһɫֵ m_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE ); //ɫϵĵһֵȡɫֵ m_pd3dDevice->SetSamplerState( 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR ); //С״̬ m_pd3dDevice->SetSamplerState( 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR ); //Ŵ״̬ //Alphaϵ m_pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, true); //Alpha m_pd3dDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ONE); //ԴϵΪ1 m_pd3dDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE); //ĿϵΪ1 //޳ģʽΪ޳κ m_pd3dDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE ); //Ⱦѩ for(int i=0; iSetTransform( D3DTS_WORLD, &matWorld); //Ⱦǰѩ m_pd3dDevice->SetTexture( 0, m_pTexture[m_Snows[i].TextureIndex] ); // m_pd3dDevice->SetStreamSource(0, m_pVertexBuffer, 0, sizeof(POINTVERTEX)); //ѰļϢĶ㻺Ⱦˮ m_pd3dDevice->SetFVF(D3DFVF_POINTVERTEX); //FVFʽ m_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2); // } //ָȾ״̬Alpha ޳״̬ m_pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, false); m_pd3dDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_CCW ); m_pd3dDevice->SetRenderState( D3DRS_LIGHTING, true ); return S_OK; } //------------------------------------------------------------------------------------------------- // Desc: //------------------------------------------------------------------------------------------------- SnowParticleClass::~SnowParticleClass() { SAFE_RELEASE(m_pVertexBuffer); for(int i=0;i<3; i++) { SAFE_RELEASE(m_pTexture[i]); } } ================================================ FILE: Direct3D-Game-Demo/D3Ddemo20/SnowParticleClass.h ================================================ //============================================================================= // Name: SnowParticleClass.h // Des: һװѩϵͳϵͳͷļ // 2013 331 Create by dzī //============================================================================= #pragma once #include "D3DUtil.h" #define PARTICLE_NUMBER 3000 //ѩԿáͯЬȡСһ㡣 #define SNOW_SYSTEM_LENGTH_X 20000 //ѩij #define SNOW_SYSTEM_WIDTH_Z 20000 //ѩĿ #define SNOW_SYSTEM_HEIGHT_Y 20000 //ѩĸ߶ //------------------------------------------------------------------------------------------------- //ѩӵFVFṹͶʽ //------------------------------------------------------------------------------------------------- struct POINTVERTEX { float x, y, z; //λ float u,v ; // }; #define D3DFVF_POINTVERTEX (D3DFVF_XYZ|D3DFVF_TEX1) //------------------------------------------------------------------------------------------------- // Desc: ѩӽṹĶ //------------------------------------------------------------------------------------------------- struct SNOWPARTICLE { float x, y, z; //λ float RotationY; //ѩYתǶ float RotationX; //ѩXתǶ float FallSpeed; //ѩ½ٶ float RotationSpeed; //ѩתٶ int TextureIndex; // }; //------------------------------------------------------------------------------------------------- // Desc: ϵͳĶ //------------------------------------------------------------------------------------------------- class SnowParticleClass { private: LPDIRECT3DDEVICE9 m_pd3dDevice; //D3D豸 SNOWPARTICLE m_Snows[PARTICLE_NUMBER]; //ѩ LPDIRECT3DVERTEXBUFFER9 m_pVertexBuffer; //Ӷ㻺 LPDIRECT3DTEXTURE9 m_pTexture[6]; //ѩ public: SnowParticleClass(LPDIRECT3DDEVICE9 pd3dDevice); //캯 ~SnowParticleClass(); // HRESULT InitSnowParticle(); //ϵͳʼ HRESULT UpdateSnowParticle( float fElapsedTime); //ϵͳº HRESULT RenderSnowParticle( ); //ϵͳȾ }; ================================================ FILE: Direct3D-Game-Demo/D3Ddemo20/TerrainClass.cpp ================================================ //============================================================================= // Name: TerrainClass.cpp // Des: һװάϵͳԴļ // 2013 317 Create by dzī //============================================================================= #include "TerrainClass.h" //----------------------------------------------------------------------------- // Desc: 캯 //----------------------------------------------------------------------------- TerrainClass::TerrainClass(IDirect3DDevice9* pd3dDevice) { //Աֵ m_pd3dDevice = pd3dDevice; m_pTexture = NULL; m_pIndexBuffer = NULL; m_pVertexBuffer = NULL; m_nCellsPerRow = 0; m_nCellsPerCol = 0; m_nVertsPerRow = 0; m_nVertsPerCol = 0; m_nNumVertices = 0; m_fTerrainWidth = 0.0f; m_fTerrainDepth = 0.0f; m_fCellSpacing = 0.0f; m_fHeightScale = 0.0f; } //-------------------------------------------------------------------------------------- // Name: TerrainClass::LoadTerrainFromFile() // Desc: صθ߶ϢԼ //-------------------------------------------------------------------------------------- BOOL TerrainClass::LoadTerrainFromFile(wchar_t *pRawFileName, wchar_t *pTextureFile) { // ļжȡ߶Ϣ std::ifstream inFile; inFile.open(pRawFileName, std::ios::binary); //öƵķʽļ inFile.seekg(0,std::ios::end); //ļָƶļĩβ std::vector inData(inFile.tellg()); //ģ嶨һvector͵ıinDataʼֵΪǰλãС inFile.seekg(std::ios::beg); //ļָƶļĿͷ׼ȡ߶Ϣ inFile.read((char*)&inData[0], inData.size()); //ؼһȡ߶Ϣ inFile.close(); //Թرļ m_vHeightInfo.resize(inData.size()); //m_vHeightInfoߴȡΪijߴ //inDataеֵm_vHeightInfo for (unsigned int i=0; iCreateVertexBuffer(m_nNumVertices * sizeof(TERRAINVERTEX), D3DUSAGE_WRITEONLY, TERRAINVERTEX::FVF, D3DPOOL_MANAGED, &m_pVertexBuffer, 0))) return FALSE; //2 TERRAINVERTEX *pVertices = NULL; m_pVertexBuffer->Lock(0, 0, (void**)&pVertices, 0); //3ʣֵ FLOAT fStartX = -m_fTerrainWidth / 2.0f, fEndX = m_fTerrainWidth / 2.0f; //ָʼͽXֵ FLOAT fStartZ = m_fTerrainDepth / 2.0f, fEndZ = -m_fTerrainDepth / 2.0f; //ָʼͽZֵ FLOAT fCoordU = 10.0f / (FLOAT)m_nCellsPerRow; //ָĺֵ FLOAT fCoordV = 10.0f / (FLOAT)m_nCellsPerCol; //ֵָ int nIndex = 0, i = 0, j = 0; for (float z = fStartZ; z >=fEndZ; z -= m_fCellSpacing, i++) //Z귽ʼ㵽мı { j = 0; for (float x = fStartX; x <=fEndX; x += m_fCellSpacing, j++) //X귽ʼ㵽мı { nIndex = i * m_nCellsPerRow + j; //ָǰڶ㻺еλ pVertices[nIndex] = TERRAINVERTEX(x, m_vHeightInfo[nIndex], z, j*fCoordU, i*fCoordV); //Ѷλڸ߶ͼжӦĸԼ긳ֵǰĶ nIndex++; //Լ1 } } //4 m_pVertexBuffer->Unlock(); //--------------------------------------------------------------- // ε //--------------------------------------------------------------- //1. if (FAILED(m_pd3dDevice->CreateIndexBuffer(m_nNumVertices * 6 *sizeof(WORD), D3DUSAGE_WRITEONLY, D3DFMT_INDEX16, D3DPOOL_MANAGED, &m_pIndexBuffer, 0))) return FALSE; //2. WORD* pIndices = NULL; m_pIndexBuffer->Lock(0, 0, (void**)&pIndices, 0); //3.ʣֵ nIndex = 0; for(int row = 0; row < m_nCellsPerRow-1; row++) //ÿ { for(int col = 0; col < m_nCellsPerCol-1; col++) //ÿ { //ABC pIndices[nIndex] = row * m_nCellsPerRow + col; //A pIndices[nIndex+1] = row * m_nCellsPerRow + col + 1; //B pIndices[nIndex+2] = (row+1) * m_nCellsPerRow + col; //C //CBD pIndices[nIndex+3] = (row+1) * m_nCellsPerRow + col; //C pIndices[nIndex+4] = row * m_nCellsPerRow + col + 1; //B pIndices[nIndex+5] = (row+1) * m_nCellsPerRow + col + 1;//D //һԪ6 nIndex += 6; //Լ6 } } //4 m_pIndexBuffer->Unlock(); return TRUE; } //-------------------------------------------------------------------------------------- // Name: TerrainClass::RenderTerrain() // Desc: ƳΣͨڶѡǷƳ߿ //-------------------------------------------------------------------------------------- BOOL TerrainClass::RenderTerrain(D3DXMATRIX *pMatWorld, BOOL bRenderFrame) { m_pd3dDevice->SetStreamSource(0, m_pVertexBuffer, 0, sizeof(TERRAINVERTEX)); m_pd3dDevice->SetFVF(TERRAINVERTEX::FVF);//ָʹõʽĺ m_pd3dDevice->SetIndices(m_pIndexBuffer);// m_pd3dDevice->SetTexture(0, m_pTexture);// m_pd3dDevice->SetRenderState(D3DRS_LIGHTING, FALSE); //رչ m_pd3dDevice->SetTransform(D3DTS_WORLD, pMatWorld); // m_pd3dDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, m_nNumVertices, 0, m_nNumVertices * 2); //ƶ m_pd3dDevice->SetRenderState(D3DRS_LIGHTING, TRUE); //򿪹 m_pd3dDevice->SetTexture(0, 0); //ÿ //ǷȾ߿Ĵ if (bRenderFrame) //ҪȾ߿Ļ { m_pd3dDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME); //ģʽΪ߿ m_pd3dDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, m_nNumVertices, 0, m_nNumVertices * 2); //ƶ m_pd3dDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID); //ģʽʵ } return TRUE; } //----------------------------------------------------------------------------- // Desc: //----------------------------------------------------------------------------- TerrainClass::~TerrainClass(void) { SAFE_RELEASE(m_pTexture); SAFE_RELEASE(m_pIndexBuffer); SAFE_RELEASE(m_pVertexBuffer); } ================================================ FILE: Direct3D-Game-Demo/D3Ddemo20/TerrainClass.h ================================================ //============================================================================= // Name: TerrainClass.h // Des: һװάϵͳͷļ // 2013 317 Create by dzī //============================================================================= #pragma once #include #include #include #include #include "D3DUtil.h" class TerrainClass { private: LPDIRECT3DDEVICE9 m_pd3dDevice; //D3D豸 LPDIRECT3DTEXTURE9 m_pTexture; // LPDIRECT3DINDEXBUFFER9 m_pIndexBuffer; //㻺 LPDIRECT3DVERTEXBUFFER9 m_pVertexBuffer; // int m_nCellsPerRow; // ÿеĵԪ int m_nCellsPerCol; // ÿеĵԪ int m_nVertsPerRow; // ÿеĶ int m_nVertsPerCol; // ÿеĶ int m_nNumVertices; // FLOAT m_fTerrainWidth; // εĿ FLOAT m_fTerrainDepth; // ε FLOAT m_fCellSpacing; // Ԫļ FLOAT m_fHeightScale; // ߶ϵ std::vector m_vHeightInfo; // ڴŸ߶Ϣ //һεFVFʽ struct TERRAINVERTEX { FLOAT _x, _y, _z; FLOAT _u, _v; TERRAINVERTEX(FLOAT x, FLOAT y, FLOAT z, FLOAT u, FLOAT v) :_x(x), _y(y), _z(z), _u(u), _v(v) {} static const DWORD FVF = D3DFVF_XYZ | D3DFVF_TEX1; }; public: TerrainClass(IDirect3DDevice9 *pd3dDevice); //캯 virtual ~TerrainClass(void); // public: BOOL LoadTerrainFromFile(wchar_t *pRawFileName, wchar_t *pTextureFile); //ļظ߶ͼĺ BOOL InitTerrain(INT nRows, INT nCols, FLOAT fSpace, FLOAT fScale); //γʼ BOOL RenderTerrain(D3DXMATRIX *pMatWorld, BOOL bDrawFrame=FALSE); //Ⱦ }; ================================================ FILE: Direct3D-Game-Demo/D3Ddemo20/XFileModelClass.cpp ================================================ //============================================================================= // Name: XFileModelClass.h // Des: һװXļȾܵԴļ // 2013 47 Create by dzī //============================================================================= #include #include #include "XFileModelClass.h" //----------------------------------------------------------------------------- // Desc: 캯 //----------------------------------------------------------------------------- XFileModelClass::XFileModelClass(IDirect3DDevice9* pd3dDevice) { //Աֵ m_pd3dDevice = pd3dDevice; } //-------------------------------------------------------------------------------------- // Name: XFileModelClass::LoadModelFromXFile() // Desc: .Xļȡάģ͵ڴ //-------------------------------------------------------------------------------------- HRESULT XFileModelClass::LoadModelFromXFile( WCHAR* strFilename ) { LPD3DXBUFFER pAdjacencyBuffer = NULL; //ģڽϢ LPD3DXBUFFER pD3DXMtrlBuffer = NULL; //洢ģͲʵĻ //Ӵļģ D3DXLoadMeshFromX( strFilename, D3DXMESH_MANAGED, m_pd3dDevice, &pAdjacencyBuffer, &pD3DXMtrlBuffer, NULL, &m_dwNumMaterials, &m_pMesh ); // ȡʺ D3DXMATERIAL* d3dxMaterials = (D3DXMATERIAL*)pD3DXMtrlBuffer->GetBufferPointer(); m_pMaterials = new D3DMATERIAL9[m_dwNumMaterials]; m_pTextures = new LPDIRECT3DTEXTURE9[m_dwNumMaterials]; //ӼȡԺļ for( DWORD i=0; i 0 ) { // if( FAILED( D3DXCreateTextureFromFileA( m_pd3dDevice,d3dxMaterials[i].pTextureFilename, &m_pTextures[i] ) ) ) { MessageBox(NULL, L"SORRY~!ûҵļ!", L"XFileModelClassȡļ", MB_OK); } } } //Żģ m_pMesh->OptimizeInplace( D3DXMESHOPT_COMPACT | D3DXMESHOPT_ATTRSORT | D3DXMESHOPT_STRIPREORDER, (DWORD*)pAdjacencyBuffer->GetBufferPointer(), NULL, NULL, NULL ); return S_OK; } //-------------------------------------------------------------------------------------- // Name: XFileModelClass::RenderModel() // Desc: Ⱦάģ //-------------------------------------------------------------------------------------- HRESULT XFileModelClass::RenderModel( ) { for( DWORD i=0; iSetMaterial( &m_pMaterials[i] ); m_pd3dDevice->SetTexture( 0, m_pTextures[i] ); m_pMesh->DrawSubset( i ); } return S_OK; } //----------------------------------------------------------------------------- // Desc: //----------------------------------------------------------------------------- XFileModelClass::~XFileModelClass(void) { //ͷģͲ SAFE_DELETE_ARRAY(m_pMaterials); //ͷģ if( m_pTextures ) { for( DWORD i = 0; i < m_dwNumMaterials; i++ ) { SAFE_RELEASE(m_pTextures[i]); } SAFE_DELETE_ARRAY(m_pTextures); } //ͷģͶ SAFE_RELEASE(m_pMesh); } ================================================ FILE: Direct3D-Game-Demo/D3Ddemo20/XFileModelClass.h ================================================ //============================================================================= // Name: XFileModelClass.h // Des: һװXļȾܵͷļ // 2013 47 Create by dzī //============================================================================= #pragma once #include "D3DUtil.h" class XFileModelClass { private: LPDIRECT3DDEVICE9 m_pd3dDevice; //D3D豸 LPD3DXMESH m_pMesh; //ģͶ DWORD m_dwNumMaterials; //ʵ D3DMATERIAL9* m_pMaterials; //ģͲʽṹʵ LPDIRECT3DTEXTURE9 * m_pTextures; //ģṹʵ public: XFileModelClass(IDirect3DDevice9 *pd3dDevice); //캯 ~XFileModelClass(void); // public: HRESULT LoadModelFromXFile(WCHAR* strFilename ); //.Xļȡάģ͵ڴ HRESULT RenderModel( ); //Ⱦάģ }; ================================================ FILE: Direct3D-Game-Demo/D3Ddemo3/D3Ddemo3.cpp ================================================ //-----------------------------------˵---------------------------------------------- // :D3Ddemo3 // 20134 Create by dzī // Direct3D㻺Ϯ ʾ //------------------------------------------------------------------------------------------------ //-----------------------------------ͷļ֡--------------------------------------- // ͷļ //------------------------------------------------------------------------------------------------ #include #include #include //-----------------------------------ļ֡--------------------------------------- // Ŀļ //------------------------------------------------------------------------------------------------ #pragma comment(lib,"winmm.lib") //PlaySoundļ #pragma comment(lib,"d3d9.lib") #pragma comment(lib,"d3dx9.lib") //-----------------------------------궨岿֡-------------------------------------------- // һЩ //------------------------------------------------------------------------------------------------ #define WINDOW_WIDTH 800 //Ϊڿȶĺ꣬Էڴ˴޸Ĵڿ #define WINDOW_HEIGHT 600 //Ϊڸ߶ȶĺ꣬Էڴ˴޸Ĵڸ߶ #define WINDOW_TITLE L"ϨϷ롿Direct3D㻺Ϯ ʾ" //Ϊڱⶨĺ #define SAFE_RELEASE(p) { if(p) { (p)->Release(); (p)=NULL; } } //һȫͷź꣬ںCOMӿָͷ //------------------------------------------------------------------------------------------------ // 㻺ʹIJ֮һƶʽ //------------------------------------------------------------------------------------------------ struct CUSTOMVERTEX { FLOAT x, y, z, rhw; DWORD color; }; #define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE) //FVFʽ //-----------------------------------ȫֱ֡------------------------------------- // ȫֱ //------------------------------------------------------------------------------------------------ LPDIRECT3DDEVICE9 g_pd3dDevice = NULL; //Direct3D豸 ID3DXFont* g_pFont=NULL; //COMӿ float g_FPS = 0.0f; //һ͵ı֡ wchar_t g_strFPS[50]; //֡ʵַ LPDIRECT3DVERTEXBUFFER9 g_pVertexBuffer = NULL; //㻺 //-----------------------------------ȫֺ֡------------------------------------- // ȫֺֹδıʶϵд //------------------------------------------------------------------------------------------------ LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam );//ڹ̺ HRESULT Direct3D_Init(HWND hwnd); //нDirect3Dijʼ HRESULT Objects_Init(HWND hwnd); //нҪƵԴʼ VOID Direct3D_Render(HWND hwnd); //нDirect3DȾд VOID Direct3D_CleanUp( ); //COMԴԼԴ float Get_FPS(); //-----------------------------------WinMain( )-------------------------------------- // WindowsӦóںǵij↑ʼ //------------------------------------------------------------------------------------------------ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nShowCmd) { //1ڴIJ֮һʼһĴ 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; //ָڹ̵ijʵ 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ڴIJ֮עᴰ if( !RegisterClassEx( &wndClass ) ) //괰ںҪԴעᣬܴ͵Ĵ return -1; //3ڴIJ֮ʽ HWND hwnd = CreateWindow( L"ForTheDreamOfGameDevelop",WINDOW_TITLE, //ϲּĴںCreateWindow WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, WINDOW_WIDTH, WINDOW_HEIGHT, NULL, NULL, hInstance, NULL ); //Direct3DԴijʼʧmessageboxʾ if (!(S_OK==Direct3D_Init (hwnd))) { MessageBox(hwnd, _T("Direct3Dʼʧ~"), _T("dzīϢ"), 0); //ʹMessageBoxһϢ } //4ڴIJ֮ģڵƶʾ MoveWindow(hwnd,250,80,WINDOW_WIDTH,WINDOW_HEIGHT,true); //ʾʱλãʹϽλڣ250,80 ShowWindow( hwnd, nShowCmd ); //ShowWindowʾ UpdateWindow(hwnd); //Դڽи£·Ҫװһ 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_Render(hwnd); //Ⱦ } } //6ע UnregisterClass(L"ForTheDreamOfGameDevelop", wndClass.hInstance); //׼ע return 0; } //-----------------------------------WndProc( )-------------------------------------- // ڹ̺WndProc,ԴϢд //------------------------------------------------------------------------------------------------ LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ) { switch( message ) //switch俪ʼ { case WM_PAINT: // ǿͻػϢ Direct3D_Render(hwnd); //Direct3DȾ ValidateRect(hwnd, NULL); // ¿ͻʾ break; //switch case WM_KEYDOWN: // Ǽ̰Ϣ if (wParam == VK_ESCAPE) // µļESC DestroyWindow(hwnd); // ٴ, һWM_DESTROYϢ break; //switch case WM_DESTROY: //ǴϢ Direct3D_CleanUp(); //ԶԴGame_CleanUp˳ǰԴ PostQuitMessage( 0 ); //ϵͳиֹ߳ӦWM_DESTROYϢ break; //switch default: //caseϣִиdefault return DefWindowProc( hwnd, message, wParam, lParam ); //ȱʡĴڹ } return 0; //˳ } //-----------------------------------Direct3D_Init( )-------------------------------------- // Direct3DʼDirect3Dijʼ //------------------------------------------------------------------------------------------------ HRESULT Direct3D_Init(HWND hwnd) { //-------------------------------------------------------------------------------------- // Direct3DʼIJ֮һӿڡDirect3Dӿڶ, ԱøDirect3D󴴽Direct3D豸 //-------------------------------------------------------------------------------------- LPDIRECT3D9 pD3D = NULL; //Direct3DӿڶĴ if( NULL == ( pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) ) //ʼDirect3Dӿڶ󣬲DirectX汾Э return E_FAIL; //-------------------------------------------------------------------------------------- // Direct3DʼIJ֮,ȡϢȡӲ豸Ϣ //-------------------------------------------------------------------------------------- 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ʼIJ֮ݡD3DPRESENT_PARAMETERSṹ //-------------------------------------------------------------------------------------- D3DPRESENT_PARAMETERS d3dpp; ZeroMemory(&d3dpp, sizeof(d3dpp)); d3dpp.BackBufferWidth = WINDOW_WIDTH; d3dpp.BackBufferHeight = WINDOW_HEIGHT; d3dpp.BackBufferFormat = D3DFMT_A8R8G8B8; d3dpp.BackBufferCount = 1; d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE; d3dpp.MultiSampleQuality = 0; d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; d3dpp.hDeviceWindow = hwnd; d3dpp.Windowed = true; d3dpp.EnableAutoDepthStencil = true; d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8; d3dpp.Flags = 0; d3dpp.FullScreen_RefreshRateInHz = 0; d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; //-------------------------------------------------------------------------------------- // Direct3DʼIJ֮ģ豸Direct3D豸ӿ //-------------------------------------------------------------------------------------- if(FAILED(pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, vp, &d3dpp, &g_pd3dDevice))) return E_FAIL; SAFE_RELEASE(pD3D) //LPDIRECT3D9ӿڶʹɣǽͷŵ if(!(S_OK==Objects_Init(hwnd))) return E_FAIL; //һObjects_InitȾԴijʼ return S_OK; } //-----------------------------------Object_Init( )-------------------------------------- // ȾԴʼڴ˺нҪȾԴijʼ //-------------------------------------------------------------------------------------------------- HRESULT Objects_Init(HWND hwnd) { // if(FAILED(D3DXCreateFont(g_pd3dDevice, 36, 0, 0, 1, false, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, DEFAULT_QUALITY, 0, _T("΢ź"), &g_pFont))) return E_FAIL; srand(timeGetTime()); //ϵͳʱʼ //-------------------------------------------------------------------------------------- // 㻺ʹIJ֮㻺 //-------------------------------------------------------------------------------------- //㻺 if( FAILED( g_pd3dDevice->CreateVertexBuffer( 6*sizeof(CUSTOMVERTEX), 0, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &g_pVertexBuffer, NULL ) ) ) { return E_FAIL; } //-------------------------------------------------------------------------------------- // 㻺ʹIJ֮ʶ㻺 //-------------------------------------------------------------------------------------- //ݵã CUSTOMVERTEX vertices[] = { //randɫλ { 300.0f, 100.0f, 0.0f, 1.0f, D3DCOLOR_XRGB(rand() % 256, rand() % 256, rand() % 256), }, { 500.0f, 100.0f, 0.0f, 1.0f, D3DCOLOR_XRGB(rand() % 256, rand() % 256, rand() % 256), }, { 300.0f, 300.0f, 0.0f, 1.0f, D3DCOLOR_XRGB(rand() % 256, rand() % 256, rand() % 256), }, { 300.0f, 300.0f, 0.0f, 1.0f, D3DCOLOR_XRGB(rand() % 256, rand() % 256, rand() % 256), }, { (float)(800.0*rand()/(RAND_MAX+1.0)) , (float)(600.0*rand()/(RAND_MAX+1.0)) , 0.0f, 1.0f, D3DCOLOR_XRGB(rand() % 256, rand() % 256, rand() % 256), }, { (float)(800.0*rand()/(RAND_MAX+1.0)) , (float)(600.0*rand()/(RAND_MAX+1.0)) , 0.0f, 1.0f, D3DCOLOR_XRGB(rand() % 256, rand() % 256, rand() % 256), } }; //䶥㻺 VOID* pVertices; if( FAILED( g_pVertexBuffer->Lock( 0, sizeof(vertices), (void**)&pVertices, 0 ) ) ) return E_FAIL; memcpy( pVertices, vertices, sizeof(vertices) ); g_pVertexBuffer->Unlock(); g_pd3dDevice->SetRenderState(D3DRS_CULLMODE, false); //صǷ˳ʱ룬Ǹζʾ return S_OK; } //-----------------------------------Direct3D_Render( )------------------------------- // ʹDirect3DȾ //-------------------------------------------------------------------------------------------------- void Direct3D_Render(HWND hwnd) { //-------------------------------------------------------------------------------------- // Direct3DȾ岽֮һ //-------------------------------------------------------------------------------------- g_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0); //һΣڻȡھ RECT formatRect; GetClientRect(hwnd, &formatRect); //-------------------------------------------------------------------------------------- // Direct3DȾ岽֮ʼ //-------------------------------------------------------------------------------------- g_pd3dDevice->BeginScene(); // ʼ //-------------------------------------------------------------------------------------- // Direct3DȾ岽֮ʽ //-------------------------------------------------------------------------------------- g_pd3dDevice->SetRenderState(D3DRS_SHADEMODE,D3DSHADE_GOURAUD);//Ⱦ״̬ //------------------------------------------------------------ // 㻺ʹIJ֮ġͼ //------------------------------------------------------------ g_pd3dDevice->SetStreamSource( 0, g_pVertexBuffer, 0, sizeof(CUSTOMVERTEX) ); g_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX ); g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, 2 ); //ڴϽǴʾÿ֡ int charCount = swprintf_s(g_strFPS, 20, _T("FPS:%0.3f"), Get_FPS() ); g_pFont->DrawText(NULL, g_strFPS, charCount , &formatRect, DT_TOP | DT_RIGHT, D3DCOLOR_XRGB(255,39,136)); //-------------------------------------------------------------------------------------- // 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( )-------------------------------- // Դڴ˺нг˳ǰԴ //--------------------------------------------------------------------------------------------------- void Direct3D_CleanUp() { //ͷCOMӿڶ SAFE_RELEASE(g_pVertexBuffer) SAFE_RELEASE(g_pFont) SAFE_RELEASE(g_pd3dDevice) } ================================================ FILE: Direct3D-Game-Demo/D3Ddemo4/D3Ddemo4.cpp ================================================ //-----------------------------------˵---------------------------------------------- // :D3Ddemo4 // 20134 Create by dzī // Direct3DĹ ʾ //------------------------------------------------------------------------------------------------ //-----------------------------------ͷļ֡--------------------------------------- // ͷļ //------------------------------------------------------------------------------------------------ #include #include #include //-----------------------------------ļ֡--------------------------------------- // Ŀļ //------------------------------------------------------------------------------------------------ #pragma comment(lib,"winmm.lib") //PlaySoundļ #pragma comment(lib,"d3d9.lib") #pragma comment(lib,"d3dx9.lib") //-----------------------------------궨岿֡-------------------------------------------- // һЩ //------------------------------------------------------------------------------------------------ #define WINDOW_WIDTH 800 //Ϊڿȶĺ꣬Էڴ˴޸Ĵڿ #define WINDOW_HEIGHT 600 //Ϊڸ߶ȶĺ꣬Էڴ˴޸Ĵڸ߶ #define WINDOW_TITLE L"ϨϷ롿Direct3DĹ ʾ" //Ϊڱⶨĺ #define SAFE_RELEASE(p) { if(p) { (p)->Release(); (p)=NULL; } } //һȫͷź꣬ںCOMӿָͷ //------------------------------------------------------------------------------------------------ // 㻺ʹIJ֮һƶʽ //------------------------------------------------------------------------------------------------ struct CUSTOMVERTEX { FLOAT x, y, z, rhw; DWORD color; }; #define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE) //FVFʽ //-----------------------------------ȫֱ֡------------------------------------- // ȫֱ //------------------------------------------------------------------------------------------------ LPDIRECT3DDEVICE9 g_pd3dDevice = NULL; //Direct3D豸 ID3DXFont* g_pFont=NULL; //COMӿ float g_FPS = 0.0f; //һ͵ı֡ wchar_t g_strFPS[50]; //֡ʵַ LPDIRECT3DVERTEXBUFFER9 g_pVertexBuffer = NULL; //㻺 LPDIRECT3DINDEXBUFFER9 g_pIndexBuffer = NULL; // //-----------------------------------ȫֺ֡------------------------------------- // ȫֺֹδıʶϵд //------------------------------------------------------------------------------------------------ LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam );//ڹ̺ HRESULT Direct3D_Init(HWND hwnd); //нDirect3Dijʼ HRESULT Objects_Init(HWND hwnd); //нҪƵԴʼ VOID Direct3D_Render(HWND hwnd); //нDirect3DȾд VOID Direct3D_CleanUp( ); //COMԴԼԴ float Get_FPS(); //֡ĺ //-----------------------------------WinMain( )-------------------------------------- // WindowsӦóںǵij↑ʼ //------------------------------------------------------------------------------------------------ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nShowCmd) { //1ڴIJ֮һʼһĴ 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; //ָڹ̵ijʵ 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ڴIJ֮עᴰ if( !RegisterClassEx( &wndClass ) ) //괰ںҪԴעᣬܴ͵Ĵ return -1; //3ڴIJ֮ʽ HWND hwnd = CreateWindow( L"ForTheDreamOfGameDevelop",WINDOW_TITLE, //ϲּĴںCreateWindow WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, WINDOW_WIDTH, WINDOW_HEIGHT, NULL, NULL, hInstance, NULL ); //Direct3DԴijʼʧmessageboxʾ if (!(S_OK==Direct3D_Init (hwnd))) { MessageBox(hwnd, _T("Direct3Dʼʧ~"), _T("dzīϢ"), 0); //ʹMessageBoxһϢ } //4ڴIJ֮ģڵƶʾ MoveWindow(hwnd,250,80,WINDOW_WIDTH,WINDOW_HEIGHT,true); //ʾʱλãʹϽλڣ250,80 ShowWindow( hwnd, nShowCmd ); //ShowWindowʾ UpdateWindow(hwnd); //Դڽи£·Ҫװһ 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_Render(hwnd); //Ⱦ } } //6ע UnregisterClass(L"ForTheDreamOfGameDevelop", wndClass.hInstance); //׼ע return 0; } //-----------------------------------WndProc( )-------------------------------------- // ڹ̺WndProc,ԴϢд //------------------------------------------------------------------------------------------------ LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ) { switch( message ) //switch俪ʼ { case WM_PAINT: // ǿͻػϢ Direct3D_Render(hwnd); //Direct3DȾ ValidateRect(hwnd, NULL); // ¿ͻʾ break; //switch case WM_KEYDOWN: // Ǽ̰Ϣ if (wParam == VK_ESCAPE) // µļESC DestroyWindow(hwnd); // ٴ, һWM_DESTROYϢ break; //switch case WM_DESTROY: //ǴϢ Direct3D_CleanUp(); //ԶԴGame_CleanUp˳ǰԴ PostQuitMessage( 0 ); //ϵͳиֹ߳ӦWM_DESTROYϢ break; //switch default: //caseϣִиdefault return DefWindowProc( hwnd, message, wParam, lParam ); //ȱʡĴڹ } return 0; //˳ } //-----------------------------------Direct3D_Init( )-------------------------------------- // Direct3DʼDirect3Dijʼ //------------------------------------------------------------------------------------------------ HRESULT Direct3D_Init(HWND hwnd) { //-------------------------------------------------------------------------------------- // Direct3DʼIJ֮һӿڡDirect3Dӿڶ, ԱøDirect3D󴴽Direct3D豸 //-------------------------------------------------------------------------------------- LPDIRECT3D9 pD3D = NULL; //Direct3DӿڶĴ if( NULL == ( pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) ) //ʼDirect3Dӿڶ󣬲DirectX汾Э return E_FAIL; //-------------------------------------------------------------------------------------- // Direct3DʼIJ֮,ȡϢȡӲ豸Ϣ //-------------------------------------------------------------------------------------- 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ʼIJ֮ݡD3DPRESENT_PARAMETERSṹ //-------------------------------------------------------------------------------------- D3DPRESENT_PARAMETERS d3dpp; ZeroMemory(&d3dpp, sizeof(d3dpp)); d3dpp.BackBufferWidth = WINDOW_WIDTH; d3dpp.BackBufferHeight = WINDOW_HEIGHT; d3dpp.BackBufferFormat = D3DFMT_A8R8G8B8; d3dpp.BackBufferCount = 1; d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE; d3dpp.MultiSampleQuality = 0; d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; d3dpp.hDeviceWindow = hwnd; d3dpp.Windowed = true; d3dpp.EnableAutoDepthStencil = true; d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8; d3dpp.Flags = 0; d3dpp.FullScreen_RefreshRateInHz = 0; d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; //-------------------------------------------------------------------------------------- // Direct3DʼIJ֮ģ豸Direct3D豸ӿ //-------------------------------------------------------------------------------------- if(FAILED(pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, vp, &d3dpp, &g_pd3dDevice))) return E_FAIL; SAFE_RELEASE(pD3D) //LPDIRECT3D9ӿڶʹɣǽͷŵ if(!(S_OK==Objects_Init(hwnd))) return E_FAIL; //һObjects_InitȾԴijʼ return S_OK; } //-----------------------------------Object_Init( )-------------------------------------- // ȾԴʼڴ˺нҪȾԴijʼ //-------------------------------------------------------------------------------------------------- HRESULT Objects_Init(HWND hwnd) { // if(FAILED(D3DXCreateFont(g_pd3dDevice, 36, 0, 0, 1, false, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, DEFAULT_QUALITY, 0, _T("΢ź"), &g_pFont))) return E_FAIL; srand(timeGetTime()); //ϵͳʱʼ //-------------------------------------------------------------------------------------- // 㻺桢ͼIJ֮㻺 //-------------------------------------------------------------------------------------- //㻺 if( FAILED( g_pd3dDevice->CreateVertexBuffer( 18*sizeof(CUSTOMVERTEX), 0, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &g_pVertexBuffer, NULL ) ) ) { return E_FAIL; } // if( FAILED( g_pd3dDevice->CreateIndexBuffer(48 * sizeof(WORD), 0, D3DFMT_INDEX16, D3DPOOL_DEFAULT, &g_pIndexBuffer, NULL)) ) { return E_FAIL; } //-------------------------------------------------------------------------------------- // 㻺桢ͼIJ֮ʶ㻺 //-------------------------------------------------------------------------------------- //ݵã CUSTOMVERTEX Vertices[17]; Vertices[0].x = 400; Vertices[0].y = 300; Vertices[0].z = 0.0f; Vertices[0].rhw = 1.0f; Vertices[0].color = D3DCOLOR_XRGB(rand() % 256, rand() % 256, rand() % 256); for(int i=0; i<16; i++) { Vertices[i+1].x = (float)(250*sin(i*3.14159/8.0)) + 400; Vertices[i+1].y = -(float)(250*cos(i*3.14159/8.0)) + 300; Vertices[i+1].z = 0.0f; Vertices[i+1].rhw = 1.0f; Vertices[i+1].color = D3DCOLOR_XRGB(rand() % 256, rand() % 256, rand() % 256); } //䶥㻺 VOID* pVertices; if( FAILED( g_pVertexBuffer->Lock( 0, sizeof(Vertices), (void**)&pVertices, 0 ) ) ) return E_FAIL; memcpy( pVertices, Vertices, sizeof(Vertices) ); g_pVertexBuffer->Unlock(); // WORD Indices[] ={ 0,1,2, 0,2,3, 0,3,4, 0,4,5, 0,5,6, 0,6,7, 0,7,8, 0,8,9, 0,9,10, 0,10,11 ,0,11,12, 0,12,13 ,0,13,14 ,0,14,15 ,0,15,16, 0, 16,1 }; // WORD *pIndices = NULL; g_pIndexBuffer->Lock(0, 0, (void**)&pIndices, 0); memcpy( pIndices, Indices, sizeof(Indices) ); g_pIndexBuffer->Unlock(); return S_OK; } //-----------------------------------Direct3D_Render( )------------------------------- // ʹDirect3DȾ //-------------------------------------------------------------------------------------------------- void Direct3D_Render(HWND hwnd) { //-------------------------------------------------------------------------------------- // Direct3DȾ岽֮һ //-------------------------------------------------------------------------------------- g_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0); //һΣڻȡھ RECT formatRect; GetClientRect(hwnd, &formatRect); //-------------------------------------------------------------------------------------- // Direct3DȾ岽֮ʼ //-------------------------------------------------------------------------------------- g_pd3dDevice->BeginScene(); // ʼ //-------------------------------------------------------------------------------------- // Direct3DȾ岽֮ʽ //-------------------------------------------------------------------------------------- // Ⱦ״̬ g_pd3dDevice->SetRenderState(D3DRS_SHADEMODE,D3DSHADE_GOURAUD);//ʡԣΪɫģʽΪD3DĬϵɫģʽ //------------------------------------------------------------------- // 㻺桢ͼIJ֮ġͼ //-------------------------------------------------------------------- g_pd3dDevice->SetStreamSource( 0, g_pVertexBuffer, 0, sizeof(CUSTOMVERTEX) );//ѰļϢĶ㻺Ⱦˮ g_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX );//ָʹõʽĺ g_pd3dDevice->SetIndices(g_pIndexBuffer);// g_pd3dDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, 17, 0, 16);//϶㻺ͼ //ڴϽǴʾÿ֡ int charCount = swprintf_s(g_strFPS, 20, _T("FPS:%0.3f"), Get_FPS() ); g_pFont->DrawText(NULL, g_strFPS, charCount , &formatRect, DT_TOP | DT_RIGHT, D3DCOLOR_XRGB(255,39,136)); //-------------------------------------------------------------------------------------- // 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( )-------------------------------- // Դڴ˺нг˳ǰԴ //--------------------------------------------------------------------------------------------------- void Direct3D_CleanUp() { //ͷCOMӿڶ SAFE_RELEASE(g_pIndexBuffer) SAFE_RELEASE(g_pVertexBuffer) SAFE_RELEASE(g_pFont) SAFE_RELEASE(g_pd3dDevice) } ================================================ FILE: Direct3D-Game-Demo/D3Ddemo5/D3Ddemo5.cpp ================================================ //-----------------------------------˵---------------------------------------------- // :D3Ddemo5 // 20134 Create by dzī // ά磺Direct3DĴ任 ʾ //------------------------------------------------------------------------------------------------ //-----------------------------------ͷļ֡--------------------------------------- // ͷļ //------------------------------------------------------------------------------------------------ #include #include #include //-----------------------------------ļ֡--------------------------------------- // Ŀļ //------------------------------------------------------------------------------------------------ #pragma comment(lib,"winmm.lib") //PlaySoundļ #pragma comment(lib,"d3d9.lib") #pragma comment(lib,"d3dx9.lib") //-----------------------------------궨岿֡-------------------------------------------- // һЩ //------------------------------------------------------------------------------------------------ #define WINDOW_WIDTH 800 //Ϊڿȶĺ꣬Էڴ˴޸Ĵڿ #define WINDOW_HEIGHT 600 //Ϊڸ߶ȶĺ꣬Էڴ˴޸Ĵڸ߶ #define WINDOW_TITLE L"ϨϷ롿ά磺Direct3DĴ任 ʾ" //Ϊڱⶨĺ #define SAFE_RELEASE(p) { if(p) { (p)->Release(); (p)=NULL; } } //һȫͷź꣬ںCOMӿָͷ //------------------------------------------------------------------------------------------------ // 㻺ʹIJ֮һƶʽ //------------------------------------------------------------------------------------------------ struct CUSTOMVERTEX { FLOAT x, y, z; DWORD color; }; #define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE) //FVFʽ //-----------------------------------ȫֱ֡------------------------------------- // ȫֱ //------------------------------------------------------------------------------------------------ LPDIRECT3DDEVICE9 g_pd3dDevice = NULL; //Direct3D豸 ID3DXFont* g_pFont=NULL; //COMӿ float g_FPS = 0.0f; //һ͵ı֡ wchar_t g_strFPS[50]; //֡ʵַ LPDIRECT3DVERTEXBUFFER9 g_pVertexBuffer = NULL; //㻺 LPDIRECT3DINDEXBUFFER9 g_pIndexBuffer = NULL; // //-----------------------------------ȫֺ֡------------------------------------- // ȫֺֹδıʶϵд //------------------------------------------------------------------------------------------------ LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam );//ڹ̺ HRESULT Direct3D_Init(HWND hwnd); //нDirect3Dijʼ HRESULT Objects_Init(HWND hwnd); //нҪƵԴʼ VOID Direct3D_Render(HWND hwnd); //нDirect3DȾд VOID Direct3D_CleanUp( ); //COMԴԼԴ float Get_FPS(); //֡ĺ VOID Matrix_Set(); //װĴ任ĺ //-----------------------------------WinMain( )-------------------------------------- // WindowsӦóںǵij↑ʼ //------------------------------------------------------------------------------------------------ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nShowCmd) { //1ڴIJ֮һʼһĴ 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; //ָڹ̵ijʵ 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ڴIJ֮עᴰ if( !RegisterClassEx( &wndClass ) ) //괰ںҪԴעᣬܴ͵Ĵ return -1; //3ڴIJ֮ʽ HWND hwnd = CreateWindow( L"ForTheDreamOfGameDevelop",WINDOW_TITLE, //ϲּĴںCreateWindow WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, WINDOW_WIDTH, WINDOW_HEIGHT, NULL, NULL, hInstance, NULL ); //Direct3DԴijʼʧmessageboxʾ if (!(S_OK==Direct3D_Init (hwnd))) { MessageBox(hwnd, _T("Direct3Dʼʧ~"), _T("dzīϢ"), 0); //ʹMessageBoxһϢ } //4ڴIJ֮ģڵƶʾ MoveWindow(hwnd,250,80,WINDOW_WIDTH,WINDOW_HEIGHT,true); //ʾʱλãʹϽλڣ250,80 ShowWindow( hwnd, nShowCmd ); //ShowWindowʾ UpdateWindow(hwnd); //Դڽи£·Ҫװһ PlaySound(L"hĤ.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_Render(hwnd); //Ⱦ } } //6ע UnregisterClass(L"ForTheDreamOfGameDevelop", wndClass.hInstance); //׼ע return 0; } //-----------------------------------WndProc( )-------------------------------------- // ڹ̺WndProc,ԴϢд //------------------------------------------------------------------------------------------------ LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ) { switch( message ) //switch俪ʼ { case WM_PAINT: // ǿͻػϢ Direct3D_Render(hwnd); //Direct3DȾ ValidateRect(hwnd, NULL); // ¿ͻʾ break; //switch case WM_KEYDOWN: // Ǽ̰Ϣ if (wParam == VK_ESCAPE) // µļESC DestroyWindow(hwnd); // ٴ, һWM_DESTROYϢ break; //switch case WM_DESTROY: //ǴϢ Direct3D_CleanUp(); //ԶԴGame_CleanUp˳ǰԴ PostQuitMessage( 0 ); //ϵͳиֹ߳ӦWM_DESTROYϢ break; //switch default: //caseϣִиdefault return DefWindowProc( hwnd, message, wParam, lParam ); //ȱʡĴڹ } return 0; //˳ } //-----------------------------------Direct3D_Init( )-------------------------------------- // Direct3DʼDirect3Dijʼ //------------------------------------------------------------------------------------------------ HRESULT Direct3D_Init(HWND hwnd) { //-------------------------------------------------------------------------------------- // Direct3DʼIJ֮һӿڡDirect3Dӿڶ, ԱøDirect3D󴴽Direct3D豸 //-------------------------------------------------------------------------------------- LPDIRECT3D9 pD3D = NULL; //Direct3DӿڶĴ if( NULL == ( pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) ) //ʼDirect3Dӿڶ󣬲DirectX汾Э return E_FAIL; //-------------------------------------------------------------------------------------- // Direct3DʼIJ֮,ȡϢȡӲ豸Ϣ //-------------------------------------------------------------------------------------- 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ʼIJ֮ݡD3DPRESENT_PARAMETERSṹ //-------------------------------------------------------------------------------------- D3DPRESENT_PARAMETERS d3dpp; ZeroMemory(&d3dpp, sizeof(d3dpp)); d3dpp.BackBufferWidth = WINDOW_WIDTH; d3dpp.BackBufferHeight = WINDOW_HEIGHT; d3dpp.BackBufferFormat = D3DFMT_A8R8G8B8; d3dpp.BackBufferCount = 1; d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE; d3dpp.MultiSampleQuality = 0; d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; d3dpp.hDeviceWindow = hwnd; d3dpp.Windowed = true; d3dpp.EnableAutoDepthStencil = true; d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8; d3dpp.Flags = 0; d3dpp.FullScreen_RefreshRateInHz = 0; d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; //-------------------------------------------------------------------------------------- // Direct3DʼIJ֮ģ豸Direct3D豸ӿ //-------------------------------------------------------------------------------------- if(FAILED(pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, vp, &d3dpp, &g_pd3dDevice))) return E_FAIL; SAFE_RELEASE(pD3D) //LPDIRECT3D9ӿڶʹɣǽͷŵ if(!(S_OK==Objects_Init(hwnd))) return E_FAIL; //һObjects_InitȾԴijʼ // Ⱦ״̬ g_pd3dDevice->SetRenderState(D3DRS_LIGHTING, FALSE); //رչ g_pd3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW); // return S_OK; } //-----------------------------------Object_Init( )-------------------------------------- // ȾԴʼڴ˺нҪȾԴijʼ //-------------------------------------------------------------------------------------------------- HRESULT Objects_Init(HWND hwnd) { // if(FAILED(D3DXCreateFont(g_pd3dDevice, 36, 0, 0, 1, false, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, DEFAULT_QUALITY, 0, _T("΢ź"), &g_pFont))) return E_FAIL; srand(timeGetTime()); //ϵͳʱʼ //-------------------------------------------------------------------------------------- // 㻺桢ͼIJ֮㻺 //-------------------------------------------------------------------------------------- //㻺 if( FAILED( g_pd3dDevice->CreateVertexBuffer( 8*sizeof(CUSTOMVERTEX), 0, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &g_pVertexBuffer, NULL ) ) ) { return E_FAIL; } // if( FAILED( g_pd3dDevice->CreateIndexBuffer(36* sizeof(WORD), 0, D3DFMT_INDEX16, D3DPOOL_DEFAULT, &g_pIndexBuffer, NULL)) ) { return E_FAIL; } //-------------------------------------------------------------------------------------- // 㻺桢ͼIJ֮ʶ㻺 //-------------------------------------------------------------------------------------- //ݵã CUSTOMVERTEX Vertices[] = { { -20.0f, 20.0f, -20.0f, D3DCOLOR_XRGB(rand() % 256, rand() % 256, rand() % 256) }, { -20.0f, 20.0f, 20.0f, D3DCOLOR_XRGB(rand() % 256, rand() % 256, rand() % 256) }, { 20.0f, 20.0f, 20.0f, D3DCOLOR_XRGB(rand() % 256, rand() % 256, rand() % 256) }, { 20.0f, 20.0f, -20.0f, D3DCOLOR_XRGB(rand() % 256, rand() % 256, rand() % 256) }, { -20.0f, -20.0f, -20.0f, D3DCOLOR_XRGB(rand() % 256, rand() % 256, rand() % 256) }, { -20.0f, -20.0f, 20.0f, D3DCOLOR_XRGB(rand() % 256, rand() % 256, rand() % 256) }, { 20.0f, -20.0f, 20.0f, D3DCOLOR_XRGB(rand() % 256, rand() % 256, rand() % 256) }, { 20.0f, -20.0f, -20.0f, D3DCOLOR_XRGB(rand() % 256, rand() % 256, rand() % 256) }, }; //䶥㻺 VOID* pVertices; if( FAILED( g_pVertexBuffer->Lock( 0, sizeof(Vertices), (void**)&pVertices, 0 ) ) ) return E_FAIL; memcpy( pVertices, Vertices, sizeof(Vertices) ); g_pVertexBuffer->Unlock(); // WORD *pIndices = NULL; g_pIndexBuffer->Lock(0, 0, (void**)&pIndices, 0); // pIndices[0] = 0, pIndices[1] = 1, pIndices[2] = 2; pIndices[3] = 0, pIndices[4] = 2, pIndices[5] = 3; // pIndices[6] = 0, pIndices[7] = 3, pIndices[8] = 7; pIndices[9] = 0, pIndices[10] = 7, pIndices[11] = 4; // pIndices[12] = 0, pIndices[13] = 4, pIndices[14] = 5; pIndices[15] = 0, pIndices[16] = 5, pIndices[17] = 1; // Ҳ pIndices[18] = 2, pIndices[19] = 6, pIndices[20] = 7; pIndices[21] = 2, pIndices[22] = 7, pIndices[23] = 3; // pIndices[24] = 2, pIndices[25] = 5, pIndices[26] = 6; pIndices[27] = 2, pIndices[28] = 1, pIndices[29] = 5; // pIndices[30] = 4, pIndices[31] = 6, pIndices[32] = 5; pIndices[33] = 4, pIndices[34] = 7, pIndices[35] = 6; g_pIndexBuffer->Unlock(); return S_OK; } //-----------------------------------Matrix_Set( )-------------------------------------- // װDirect3DĴ任ĺ任ȡ任ͶӰ任ӿڱ任 //-------------------------------------------------------------------------------------------------- VOID Matrix_Set() { //-------------------------------------------------------------------------------------- //Ĵ任֮һ任 //-------------------------------------------------------------------------------------- D3DXMATRIX matWorld, Rx, Ry, Rz; D3DXMatrixIdentity(&matWorld); // λ D3DXMatrixRotationX(&Rx, D3DX_PI *(::timeGetTime() / 1000.0f)); // Xת D3DXMatrixRotationY(&Ry, D3DX_PI *( ::timeGetTime() / 1000.0f/2)); // Yת D3DXMatrixRotationZ(&Rz, D3DX_PI *( ::timeGetTime() / 1000.0f/3)); // Zת matWorld = Rx * Ry * Rz * matWorld; // õյϾ g_pd3dDevice->SetTransform(D3DTS_WORLD, &matWorld); //任 //-------------------------------------------------------------------------------------- //Ĵ任֮ȡ任 //-------------------------------------------------------------------------------------- D3DXMATRIX matView; //һ D3DXVECTOR3 vEye(0.0f, 0.0f, -200.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, 1.0f, 1.0f, 1000.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_Render( )------------------------------- // ʹDirect3DȾ //-------------------------------------------------------------------------------------------------- void Direct3D_Render(HWND hwnd) { //-------------------------------------------------------------------------------------- // Direct3DȾ岽֮һ //-------------------------------------------------------------------------------------- g_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(255, 214, 158), 1.0f, 0); //һΣڻȡھ RECT formatRect; GetClientRect(hwnd, &formatRect); //-------------------------------------------------------------------------------------- // Direct3DȾ岽֮ʼ //-------------------------------------------------------------------------------------- g_pd3dDevice->BeginScene(); // ʼ //-------------------------------------------------------------------------------------- // Direct3DȾ岽֮ʽƣö㻺ͼ //-------------------------------------------------------------------------------------- //---------------------------------------------------------------- // 㻺桢ͼIJ֮ġͼ //---------------------------------------------------------------- Matrix_Set();//÷װĴ任ĺDirect3D任ȡ任ͶӰ任ӿڱ任 // ȡϢӦģʽ if (::GetAsyncKeyState(0x31) & 0x8000f) // ּ1£߿ g_pd3dDevice->SetRenderState(D3DRS_FILLMODE,D3DFILL_WIREFRAME); if (::GetAsyncKeyState(0x32) & 0x8000f) // ּ2£ʵ g_pd3dDevice->SetRenderState(D3DRS_FILLMODE,D3DFILL_SOLID); g_pd3dDevice->SetStreamSource( 0, g_pVertexBuffer, 0, sizeof(CUSTOMVERTEX) );//ѰļϢĶ㻺Ⱦˮ g_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX );//ָʹõʽĺ g_pd3dDevice->SetIndices(g_pIndexBuffer);// g_pd3dDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, 8, 0, 12);//϶㻺ͼ //ڴϽǴʾÿ֡ int charCount = swprintf_s(g_strFPS, 20, _T("FPS:%0.3f"), Get_FPS() ); g_pFont->DrawText(NULL, g_strFPS, charCount , &formatRect, DT_TOP | DT_RIGHT, D3DCOLOR_XRGB(255,39,136)); //-------------------------------------------------------------------------------------- // 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( )-------------------------------- // Դڴ˺нг˳ǰԴ //--------------------------------------------------------------------------------------------------- void Direct3D_CleanUp() { //ͷCOMӿڶ SAFE_RELEASE(g_pIndexBuffer) SAFE_RELEASE(g_pVertexBuffer) SAFE_RELEASE(g_pFont) SAFE_RELEASE(g_pd3dDevice) } ================================================ FILE: Direct3D-Game-Demo/D3Ddemo6/D3Ddemo6.cpp ================================================ //-----------------------------------˵---------------------------------------------- // :D3Ddemo6 // 20134 Create by dzī // Direct3DмּĿݻ ʾ // ˵ ּ1͡2߿ģʽʵģʽ֮лĬ߿ //------------------------------------------------------------------------------------------------ //-----------------------------------ͷļ֡--------------------------------------- // ͷļ //------------------------------------------------------------------------------------------------ #include #include #include //-----------------------------------ļ֡--------------------------------------- // Ŀļ //------------------------------------------------------------------------------------------------ #pragma comment(lib,"winmm.lib") //PlaySoundļ #pragma comment(lib,"d3d9.lib") #pragma comment(lib,"d3dx9.lib") //-----------------------------------궨岿֡-------------------------------------------- // һЩ //------------------------------------------------------------------------------------------------ #define WINDOW_WIDTH 800 //Ϊڿȶĺ꣬Էڴ˴޸Ĵڿ #define WINDOW_HEIGHT 600 //Ϊڸ߶ȶĺ꣬Էڴ˴޸Ĵڸ߶ #define WINDOW_TITLE L"ϨϷ롿Direct3DмּĿݻ ʾ" //Ϊڱⶨĺ #define SAFE_RELEASE(p) { if(p) { (p)->Release(); (p)=NULL; } } //һȫͷź꣬ںCOMӿָͷ //-----------------------------------ȫֱ֡------------------------------------- // ȫֱ //------------------------------------------------------------------------------------------------ LPDIRECT3DDEVICE9 g_pd3dDevice = NULL; //Direct3D豸 ID3DXFont* g_pFont=NULL; //COMӿ float g_FPS = 0.0f; //һ͵ı֡ wchar_t g_strFPS[50]; //֡ʵַ LPD3DXMESH g_teapot = NULL; // LPD3DXMESH g_cube = NULL; //壨ӣ LPD3DXMESH g_sphere = NULL; // LPD3DXMESH g_torus = NULL; //Բ D3DXMATRIX g_WorldMatrix[4],R; //һЩȫֵ //-----------------------------------ȫֺ֡------------------------------------- // ȫֺֹδıʶϵд //------------------------------------------------------------------------------------------------ LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam );//ڹ̺ HRESULT Direct3D_Init(HWND hwnd); //нDirect3Dijʼ HRESULT Objects_Init(HWND hwnd); //нҪƵԴʼ VOID Direct3D_Render(HWND hwnd); //нDirect3DȾд VOID Direct3D_CleanUp( ); //COMԴԼԴ float Get_FPS(); //֡ĺ VOID Matrix_Set(); //װĴ任ĺ //-----------------------------------WinMain( )-------------------------------------- // WindowsӦóںǵij↑ʼ //------------------------------------------------------------------------------------------------ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nShowCmd) { //1ڴIJ֮һʼһĴ 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; //ָڹ̵ijʵ 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ڴIJ֮עᴰ if( !RegisterClassEx( &wndClass ) ) //괰ںҪԴעᣬܴ͵Ĵ return -1; //3ڴIJ֮ʽ HWND hwnd = CreateWindow( L"ForTheDreamOfGameDevelop",WINDOW_TITLE, //ϲּĴںCreateWindow WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, WINDOW_WIDTH, WINDOW_HEIGHT, NULL, NULL, hInstance, NULL ); //Direct3DԴijʼʧmessageboxʾ if (!(S_OK==Direct3D_Init (hwnd))) { MessageBox(hwnd, _T("Direct3Dʼʧ~"), _T("dzīϢ"), 0); //ʹMessageBoxһϢ } //4ڴIJ֮ģڵƶʾ MoveWindow(hwnd,250,80,WINDOW_WIDTH,WINDOW_HEIGHT,true); //ʾʱλãʹϽλڣ250,80 ShowWindow( hwnd, nShowCmd ); //ShowWindowʾ UpdateWindow(hwnd); //Դڽи£·Ҫװһ PlaySound(L"뤫 (Long Version).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_Render(hwnd); //Ⱦ } } //6ע UnregisterClass(L"ForTheDreamOfGameDevelop", wndClass.hInstance); //׼ע return 0; } //-----------------------------------WndProc( )-------------------------------------- // ڹ̺WndProc,ԴϢд //------------------------------------------------------------------------------------------------ LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ) { switch( message ) //switch俪ʼ { case WM_PAINT: // ǿͻػϢ Direct3D_Render(hwnd); //Direct3DȾ ValidateRect(hwnd, NULL); // ¿ͻʾ break; //switch case WM_KEYDOWN: // Ǽ̰Ϣ if (wParam == VK_ESCAPE) // µļESC DestroyWindow(hwnd); // ٴ, һWM_DESTROYϢ break; //switch case WM_DESTROY: //ǴϢ Direct3D_CleanUp(); //ԶԴGame_CleanUp˳ǰԴ PostQuitMessage( 0 ); //ϵͳиֹ߳ӦWM_DESTROYϢ break; //switch default: //caseϣִиdefault return DefWindowProc( hwnd, message, wParam, lParam ); //ȱʡĴڹ } return 0; //˳ } //-----------------------------------Direct3D_Init( )-------------------------------------- // Direct3DʼDirect3Dijʼ //------------------------------------------------------------------------------------------------ HRESULT Direct3D_Init(HWND hwnd) { //-------------------------------------------------------------------------------------- // Direct3DʼIJ֮һӿڡDirect3Dӿڶ, ԱøDirect3D󴴽Direct3D豸 //-------------------------------------------------------------------------------------- LPDIRECT3D9 pD3D = NULL; //Direct3DӿڶĴ if( NULL == ( pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) ) //ʼDirect3Dӿڶ󣬲DirectX汾Э return E_FAIL; //-------------------------------------------------------------------------------------- // Direct3DʼIJ֮,ȡϢȡӲ豸Ϣ //-------------------------------------------------------------------------------------- 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ʼIJ֮ݡD3DPRESENT_PARAMETERSṹ //-------------------------------------------------------------------------------------- D3DPRESENT_PARAMETERS d3dpp; ZeroMemory(&d3dpp, sizeof(d3dpp)); d3dpp.BackBufferWidth = WINDOW_WIDTH; d3dpp.BackBufferHeight = WINDOW_HEIGHT; d3dpp.BackBufferFormat = D3DFMT_A8R8G8B8; d3dpp.BackBufferCount = 1; d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE; d3dpp.MultiSampleQuality = 0; d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; d3dpp.hDeviceWindow = hwnd; d3dpp.Windowed = true; d3dpp.EnableAutoDepthStencil = true; d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8; d3dpp.Flags = 0; d3dpp.FullScreen_RefreshRateInHz = 0; d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; //-------------------------------------------------------------------------------------- // Direct3DʼIJ֮ģ豸Direct3D豸ӿ //-------------------------------------------------------------------------------------- if(FAILED(pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, vp, &d3dpp, &g_pd3dDevice))) return E_FAIL; SAFE_RELEASE(pD3D) //LPDIRECT3D9ӿڶʹɣǽͷŵ if(!(S_OK==Objects_Init(hwnd))) return E_FAIL; //һObjects_InitȾԴijʼ return S_OK; } //-----------------------------------Object_Init( )-------------------------------------- // ȾԴʼڴ˺нҪȾԴijʼ //-------------------------------------------------------------------------------------------------- HRESULT Objects_Init(HWND hwnd) { // if(FAILED(D3DXCreateFont(g_pd3dDevice, 36, 0, 0, 1, false, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, DEFAULT_QUALITY, 0, _T("΢ź"), &g_pFont))) return E_FAIL; srand(timeGetTime()); //ϵͳʱʼ // Ĵ if(FAILED(D3DXCreateBox(g_pd3dDevice, 2, 2, 2, &g_cube, NULL))) //Ĵ return false; if(FAILED(D3DXCreateTeapot(g_pd3dDevice, &g_teapot, NULL))) //Ĵ return false; if(FAILED(D3DXCreateSphere(g_pd3dDevice, 1.5, 25, 25, //Ĵ &g_sphere, NULL))) return false; if(FAILED(D3DXCreateTorus(g_pd3dDevice, 0.5f, 1.2f, 25, 25, //ԲĴ &g_torus, NULL))) return false; // Ⱦ״̬ g_pd3dDevice->SetRenderState(D3DRS_LIGHTING, FALSE); //رչ g_pd3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW); // g_pd3dDevice->SetRenderState(D3DRS_FILLMODE,D3DFILL_WIREFRAME); //߿ģʽ return S_OK; } //-----------------------------------Matrix_Set( )-------------------------------------- // װDirect3DĴ任ĺ任ȡ任ͶӰ任ӿڱ任 //-------------------------------------------------------------------------------------------------- VOID Matrix_Set() { //-------------------------------------------------------------------------------------- //Ĵ任֮һ任 //-------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------- //Ĵ任֮ȡ任 //-------------------------------------------------------------------------------------- D3DXMATRIX matView; //һ D3DXVECTOR3 vEye(0.0f, 0.0f, -15.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, 1.0f, 1.0f, 1000.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_Render( )------------------------------- // ʹDirect3DȾ //-------------------------------------------------------------------------------------------------- void Direct3D_Render(HWND hwnd) { //-------------------------------------------------------------------------------------- // Direct3DȾ岽֮һ //-------------------------------------------------------------------------------------- g_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0); //һΣڻȡھ RECT formatRect; GetClientRect(hwnd, &formatRect); //-------------------------------------------------------------------------------------- // Direct3DȾ岽֮ʼ //-------------------------------------------------------------------------------------- g_pd3dDevice->BeginScene(); // ʼ Matrix_Set();//÷װĴ任ĺDirect3D任ȡ任ͶӰ任ӿڱ任 // ȡϢӦģʽ if (::GetAsyncKeyState(0x31) & 0x8000f) // ּ1£ʵ g_pd3dDevice->SetRenderState(D3DRS_FILLMODE,D3DFILL_SOLID); if (::GetAsyncKeyState(0x32) & 0x8000f) // ּ2£߿ g_pd3dDevice->SetRenderState(D3DRS_FILLMODE,D3DFILL_WIREFRAME); //-------------------------------------------------------------------------------------- // Direct3DȾ岽֮ʽƣö㻺ͼ //-------------------------------------------------------------------------------------- D3DXMatrixRotationY(&R, ::timeGetTime() / 1440.0f); //ùתľ // Ļ D3DXMatrixTranslation(&g_WorldMatrix[0], 3.0f, -3.0f, 0.0f); g_WorldMatrix[0] = g_WorldMatrix[0]*R; g_pd3dDevice->SetTransform(D3DTS_WORLD, &g_WorldMatrix[0]); g_cube->DrawSubset(0); //вĻ D3DXMatrixTranslation(&g_WorldMatrix[1], -3.0f, -3.0f, 0.0f); g_WorldMatrix[1] = g_WorldMatrix[1]*R; g_pd3dDevice->SetTransform(D3DTS_WORLD, &g_WorldMatrix[1]); g_teapot->DrawSubset(0); // ԲĻ D3DXMatrixTranslation(&g_WorldMatrix[2], 3.0f, 3.0f, 0.0f); g_WorldMatrix[2] = g_WorldMatrix[2]*R; g_pd3dDevice->SetTransform(D3DTS_WORLD, &g_WorldMatrix[2]); g_torus->DrawSubset(0); // Ļ D3DXMatrixTranslation(&g_WorldMatrix[3], -3.0f, 3.0f, 0.0f); g_WorldMatrix[3] = g_WorldMatrix[3]*R; g_pd3dDevice->SetTransform(D3DTS_WORLD, &g_WorldMatrix[3]); g_sphere->DrawSubset(0); //ڴϽǴʾÿ֡ int charCount = swprintf_s(g_strFPS, 20, _T("FPS:%0.3f"), Get_FPS() ); g_pFont->DrawText(NULL, g_strFPS, charCount , &formatRect, DT_TOP | DT_RIGHT, D3DCOLOR_XRGB(255,39,136)); //-------------------------------------------------------------------------------------- // 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( )-------------------------------- // Դڴ˺нг˳ǰԴ //--------------------------------------------------------------------------------------------------- void Direct3D_CleanUp() { //ͷCOMӿڶ SAFE_RELEASE(g_torus) SAFE_RELEASE(g_sphere) SAFE_RELEASE(g_cube) SAFE_RELEASE(g_teapot) SAFE_RELEASE(g_pFont) SAFE_RELEASE(g_pd3dDevice) } ================================================ FILE: Direct3D-Game-Demo/D3Ddemo7/D3Ddemo7.cpp ================================================ //-----------------------------------˵---------------------------------------------- // :D3Ddemo7 // 20134 Create by dzī // ʵʸеά磺 ʾ // ˵ ּ1͡2ʵģʽ߿ģʽ֮лĬ߿ //------------------------------------------------------------------------------------------------ //-----------------------------------ͷļ֡--------------------------------------- // ͷļ //------------------------------------------------------------------------------------------------ #include #include #include //-----------------------------------ļ֡--------------------------------------- // Ŀļ //------------------------------------------------------------------------------------------------ #pragma comment(lib,"winmm.lib") //PlaySoundļ #pragma comment(lib,"d3d9.lib") #pragma comment(lib,"d3dx9.lib") //-----------------------------------궨岿֡-------------------------------------------- // һЩ //------------------------------------------------------------------------------------------------ #define WINDOW_WIDTH 800 //Ϊڿȶĺ꣬Էڴ˴޸Ĵڿ #define WINDOW_HEIGHT 600 //Ϊڸ߶ȶĺ꣬Էڴ˴޸Ĵڸ߶ #define WINDOW_TITLE L"ϨϷ롿ʵʸеά磺 ʾ" //Ϊڱⶨĺ #define SAFE_RELEASE(p) { if(p) { (p)->Release(); (p)=NULL; } } //һȫͷź꣬ںCOMӿָͷ //-----------------------------------ȫֱ֡------------------------------------- // ȫֱ //------------------------------------------------------------------------------------------------ LPDIRECT3DDEVICE9 g_pd3dDevice = NULL; //Direct3D豸 ID3DXFont* g_pFont=NULL; //COMӿ float g_FPS = 0.0f; //һ͵ı֡ wchar_t g_strFPS[50]; //֡ʵַ LPD3DXMESH g_teapot = NULL; // LPD3DXMESH g_cube = NULL; //壨ӣ LPD3DXMESH g_sphere = NULL; // LPD3DXMESH g_torus = NULL; //Բ D3DXMATRIX g_WorldMatrix[4],R; //һЩȫֵ //-----------------------------------ȫֺ֡------------------------------------- // ȫֺֹδıʶϵд //------------------------------------------------------------------------------------------------ LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam );//ڹ̺ HRESULT Direct3D_Init(HWND hwnd); //нDirect3Dijʼ HRESULT Objects_Init(HWND hwnd); //нҪƵԴʼ VOID Direct3D_Render(HWND hwnd); //нDirect3DȾд VOID Direct3D_CleanUp( ); //COMԴԼԴ float Get_FPS(); //֡ĺ VOID Matrix_Set(); //װĴ任ĺ void Light_Set(LPDIRECT3DDEVICE9 pd3dDevice, UINT nType); //װ˹յĺ //-----------------------------------WinMain( )-------------------------------------- // WindowsӦóںǵij↑ʼ //------------------------------------------------------------------------------------------------ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nShowCmd) { //1ڴIJ֮һʼһĴ 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; //ָڹ̵ijʵ 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ڴIJ֮עᴰ if( !RegisterClassEx( &wndClass ) ) //괰ںҪԴעᣬܴ͵Ĵ return -1; //3ڴIJ֮ʽ HWND hwnd = CreateWindow( L"ForTheDreamOfGameDevelop",WINDOW_TITLE, //ϲּĴںCreateWindow WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, WINDOW_WIDTH, WINDOW_HEIGHT, NULL, NULL, hInstance, NULL ); //Direct3DԴijʼʧmessageboxʾ if (!(S_OK==Direct3D_Init (hwnd))) { MessageBox(hwnd, _T("Direct3Dʼʧ~"), _T("dzīϢ"), 0); //ʹMessageBoxһϢ } //4ڴIJ֮ģڵƶʾ MoveWindow(hwnd,250,80,WINDOW_WIDTH,WINDOW_HEIGHT,true); //ʾʱλãʹϽλڣ250,80 ShowWindow( hwnd, nShowCmd ); //ShowWindowʾ UpdateWindow(hwnd); //Դڽи£·Ҫװһ 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_Render(hwnd); //Ⱦ } } //6ע UnregisterClass(L"ForTheDreamOfGameDevelop", wndClass.hInstance); //׼ע return 0; } //-----------------------------------WndProc( )-------------------------------------- // ڹ̺WndProc,ԴϢд //------------------------------------------------------------------------------------------------ LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ) { switch( message ) //switch俪ʼ { case WM_PAINT: // ǿͻػϢ Direct3D_Render(hwnd); //Direct3DȾ ValidateRect(hwnd, NULL); // ¿ͻʾ break; //switch case WM_KEYDOWN: // Ǽ̰Ϣ if (wParam == VK_ESCAPE) // µļESC DestroyWindow(hwnd); // ٴ, һWM_DESTROYϢ break; //switch case WM_DESTROY: //ǴϢ Direct3D_CleanUp(); //ԶԴGame_CleanUp˳ǰԴ PostQuitMessage( 0 ); //ϵͳиֹ߳ӦWM_DESTROYϢ break; //switch default: //caseϣִиdefault return DefWindowProc( hwnd, message, wParam, lParam ); //ȱʡĴڹ } return 0; //˳ } //-----------------------------------Direct3D_Init( )-------------------------------------- // Direct3DʼDirect3Dijʼ //------------------------------------------------------------------------------------------------ HRESULT Direct3D_Init(HWND hwnd) { //-------------------------------------------------------------------------------------- // Direct3DʼIJ֮һӿڡDirect3Dӿڶ, ԱøDirect3D󴴽Direct3D豸 //-------------------------------------------------------------------------------------- LPDIRECT3D9 pD3D = NULL; //Direct3DӿڶĴ if( NULL == ( pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) ) //ʼDirect3Dӿڶ󣬲DirectX汾Э return E_FAIL; //-------------------------------------------------------------------------------------- // Direct3DʼIJ֮,ȡϢȡӲ豸Ϣ //-------------------------------------------------------------------------------------- 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ʼIJ֮ݡD3DPRESENT_PARAMETERSṹ //-------------------------------------------------------------------------------------- D3DPRESENT_PARAMETERS d3dpp; ZeroMemory(&d3dpp, sizeof(d3dpp)); d3dpp.BackBufferWidth = WINDOW_WIDTH; d3dpp.BackBufferHeight = WINDOW_HEIGHT; d3dpp.BackBufferFormat = D3DFMT_A8R8G8B8; d3dpp.BackBufferCount = 1; d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE; d3dpp.MultiSampleQuality = 0; d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; d3dpp.hDeviceWindow = hwnd; d3dpp.Windowed = true; d3dpp.EnableAutoDepthStencil = true; d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8; d3dpp.Flags = 0; d3dpp.FullScreen_RefreshRateInHz = 0; d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; //-------------------------------------------------------------------------------------- // Direct3DʼIJ֮ģ豸Direct3D豸ӿ //-------------------------------------------------------------------------------------- if(FAILED(pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, vp, &d3dpp, &g_pd3dDevice))) return E_FAIL; SAFE_RELEASE(pD3D) //LPDIRECT3D9ӿڶʹɣǽͷŵ if(!(S_OK==Objects_Init(hwnd))) return E_FAIL; //һObjects_InitȾԴijʼ return S_OK; } //-----------------------------------Object_Init( )-------------------------------------- // ȾԴʼڴ˺нҪȾԴijʼ //-------------------------------------------------------------------------------------------------- HRESULT Objects_Init(HWND hwnd) { // if(FAILED(D3DXCreateFont(g_pd3dDevice, 36, 0, 0, 1, false, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, DEFAULT_QUALITY, 0, _T("΢ź"), &g_pFont))) return E_FAIL; srand(timeGetTime()); //ϵͳʱʼ // Ĵ if(FAILED(D3DXCreateBox(g_pd3dDevice, 2, 2, 2, &g_cube, NULL))) //Ĵ return false; if(FAILED(D3DXCreateTeapot(g_pd3dDevice, &g_teapot, NULL))) //Ĵ return false; if(FAILED(D3DXCreateSphere(g_pd3dDevice, 1.5, 25, 25, //Ĵ &g_sphere, NULL))) return false; if(FAILED(D3DXCreateTorus(g_pd3dDevice, 0.5f, 1.2f, 25, 25, //ԲĴ &g_torus, NULL))) return false; // ò D3DMATERIAL9 mtrl; ::ZeroMemory(&mtrl, sizeof(mtrl)); mtrl.Ambient = D3DXCOLOR(0.5f, 0.5f, 0.7f, 1.0f); mtrl.Diffuse = D3DXCOLOR(0.6f, 0.6f, 0.6f, 1.0f); mtrl.Specular = D3DXCOLOR(0.3f, 0.3f, 0.3f, 0.3f); mtrl.Emissive = D3DXCOLOR(0.3f, 0.0f, 0.1f, 1.0f); g_pd3dDevice->SetMaterial(&mtrl); // ù Light_Set(g_pd3dDevice, 1); g_pd3dDevice->SetRenderState(D3DRS_LIGHTING, true); g_pd3dDevice->SetRenderState(D3DRS_NORMALIZENORMALS, true); g_pd3dDevice->SetRenderState(D3DRS_SPECULARENABLE, true); g_pd3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW); // return S_OK; } //-----------------------------------Light_Set( )----------------------------- // Desc: װ3ֹԴ͵ĺԸݵڶѡԴ //-------------------------------------------------------------------------------------- VOID Light_Set(LPDIRECT3DDEVICE9 pd3dDevice, UINT nType) { //һͲʼ static D3DLIGHT9 light; ::ZeroMemory(&light, sizeof(light)); //һswitch3ֹԴѡ switch (nType) { case 1: //Դ light.Type = D3DLIGHT_POINT; light.Ambient = D3DXCOLOR(0.6f, 0.6f, 0.6f, 1.0f); light.Diffuse = D3DXCOLOR(1.0f, 1.0f, 1.0f, 1.0f); light.Specular = D3DXCOLOR(0.3f, 0.3f, 0.3f, 1.0f); light.Position = D3DXVECTOR3(0.0f, 200.0f, 0.0f); light.Attenuation0 = 1.0f; light.Attenuation1 = 0.0f; light.Attenuation2 = 0.0f; light.Range = 300.0f; break; case 2: //ƽй light.Type = D3DLIGHT_DIRECTIONAL; light.Ambient = D3DXCOLOR(0.5f, 0.5f, 0.5f, 1.0f); light.Diffuse = D3DXCOLOR(1.0f, 1.0f, 1.0f, 1.0f); light.Specular = D3DXCOLOR(0.3f, 0.3f, 0.3f, 1.0f); light.Direction = D3DXVECTOR3(1.0f, 0.0f, 0.0f); break; case 3: //۹ light.Type = D3DLIGHT_SPOT; light.Position = D3DXVECTOR3(100.0f, 100.0f, 100.0f); light.Direction = D3DXVECTOR3(-1.0f, -1.0f, -1.0f); light.Ambient = D3DXCOLOR(0.3f, 0.3f, 0.3f, 1.0f); light.Diffuse = D3DXCOLOR(1.0f, 1.0f, 1.0f, 1.0f); light.Specular = D3DXCOLOR(0.3f, 0.3f, 0.3f, 0.3f); light.Attenuation0 = 1.0f; light.Attenuation1 = 0.0f; light.Attenuation2 = 0.0f; light.Range = 300.0f; light.Falloff = 0.1f; light.Phi = D3DX_PI / 3.0f; light.Theta = D3DX_PI / 6.0f; break; } pd3dDevice->SetLight(0, &light); //ùԴ pd3dDevice->LightEnable(0, true);//ù pd3dDevice->SetRenderState(D3DRS_AMBIENT, D3DCOLOR_XRGB(36, 36, 36)); //һ» } //-----------------------------------Matrix_Set( )-------------------------------------- // װDirect3DĴ任ĺ任ȡ任ͶӰ任ӿڱ任 //-------------------------------------------------------------------------------------------------- VOID Matrix_Set() { //-------------------------------------------------------------------------------------- //Ĵ任֮һ任 //-------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------- //Ĵ任֮ȡ任 //-------------------------------------------------------------------------------------- D3DXMATRIX matView; //һ D3DXVECTOR3 vEye(0.0f, 0.0f, -15.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, 1.0f, 1.0f, 1000.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_Render( )------------------------------- // ʹDirect3DȾ //-------------------------------------------------------------------------------------------------- void Direct3D_Render(HWND hwnd) { //-------------------------------------------------------------------------------------- // Direct3DȾ岽֮һ //-------------------------------------------------------------------------------------- g_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0); //һΣڻȡھ RECT formatRect; GetClientRect(hwnd, &formatRect); //-------------------------------------------------------------------------------------- // Direct3DȾ岽֮ʼ //-------------------------------------------------------------------------------------- g_pd3dDevice->BeginScene(); // ʼ Matrix_Set();//÷װĴ任ĺDirect3D任ȡ任ͶӰ任ӿڱ任 // ݼ̰µӦģʽ if (::GetAsyncKeyState(0x31) & 0x8000f) // ּ1£ʵ g_pd3dDevice->SetRenderState(D3DRS_FILLMODE,D3DFILL_SOLID); if (::GetAsyncKeyState(0x32) & 0x8000f) // ּ2£߿ g_pd3dDevice->SetRenderState(D3DRS_FILLMODE,D3DFILL_WIREFRAME); // ݼ̰µӦĹ if (::GetAsyncKeyState(0x51) & 0x8000f) // ϵİQ,ԴΪԴ Light_Set(g_pd3dDevice, 1); if (::GetAsyncKeyState(0x57) & 0x8000f) // ϵİW£ԴΪƽйԴ Light_Set(g_pd3dDevice, 2); if (::GetAsyncKeyState(0x45) & 0x8000f) // ϵİE£ԴΪ۹ Light_Set(g_pd3dDevice, 3); //-------------------------------------------------------------------------------------- // Direct3DȾ岽֮ʽƣö㻺ͼ //-------------------------------------------------------------------------------------- //Ĺת D3DXMatrixRotationY(&R, ::timeGetTime() / 1440.0f); // Ļ D3DXMatrixTranslation(&g_WorldMatrix[0], 3.0f, -3.0f, 0.0f); g_WorldMatrix[0] = g_WorldMatrix[0]*R; g_pd3dDevice->SetTransform(D3DTS_WORLD, &g_WorldMatrix[0]); g_cube->DrawSubset(0); //вĻ D3DXMatrixTranslation(&g_WorldMatrix[1], -3.0f, -3.0f, 0.0f); g_WorldMatrix[1] = g_WorldMatrix[1]*R; g_pd3dDevice->SetTransform(D3DTS_WORLD, &g_WorldMatrix[1]); g_teapot->DrawSubset(0); // ԲĻ D3DXMatrixTranslation(&g_WorldMatrix[2], 3.0f, 3.0f, 0.0f); g_WorldMatrix[2] = g_WorldMatrix[2]*R; g_pd3dDevice->SetTransform(D3DTS_WORLD, &g_WorldMatrix[2]); g_torus->DrawSubset(0); // Ļ D3DXMatrixTranslation(&g_WorldMatrix[3], -3.0f, 3.0f, 0.0f); g_WorldMatrix[3] = g_WorldMatrix[3]*R; g_pd3dDevice->SetTransform(D3DTS_WORLD, &g_WorldMatrix[3]); g_sphere->DrawSubset(0); //ڴϽǴʾÿ֡ int charCount = swprintf_s(g_strFPS, 20, _T("FPS:%0.3f"), Get_FPS() ); g_pFont->DrawText(NULL, g_strFPS, charCount , &formatRect, DT_TOP | DT_RIGHT, D3DCOLOR_XRGB(255,39,136)); //-------------------------------------------------------------------------------------- // 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( )-------------------------------- // Դڴ˺нг˳ǰԴ //--------------------------------------------------------------------------------------------------- void Direct3D_CleanUp() { //ͷCOMӿڶ SAFE_RELEASE(g_torus) SAFE_RELEASE(g_sphere) SAFE_RELEASE(g_cube) SAFE_RELEASE(g_teapot) SAFE_RELEASE(g_pFont) SAFE_RELEASE(g_pd3dDevice) } ================================================ FILE: Direct3D-Game-Demo/D3Ddemo8/D3Ddemo8.cpp ================================================ //-----------------------------------˵---------------------------------------------- // :D3Ddemo8 // 20134 Create by dzī // Ϸ : DirectInput ʾ // ͼزģ ɽǰ //------------------------------------------------------------------------------------------------ //-----------------------------------궨岿֡-------------------------------------------- // һЩ //------------------------------------------------------------------------------------------------ #define WINDOW_WIDTH 800 //Ϊڿȶĺ꣬Էڴ˴޸Ĵڿ #define WINDOW_HEIGHT 600 //Ϊڸ߶ȶĺ꣬Էڴ˴޸Ĵڸ߶ #define WINDOW_TITLE _T("ϨϷ롿Ϸ : DirectInput") //Ϊڱⶨĺ #define DIRECTINPUT_VERSION 0x0800 //ָDirectInput汾ֹDIRECTINPUT_VERSION undefined #define SAFE_RELEASE(p) { if(p) { (p)->Release(); (p)=NULL; } } //ԶһSAFE_RELEASE(),COMԴͷ #define SAFE_DELETE(p) { if(p) { delete (p); (p)=NULL; } } //ָıͷź //-----------------------------------ͷļ֡--------------------------------------- // ͷļ //------------------------------------------------------------------------------------------------ #include #include #include #include #include // ʹDirectInputͷļעû8 //-----------------------------------ļ֡--------------------------------------- // Ŀļ //------------------------------------------------------------------------------------------------ #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}; //ԿƵַ LPDIRECTINPUT8 g_pDirectInput = NULL; // LPDIRECTINPUTDEVICE8 g_pMouseDevice = NULL; DIMOUSESTATE g_diMouseState = {0}; LPDIRECTINPUTDEVICE8 g_pKeyboardDevice = NULL; char g_pKeyStateBuffer[256] = {0}; D3DXMATRIX g_matWorld; // LPD3DXMESH g_pMesh = NULL; // Ķ D3DMATERIAL9* g_pMaterials = NULL; // IJϢ 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(); BOOL Device_Read(IDirectInputDevice8 *pDIDevice, void* pBuffer, long lSize) ; //-----------------------------------WinMain( )-------------------------------------- // WindowsӦóںǵij↑ʼ //------------------------------------------------------------------------------------------------ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nShowCmd) { //1ڴIJ֮һʼһĴ 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; //ָڹ̵ijʵ 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ڴIJ֮עᴰ if( !RegisterClassEx( &wndClass ) ) //괰ںҪԴעᣬܴ͵Ĵ return -1; //3ڴIJ֮ʽ HWND hwnd = CreateWindow( L"ForTheDreamOfGameDevelop",WINDOW_TITLE, //ϲּĴںCreateWindow WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, WINDOW_WIDTH, WINDOW_HEIGHT, NULL, NULL, hInstance, NULL ); //Direct3DԴijʼʧmessageboxʾ if (!(S_OK==Direct3D_Init (hwnd,hInstance))) { MessageBox(hwnd, _T("Direct3Dʼʧ~"), _T("dzīϢ"), 0); //ʹMessageBoxһϢ } //4ڴIJ֮ģڵƶʾ MoveWindow(hwnd,250,80,WINDOW_WIDTH,WINDOW_HEIGHT,true); //ʾʱλãʹϽλڣ250,80 ShowWindow( hwnd, nShowCmd ); //ShowWindowʾ UpdateWindow(hwnd); //Դڽи£·Ҫװһ 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 ) { switch( message ) //switch俪ʼ { case WM_PAINT: // ǿͻػϢ Direct3D_Render(hwnd); //Direct3DȾ ValidateRect(hwnd, NULL); // ¿ͻʾ break; //switch case WM_KEYDOWN: // Ǽ̰Ϣ if (wParam == VK_ESCAPE) // µļESC DestroyWindow(hwnd); // ٴ, һWM_DESTROYϢ break; //switch case WM_DESTROY: //ǴϢ Direct3D_CleanUp(); //ԶԴGame_CleanUp˳ǰԴ PostQuitMessage( 0 ); //ϵͳиֹ߳ӦWM_DESTROYϢ break; //switch default: //caseϣִиdefault return DefWindowProc( hwnd, message, wParam, lParam ); //ȱʡĴڹ } return 0; //˳ } //-----------------------------------Direct3D_Init( )---------------------------------- // Direct3DʼDirect3Dijʼ //------------------------------------------------------------------------------------------------ HRESULT Direct3D_Init(HWND hwnd,HINSTANCE hInstance) { //-------------------------------------------------------------------------------------- // Direct3DʼIJ֮һӿڡDirect3Dӿڶ, ԱøDirect3D󴴽Direct3D豸 //-------------------------------------------------------------------------------------- LPDIRECT3D9 pD3D = NULL; //Direct3DӿڶĴ if( NULL == ( pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) ) //ʼDirect3Dӿڶ󣬲DirectX汾Э return E_FAIL; //-------------------------------------------------------------------------------------- // Direct3DʼIJ֮,ȡϢȡӲ豸Ϣ //-------------------------------------------------------------------------------------- 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ʼIJ֮ݡ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; d3dpp.EnableAutoDepthStencil = true; d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8; d3dpp.Flags = 0; d3dpp.FullScreen_RefreshRateInHz = 0; d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; //-------------------------------------------------------------------------------------- // Direct3DʼIJ֮ģ豸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У󹦸~ //-------------------------------------------------------------------------------------- // DirectInputʹ岽ǰ豸ʽȨΪ豸ʼ //-------------------------------------------------------------------------------------- // DirectInputӿں豸 DirectInput8Create(hInstance, 0x0800, IID_IDirectInput8, (void**)&g_pDirectInput, NULL); g_pDirectInput->CreateDevice(GUID_SysKeyboard, &g_pMouseDevice, NULL); // ݸʽЭ g_pDirectInput->CreateDevice(GUID_SysMouse, &g_pMouseDevice, NULL); g_pMouseDevice->SetDataFormat(&c_dfDIMouse); g_pMouseDevice->SetCooperativeLevel(hwnd, DISCL_FOREGROUND | DISCL_NONEXCLUSIVE); //ȡ豸Ȩ g_pMouseDevice->Acquire(); //-------------------------------------------------------------------------------------- // DirectInputʹ岽ǰ豸ʽȨΪ豸ʼ //-------------------------------------------------------------------------------------- // DirectInputӿں豸 DirectInput8Create(hInstance, 0x0800, IID_IDirectInput8, (void**)&g_pDirectInput, NULL); g_pDirectInput->CreateDevice(GUID_SysKeyboard, &g_pKeyboardDevice, NULL); // ݸʽЭ g_pKeyboardDevice->SetDataFormat(&c_dfDIKeyboard); g_pKeyboardDevice->SetCooperativeLevel(hwnd, DISCL_FOREGROUND | DISCL_NONEXCLUSIVE); //ȡ豸Ȩ g_pKeyboardDevice->Acquire(); if(!(S_OK==Objects_Init())) return E_FAIL; SAFE_RELEASE(pD3D) //LPDIRECT3D9ӿڶʹɣǽͷŵ return S_OK; } //-----------------------------------Object_Init( )-------------------------------------- // ȾԴʼڴ˺нҪȾԴijʼ //-------------------------------------------------------------------------------------------------- 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ļм LPD3DXBUFFER pAdjBuffer = NULL; LPD3DXBUFFER pMtrlBuffer = NULL; D3DXLoadMeshFromX(L"loli.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; iRelease(); pMtrlBuffer->Release(); // Ⱦ״̬ g_pd3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW); // g_pd3dDevice->SetRenderState(D3DRS_AMBIENT, D3DXCOLOR(1.0f, 1.0f, 1.0f, 1.0f)); //û return S_OK; } //-----------------------------------Matrix_Set( )-------------------------------------- // װDirect3DĴ任ĺ任ȡ任ͶӰ任ӿڱ任 //-------------------------------------------------------------------------------------------------- void Matrix_Set() { //-------------------------------------------------------------------------------------- //Ĵ任֮һ任 //-------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------- //Ĵ任֮ȡ任 //-------------------------------------------------------------------------------------- D3DXMATRIX matView; //һ D3DXVECTOR3 vEye(0.0f, 0.0f, -250.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, 1000.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( )-------------------------------- // ǼʱȾ뵫Ҫʱõģ簴ĸģ //-------------------------------------------------------------------------------------------------- void Direct3D_Update( HWND hwnd) { // ȡϢӦģʽ if (g_pKeyStateBuffer[DIK_1] & 0x80) // ּ1£ʵ g_pd3dDevice->SetRenderState(D3DRS_FILLMODE,D3DFILL_SOLID); if (g_pKeyStateBuffer[DIK_2] & 0x80) // ּ2£߿ g_pd3dDevice->SetRenderState(D3DRS_FILLMODE,D3DFILL_WIREFRAME); // ȡ ::ZeroMemory(&g_diMouseState, sizeof(g_diMouseState)); Device_Read(g_pMouseDevice, (LPVOID)&g_diMouseState, sizeof(g_diMouseState)); // ȡ ::ZeroMemory(g_pKeyStateBuffer, sizeof(g_pKeyStateBuffer)); Device_Read(g_pKeyboardDevice, (LPVOID)g_pKeyStateBuffer, sizeof(g_pKeyStateBuffer)); // ס϶ΪƽƲ static FLOAT fPosX = 0.0f, fPosY = 30.0f, fPosZ = 0.0f; if (g_diMouseState.rgbButtons[0] & 0x80) { fPosX += g_diMouseState.lX * 0.08f; fPosY += g_diMouseState.lY * -0.08f; } //֣Ϊ۲ fPosZ += g_diMouseState.lZ * 0.02f; // ƽ if (g_pKeyStateBuffer[DIK_A] & 0x80) fPosX -= 0.005f; if (g_pKeyStateBuffer[DIK_D] & 0x80) fPosX += 0.005f; if (g_pKeyStateBuffer[DIK_W] & 0x80) fPosY += 0.005f; if (g_pKeyStateBuffer[DIK_S] & 0x80) fPosY -= 0.005f; D3DXMatrixTranslation(&g_matWorld, fPosX, fPosY, fPosZ); // סҼ϶Ϊת static float fAngleX = 0.15f, fAngleY = -(float)D3DX_PI ; if (g_diMouseState.rgbButtons[1] & 0x80) { fAngleX += g_diMouseState.lY * -0.01f; fAngleY += g_diMouseState.lX * -0.01f; } // ת if (g_pKeyStateBuffer[DIK_UP] & 0x80) fAngleX += 0.005f; if (g_pKeyStateBuffer[DIK_DOWN] & 0x80) fAngleX -= 0.005f; if (g_pKeyStateBuffer[DIK_LEFT] & 0x80) fAngleY -= 0.005f; if (g_pKeyStateBuffer[DIK_RIGHT] & 0x80) 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);// Matrix_Set(); } //-----------------------------------Direct3D_Render( )------------------------------- // ʹDirect3DȾ //-------------------------------------------------------------------------------------------------- void Direct3D_Render(HWND hwnd) { //-------------------------------------------------------------------------------------- // Direct3DȾ岽֮һ //-------------------------------------------------------------------------------------- g_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0); //һΣڻȡھ RECT formatRect; GetClientRect(hwnd, &formatRect); //-------------------------------------------------------------------------------------- // Direct3DȾ岽֮ʼ //-------------------------------------------------------------------------------------- g_pd3dDevice->BeginScene(); // ʼ //-------------------------------------------------------------------------------------- // Direct3DȾ岽֮ʽ //-------------------------------------------------------------------------------------- // 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" WSADƽģ ", -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; } //-----------------------------------Device_Read( )------------------------------------ // Desc: ܶȡ豸 //-------------------------------------------------------------------------------------------------- BOOL Device_Read(IDirectInputDevice8 *pDIDevice, void* pBuffer, long lSize) { HRESULT hr; while (true) { pDIDevice->Poll(); // ѯ豸 pDIDevice->Acquire(); // ȡ豸ĿȨ if (SUCCEEDED(hr = pDIDevice->GetDeviceState(lSize, pBuffer))) break; if (hr != DIERR_INPUTLOST || hr != DIERR_NOTACQUIRED) return FALSE; if (FAILED(pDIDevice->Acquire())) return FALSE; } return TRUE; } //-----------------------------------Direct3D_CleanUp( )-------------------------------- // Direct3DԴͷCOMӿڶ //--------------------------------------------------------------------------------------------------- void Direct3D_CleanUp() { //ͷCOMӿڶ g_pMouseDevice->Unacquire(); g_pKeyboardDevice->Unacquire(); for (DWORD i = 0; iRelease(); (p)=NULL; } } //ԶһSAFE_RELEASE(),COMԴͷ #endif ================================================ FILE: Direct3D-Game-Demo/D3Ddemo9/D3Ddemo9.cpp ================================================ //-----------------------------------˵---------------------------------------------- // :D3Ddemo9 // 20134 Create by dzī // Ϸ : DirectInputķװ ʾ // ͼزģ ƻ //------------------------------------------------------------------------------------------------ //-----------------------------------궨岿֡-------------------------------------------- // һЩ //------------------------------------------------------------------------------------------------ #define WINDOW_WIDTH 800 //Ϊڿȶĺ꣬Էڴ˴޸Ĵڿ #define WINDOW_HEIGHT 600 //Ϊڸ߶ȶĺ꣬Էڴ˴޸Ĵڸ߶ #define WINDOW_TITLE _T("ϨϷ롿DirectInputķװ ʾ") //Ϊڱⶨĺ //-----------------------------------ͷļ֡--------------------------------------- // ͷļ //------------------------------------------------------------------------------------------------ #include #include #include #include #include "DirectInputClass.h" //-----------------------------------ļ֡--------------------------------------- // Ŀļ //------------------------------------------------------------------------------------------------ #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; // IJϢ 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Ӧóںǵij↑ʼ //------------------------------------------------------------------------------------------------ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nShowCmd) { //1ڴIJ֮һʼһĴ 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; //ָڹ̵ijʵ 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ڴIJ֮עᴰ if( !RegisterClassEx( &wndClass ) ) //괰ںҪԴעᣬܴ͵Ĵ return -1; //3ڴIJ֮ʽ HWND hwnd = CreateWindow( L"ForTheDreamOfGameDevelop",WINDOW_TITLE, //ϲּĴںCreateWindow WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, WINDOW_WIDTH, WINDOW_HEIGHT, NULL, NULL, hInstance, NULL ); //Direct3DԴijʼʧmessageboxʾ if (!(S_OK==Direct3D_Init (hwnd,hInstance))) { MessageBox(hwnd, _T("Direct3Dʼʧ~"), _T("dzīϢ"), 0); //ʹMessageBoxһϢ } //4ڴIJ֮ģڵƶʾ MoveWindow(hwnd,250,80,WINDOW_WIDTH,WINDOW_HEIGHT,true); //ʾʱλãʹϽλڣ250,80 ShowWindow( hwnd, nShowCmd ); //ShowWindowʾ UpdateWindow(hwnd); //Դڽи£·Ҫװһ //DirectInputijʼ g_pDInput = new DInputClass(); 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_CleanUpCOMӿڶ PostQuitMessage( 0 ); //ϵͳиֹ߳ӦWM_DESTROYϢ break; //switch default: //caseϣִиdefault return DefWindowProc( hwnd, message, wParam, lParam ); //ȱʡĴڹΪӦóûдĴϢṩȱʡĴ } return 0; //˳ } //-----------------------------------Direct3D_Init( )---------------------------------- // Direct3DʼDirect3Dijʼ //------------------------------------------------------------------------------------------------ HRESULT Direct3D_Init(HWND hwnd,HINSTANCE hInstance) { //-------------------------------------------------------------------------------------- // Direct3DʼIJ֮һӿڡDirect3Dӿڶ, ԱøDirect3D󴴽Direct3D豸 //-------------------------------------------------------------------------------------- LPDIRECT3D9 pD3D = NULL; //Direct3DӿڶĴ if( NULL == ( pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) ) //ʼDirect3Dӿڶ󣬲DirectX汾Э return E_FAIL; //-------------------------------------------------------------------------------------- // Direct3DʼIJ֮,ȡϢȡӲ豸Ϣ //-------------------------------------------------------------------------------------- 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ʼIJ֮ݡ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; d3dpp.EnableAutoDepthStencil = true; d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8; d3dpp.Flags = 0; d3dpp.FullScreen_RefreshRateInHz = 0; d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; //-------------------------------------------------------------------------------------- // Direct3DʼIJ֮ģ豸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( )-------------------------------------- // ȾԴʼڴ˺нҪȾԴijʼ //-------------------------------------------------------------------------------------------------- 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ļм LPD3DXBUFFER pAdjBuffer = NULL; LPD3DXBUFFER pMtrlBuffer = NULL; 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; iRelease(); 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( )-------------------------------- // ǼʱȾ뵫Ҫʱõģ簴ĸģ //-------------------------------------------------------------------------------------------------- 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" WSADƽģ ", -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) } ================================================ FILE: Direct3D-Game-Demo/D3Ddemo9/DirectInputClass.cpp ================================================ //============================================================================= // Desc: DirectInput봦Դļ // 2013 203 Create by dzī //============================================================================= #include "DirectInputClass.h" //----------------------------------------------------------------------------- // Desc: 캯 //----------------------------------------------------------------------------- DInputClass::DInputClass() { m_pDirectInput = NULL; m_KeyboardDevice = NULL; ZeroMemory(m_keyBuffer,sizeof(char)*256); m_MouseDevice= NULL; ZeroMemory(&m_MouseState, sizeof(m_MouseState)); } //----------------------------------------------------------------------------- // NameDInputClass::Init( // Desc: ʼDirectInput̼豸 //----------------------------------------------------------------------------- HRESULT DInputClass::Init( HWND hWnd,HINSTANCE hInstance,DWORD keyboardCoopFlags, DWORD mouseCoopFlags ) { HRESULT hr; //ʼһIDirectInput8ӿڶ HR(DirectInput8Create( hInstance, DIRECTINPUT_VERSION, IID_IDirectInput8,(void**)&m_pDirectInput,NULL )); //м豸ijʼ HR( m_pDirectInput->CreateDevice( GUID_SysKeyboard, &m_KeyboardDevice, NULL )); HR( m_KeyboardDevice->SetCooperativeLevel( hWnd, keyboardCoopFlags)); HR( m_KeyboardDevice->SetDataFormat( &c_dfDIKeyboard )); HR( m_KeyboardDevice->Acquire( )); HR( m_KeyboardDevice->Poll( )); //豸ijʼ 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; } //----------------------------------------------------------------------------- // NameDInputClass::GetInput() // Desc: ڻȡϢĺ //----------------------------------------------------------------------------- void DInputClass::GetInput() { 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); } } //----------------------------------------------------------------------------- // NameDInputClass::IsKeyDown() // Desc: жϼijǷ //----------------------------------------------------------------------------- bool DInputClass::IsKeyDown(int iKey) { if(m_keyBuffer[iKey] & 0x80) return true; else return false; } //----------------------------------------------------------------------------- // NameDInputClass::IsMouseButtonDown() // Desc: жijǷ //----------------------------------------------------------------------------- bool DInputClass::IsMouseButtonDown(int button) { return (m_MouseState.rgbButtons[button] & 0x80) != 0; } //----------------------------------------------------------------------------- // NameDInputClass::MouseDX // Desc: ָXֵ //----------------------------------------------------------------------------- float DInputClass::MouseDX() { return (float)m_MouseState.lX; } //----------------------------------------------------------------------------- // NameDInputClass::MouseDY // Desc: ָYֵ //----------------------------------------------------------------------------- float DInputClass::MouseDY() { return (float)m_MouseState.lY; } //----------------------------------------------------------------------------- // NameDInputClass::MouseDZ // Desc: ָZֵ֣ //----------------------------------------------------------------------------- float DInputClass::MouseDZ() { return (float)m_MouseState.lZ; } //----------------------------------------------------------------------------- // Desc: //----------------------------------------------------------------------------- DInputClass::~DInputClass(void) { 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); } ================================================ FILE: Direct3D-Game-Demo/D3Ddemo9/DirectInputClass.h ================================================ //============================================================================= // Name: DirectInputClass.h // Des: װDirectInput봦ͷļ // 2013 203 Create by dzī //============================================================================= #pragma once #include "D3DUtil.h" #define DIRECTINPUT_VERSION 0x0800 #include //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); //жϼijǷ bool IsMouseButtonDown(int button); //ж갴Ƿ񱻰 float MouseDX(); //Xֵ float MouseDY(); //Yֵ float MouseDZ(); //Zֵ public: DInputClass(void); //캯 ~DInputClass(void); // }; ================================================ FILE: GDI-Game-Demo/10_GDIdemo6.cpp ================================================ //-----------------------------------˵---------------------------------------------- // :GDIdemo6 // 20133 Create by dzī // Ϸ֮ ʱʾ ʾ //------------------------------------------------------------------------------------------------ //-----------------------------------ͷļ֡--------------------------------------- // ͷļ //------------------------------------------------------------------------------------------------ #include #include //ʹswprintf_sͷļ //-----------------------------------ļ֡--------------------------------------- // Ŀļ //------------------------------------------------------------------------------------------------ #pragma comment(lib,"winmm.lib") //PlaySoundļ #pragma comment(lib,"Msimg32.lib") //ʹTransparentBltĿļ //-----------------------------------궨岿֡-------------------------------------------- // һЩ //------------------------------------------------------------------------------------------------ #define WINDOW_WIDTH 800 //Ϊڿȶĺ꣬Էڴ˴޸Ĵڿ #define WINDOW_HEIGHT 600 //Ϊڸ߶ȶĺ꣬Էڴ˴޸Ĵڸ߶ #define WINDOW_TITLE L"ϨϷ롿Ϸ֮ ʱʾ ʾ" //Ϊڱⶨĺ //-----------------------------------ȫֱ֡------------------------------------- // ȫֱ //------------------------------------------------------------------------------------------------ HDC g_hdc=NULL,g_mdc=NULL; //ȫ豸ȫڴDC HBITMAP g_hSprite[12]; //λͼλͼ int g_iNum=0; //"g_iNum"¼Ŀǰʾͼ //-----------------------------------ȫֺ֡------------------------------------- // ȫֺֹδıʶϵд //------------------------------------------------------------------------------------------------ LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam );//ڹ̺ BOOL Game_Init(HWND hwnd); //ڴ˺нԴijʼ VOID Game_Paint( HWND hwnd); //ڴ˺нлͼд BOOL Game_CleanUp(HWND hwnd ); //ڴ˺нԴ //-----------------------------------WinMain( )-------------------------------------- // WindowsӦóںǵij↑ʼ //------------------------------------------------------------------------------------------------ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nShowCmd) { //1ڴIJ֮һʼһĴ 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; //ָڹ̵ijʵ 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(WHITE_BRUSH); //ΪhbrBackgroundԱָһɫˢ wndClass.lpszMenuName = NULL; //һԿַָֹ˵Դ֡ wndClass.lpszClassName = L"ForTheDreamOfGameDevelop"; //һԿַָֹ֡ //2ڴIJ֮עᴰ if( !RegisterClassEx( &wndClass ) ) //괰ںҪԴעᣬܴ͵Ĵ return -1; //3ڴIJ֮ʽ HWND hwnd = CreateWindow( L"ForTheDreamOfGameDevelop",WINDOW_TITLE, //ϲּĴںCreateWindow WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, WINDOW_WIDTH, WINDOW_HEIGHT, NULL, NULL, hInstance, NULL ); //4ڴIJ֮ģڵƶʾ MoveWindow(hwnd,250,80,WINDOW_WIDTH,WINDOW_HEIGHT,true); //ʾʱλãʹϽλڣ250,80 ShowWindow( hwnd, nShowCmd ); //ShowWindowʾ UpdateWindow(hwnd); //Դڽи£·Ҫװһ //ϷԴijʼʼʧܣһϢ򣬲FALSE if (!Game_Init (hwnd)) { MessageBox(hwnd, L"Դʼʧ", L"Ϣ", 0); //ʹMessageBoxһϢ return FALSE; } PlaySound(L"֮ʫ.wav", NULL, SND_FILENAME | SND_ASYNC|SND_LOOP); //ѭű //5Ϣѭ MSG msg = { 0 }; //岢ʼmsg while( msg.message != WM_QUIT ) //ʹwhileѭϢWM_QUITϢͼѭ { if( PeekMessage( &msg, 0, 0, 0, PM_REMOVE ) ) //鿴ӦóϢУϢʱеϢɷȥ { TranslateMessage( &msg ); //ϢתΪַϢ DispatchMessage( &msg ); //ַһϢڳ } } //6ע UnregisterClass(L"ForTheDreamOfGameDevelop", wndClass.hInstance); //׼ע return 0; } //-----------------------------------WndProc( )-------------------------------------- // ڹ̺WndProc,ԴϢд //------------------------------------------------------------------------------------------------ LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ) { switch( message ) //switch俪ʼ { case WM_TIMER: //ʱϢ Game_Paint(hwnd); //Game_Paintдڻͼ break; //switch case WM_KEYDOWN: // Ǽ̰Ϣ if (wParam == VK_ESCAPE) // µļESC DestroyWindow(hwnd); // ٴ, һWM_DESTROYϢ break; //switch case WM_DESTROY: //ǴϢ Game_CleanUp(hwnd); //ԶԴGame_CleanUp˳ǰԴ PostQuitMessage( 0 ); //ϵͳиֹ߳ӦWM_DESTROYϢ break; //switch default: //caseϣִиdefault return DefWindowProc( hwnd, message, wParam, lParam ); //ȱʡĴڹ } return 0; //˳ } //-----------------------------------Game_Init( )-------------------------------------- // ʼһЩ򵥵ijʼ //------------------------------------------------------------------------------------------------ BOOL Game_Init( HWND hwnd ) { g_hdc = GetDC(hwnd); //ȡ豸 wchar_t filename[20]; //λͼ for(int i=0;i<12;i++) { memset(filename, 0, sizeof(filename)); //filenameijʼ swprintf_s(filename,L"%d.bmp",i); //swprintf_sװӦͼƬļ g_hSprite[i] = (HBITMAP)LoadImage(NULL,filename,IMAGE_BITMAP,WINDOW_WIDTH,WINDOW_HEIGHT,LR_LOADFROMFILE); } //-----λͼIJ֮DC----- g_mdc = CreateCompatibleDC(g_hdc); //豸ڴDC g_iNum = 0; //óʼʾͼΪ"0" SetTimer(hwnd,1,90,NULL); //ʱ0.09뷢Ϣ Game_Paint(hwnd); return TRUE; } //-----------------------------------Game_Paint( )-------------------------------------- // ƺڴ˺нлƲ //-------------------------------------------------------------------------------------------------- VOID Game_Paint( HWND hwnd ) { //ͼ if(g_iNum == 11) //жǷ񳬹ͼţͼš12ʾͼΪ"0" g_iNum = 0; //ͼͼ SelectObject(g_mdc,g_hSprite[g_iNum]);//ͼѡӦλͼ BitBlt(g_hdc,0,0,WINDOW_WIDTH,WINDOW_HEIGHT,g_mdc,0,0,SRCCOPY); //ĿǰͼŽдͼ //ͼ g_iNum++; //g_iNumֵ1ΪһҪʾͼ } //-----------------------------------Game_CleanUp( )-------------------------------- // Դڴ˺нг˳ǰԴ //--------------------------------------------------------------------------------------------------- BOOL Game_CleanUp( HWND hwnd ) { KillTimer(hwnd,1); //ɾĶʱ //ͷԴ for(int i=0;i<12;i++) DeleteObject(g_hSprite[i]); DeleteDC(g_mdc); ReleaseDC(hwnd,g_hdc); //ͷ豸 return TRUE; } ================================================ FILE: GDI-Game-Demo/11_GDIdemo7.cpp ================================================ //-----------------------------------˵---------------------------------------------- // :GDIdemo7 // 20133 Create by dzī // Ϸ֮ Ϸѭʾ ʾ //------------------------------------------------------------------------------------------------ //-----------------------------------ͷļ֡--------------------------------------- // ͷļ //------------------------------------------------------------------------------------------------ #include #include //ʹswprintf_sͷļ //-----------------------------------ļ֡--------------------------------------- // Ŀļ //------------------------------------------------------------------------------------------------ #pragma comment(lib,"winmm.lib") //PlaySoundļ //-----------------------------------궨岿֡-------------------------------------------- // һЩ //------------------------------------------------------------------------------------------------ #define WINDOW_WIDTH 800 //Ϊڿȶĺ꣬Էڴ˴޸Ĵڿ #define WINDOW_HEIGHT 600 //Ϊڸ߶ȶĺ꣬Էڴ˴޸Ĵڸ߶ #define WINDOW_TITLE L"ϨϷ롿Ϸ֮ Ϸѭʾ ʾ" //Ϊڱⶨĺ //-----------------------------------ȫֱ֡------------------------------------- // ȫֱ //------------------------------------------------------------------------------------------------ HDC g_hdc=NULL,g_mdc=NULL; //ȫ豸ȫڴDC HBITMAP g_hSprite[12]; //λͼλͼ DWORD g_tPre=0,g_tNow=0; //l¼ʱ,g_tPre¼һλͼʱ䣬g_tNow¼˴׼ͼʱ int g_iNum=0; //g_iNum¼Ŀǰʾͼ //-----------------------------------ȫֺ֡------------------------------------- // ȫֺֹδıʶϵд //------------------------------------------------------------------------------------------------ LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam );//ڹ̺ BOOL Game_Init(HWND hwnd); //ڴ˺нԴijʼ VOID Game_Paint( HWND hwnd); //ڴ˺нлͼд BOOL Game_CleanUp(HWND hwnd ); //ڴ˺нԴ //-----------------------------------WinMain( )-------------------------------------- // WindowsӦóںǵij↑ʼ //------------------------------------------------------------------------------------------------ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nShowCmd) { //1ڴIJ֮һʼһĴ 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; //ָڹ̵ijʵ 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(WHITE_BRUSH); //ΪhbrBackgroundԱָһɫˢ wndClass.lpszMenuName = NULL; //һԿַָֹ˵Դ֡ wndClass.lpszClassName = L"ForTheDreamOfGameDevelop"; //һԿַָֹ֡ //2ڴIJ֮עᴰ if( !RegisterClassEx( &wndClass ) ) //괰ںҪԴעᣬܴ͵Ĵ return -1; //3ڴIJ֮ʽ HWND hwnd = CreateWindow( L"ForTheDreamOfGameDevelop",WINDOW_TITLE, //ϲּĴںCreateWindow WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, WINDOW_WIDTH, WINDOW_HEIGHT, NULL, NULL, hInstance, NULL ); //4ڴIJ֮ģڵƶʾ MoveWindow(hwnd,250,80,WINDOW_WIDTH,WINDOW_HEIGHT,true); //ʾʱλãʹϽλڣ250,80 ShowWindow( hwnd, nShowCmd ); //ShowWindowʾ UpdateWindow(hwnd); //Դڽи£·Ҫװһ //ϷԴijʼʼʧܣһϢ򣬲FALSE if (!Game_Init (hwnd)) { MessageBox(hwnd, L"Դʼʧ", L"Ϣ", 0); //ʹMessageBoxһϢ return FALSE; } PlaySound(L"ɽ¥.wav", NULL, SND_FILENAME | SND_ASYNC|SND_LOOP); //ѭű //5Ϣѭ MSG msg = { 0 }; //岢ʼmsg while( msg.message != WM_QUIT ) //ʹwhileѭϢWM_QUITϢͼѭ { if( PeekMessage( &msg, 0, 0, 0, PM_REMOVE ) ) //鿴ӦóϢУϢʱеϢɷȥ { TranslateMessage( &msg ); //ϢתΪַϢ DispatchMessage( &msg ); //ַһϢڳ } else { g_tNow = GetTickCount(); //ȡǰϵͳʱ if(g_tNow-g_tPre >= 100) //˴ѭϴλͼʱ0.1ʱٽػ Game_Paint(hwnd); } } //6ע UnregisterClass(L"ForTheDreamOfGameDevelop", wndClass.hInstance); //׼ע return 0; } //-----------------------------------WndProc( )-------------------------------------- // ڹ̺WndProc,ԴϢд //------------------------------------------------------------------------------------------------ LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ) { switch( message ) //switch俪ʼ { case WM_KEYDOWN: // Ǽ̰Ϣ if (wParam == VK_ESCAPE) // µļESC DestroyWindow(hwnd); // ٴ, һWM_DESTROYϢ break; //switch case WM_DESTROY: //ǴϢ Game_CleanUp(hwnd); //ԶԴGame_CleanUp˳ǰԴ PostQuitMessage( 0 ); //ϵͳиֹ߳ӦWM_DESTROYϢ break; //switch default: //caseϣִиdefault return DefWindowProc( hwnd, message, wParam, lParam ); //ȱʡĴڹ } return 0; //˳ } //-----------------------------------Game_Init( )-------------------------------------- // ʼһЩ򵥵ijʼ //------------------------------------------------------------------------------------------------ BOOL Game_Init( HWND hwnd ) { g_hdc = GetDC(hwnd); //ȡ豸 wchar_t filename[20]; //λͼ for(int i=0;i<12;i++) { memset(filename, 0, sizeof(filename)); //filenameijʼ swprintf_s(filename,L"%d.bmp",i); //swprintf_sװӦͼƬļ g_hSprite[i] = (HBITMAP)LoadImage(NULL,filename,IMAGE_BITMAP,800,600,LR_LOADFROMFILE); } //-----λͼIJ֮DC----- g_mdc = CreateCompatibleDC(g_hdc); //豸ڴDC Game_Paint(hwnd); return TRUE; } //-----------------------------------Game_Paint( )-------------------------------------- // ƺڴ˺нлƲ //-------------------------------------------------------------------------------------------------- VOID Game_Paint( HWND hwnd ) { if(g_iNum == 11) //жǷ񳬹ͼţͼš10ʾͼΪ"0" g_iNum = 0; SelectObject(g_mdc,g_hSprite[g_iNum]); BitBlt(g_hdc,0,0,800,600,g_mdc,0,0,SRCCOPY); //ĿǰͼŽдͼ g_tPre = GetTickCount(); //¼˴λͼʱ䣬´ϷѭжǷѾﵽ²趨ʱ g_iNum++; //g_iNumֵ1ΪһҪʾͼ } //-----------------------------------Game_CleanUp( )-------------------------------- // Դڴ˺нг˳ǰԴ //--------------------------------------------------------------------------------------------------- BOOL Game_CleanUp( HWND hwnd ) { //ͷԴ for(int i=0;i<12;i++) DeleteObject(g_hSprite[i]); DeleteDC(g_mdc); ReleaseDC(hwnd,g_hdc); return TRUE; } ================================================ FILE: GDI-Game-Demo/12_GDIdemo8.cpp ================================================ //-----------------------------------˵---------------------------------------------- // :GDIdemo8 // 20133 Create by dzī // Ϸ֮͸ //------------------------------------------------------------------------------------------------ //-----------------------------------ͷļ֡--------------------------------------- // ͷļ //------------------------------------------------------------------------------------------------ #include #include //ʹswprintf_sͷļ //-----------------------------------ļ֡--------------------------------------- // Ŀļ //------------------------------------------------------------------------------------------------ #pragma comment(lib,"winmm.lib") //PlaySoundļ #pragma comment(lib,"Msimg32.lib") //ʹTransparentBltĿļ //-----------------------------------궨岿֡-------------------------------------------- // һЩ //------------------------------------------------------------------------------------------------ #define WINDOW_WIDTH 800 //Ϊڿȶĺ꣬Էڴ˴޸Ĵڿ #define WINDOW_HEIGHT 600 //Ϊڸ߶ȶĺ꣬Էڴ˴޸Ĵڸ߶ #define WINDOW_TITLE L"ϨϷ롿Ϸ֮ ͸" //Ϊڱⶨĺ //-----------------------------------ȫֱ֡------------------------------------- // ȫֱ //------------------------------------------------------------------------------------------------ HDC g_hdc=NULL,g_mdc=NULL,g_bufdc=NULL; //ȫ豸ȫڴDC HBITMAP g_hSprite=NULL,g_hBackGround=NULL; //λͼһڴ洢ͼһڴ洢ͼ DWORD g_tPre=0,g_tNow=0; //l¼ʱ,g_tPre¼һλͼʱ䣬g_tNow¼˴׼ͼʱ int g_iNum=0,g_iX=0,g_iY=0; //g_iNum¼ͼ,g_iX,g_iYֱ¼ͼĺ //-----------------------------------ȫֺ֡------------------------------------- // ȫֺֹδıʶϵд //------------------------------------------------------------------------------------------------ LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam );//ڹ̺ BOOL Game_Init(HWND hwnd); //ڴ˺нԴijʼ VOID Game_Paint( HWND hwnd); //ڴ˺нлͼд BOOL Game_CleanUp(HWND hwnd ); //ڴ˺нԴ //-----------------------------------WinMain( )-------------------------------------- // WindowsӦóںǵij↑ʼ //------------------------------------------------------------------------------------------------ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nShowCmd) { //1ڴIJ֮һʼһĴ 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; //ָڹ̵ijʵ 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(WHITE_BRUSH); //ΪhbrBackgroundԱָһɫˢ wndClass.lpszMenuName = NULL; //һԿַָֹ˵Դ֡ wndClass.lpszClassName = L"ForTheDreamOfGameDevelop"; //һԿַָֹ֡ //2ڴIJ֮עᴰ if( !RegisterClassEx( &wndClass ) ) //괰ںҪԴעᣬܴ͵Ĵ return -1; //3ڴIJ֮ʽ HWND hwnd = CreateWindow( L"ForTheDreamOfGameDevelop",WINDOW_TITLE, //ϲּĴںCreateWindow WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, WINDOW_WIDTH, WINDOW_HEIGHT, NULL, NULL, hInstance, NULL ); //4ڴIJ֮ģڵƶʾ MoveWindow(hwnd,250,80,WINDOW_WIDTH,WINDOW_HEIGHT,true); //ʾʱλãʹϽλڣ250,80 ShowWindow( hwnd, nShowCmd ); //ShowWindowʾ UpdateWindow(hwnd); //Դڽи£·Ҫװһ //ϷԴijʼʼʧܣһϢ򣬲FALSE if (!Game_Init (hwnd)) { MessageBox(hwnd, L"Դʼʧ", L"Ϣ", 0); //ʹMessageBoxһϢ return FALSE; } PlaySound(L"ɽԭ澰.wav", NULL, SND_FILENAME | SND_ASYNC|SND_LOOP); //ѭű //5Ϣѭ MSG msg = { 0 }; //岢ʼmsg while( msg.message != WM_QUIT ) //ʹwhileѭϢWM_QUITϢͼѭ { if( PeekMessage( &msg, 0, 0, 0, PM_REMOVE ) ) //鿴ӦóϢУϢʱеϢɷȥ { TranslateMessage( &msg ); //ϢתΪַϢ DispatchMessage( &msg ); //ַһϢڳ } else { g_tNow = GetTickCount(); //ȡǰϵͳʱ if(g_tNow-g_tPre >= 100) //˴ѭϴλͼʱ0.1ʱٽػ Game_Paint(hwnd); } } //6ע UnregisterClass(L"ForTheDreamOfGameDevelop", wndClass.hInstance); //׼ע return 0; } //-----------------------------------WndProc( )-------------------------------------- // ڹ̺WndProc,ԴϢд //------------------------------------------------------------------------------------------------ LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ) { switch( message ) //switch俪ʼ { case WM_KEYDOWN: // Ǽ̰Ϣ if (wParam == VK_ESCAPE) // µļESC DestroyWindow(hwnd); // ٴ, һWM_DESTROYϢ break; //switch case WM_DESTROY: //ǴϢ Game_CleanUp(hwnd); //ԶԴGame_CleanUp˳ǰԴ PostQuitMessage( 0 ); //ϵͳиֹ߳ӦWM_DESTROYϢ break; //switch default: //caseϣִиdefault return DefWindowProc( hwnd, message, wParam, lParam ); //ȱʡĴڹ } return 0; //˳ } //-----------------------------------Game_Init( )-------------------------------------- // ʼһЩ򵥵ijʼ //------------------------------------------------------------------------------------------------ BOOL Game_Init( HWND hwnd ) { HBITMAP bmp; g_hdc = GetDC(hwnd); g_mdc = CreateCompatibleDC(g_hdc); //һhdcݵڴDC g_bufdc = CreateCompatibleDC(g_hdc);//ٴһhdcݵĻDC bmp = CreateCompatibleBitmap(g_hdc,WINDOW_WIDTH,WINDOW_HEIGHT); //һʹڼݵĿյλͼ SelectObject(g_mdc,bmp);//λͼŵmdc g_hSprite = (HBITMAP)LoadImage(NULL,L"goright.bmp",IMAGE_BITMAP,480,108,LR_LOADFROMFILE); g_hBackGround= (HBITMAP)LoadImage(NULL,L"bg.bmp",IMAGE_BITMAP,WINDOW_WIDTH,WINDOW_HEIGHT,LR_LOADFROMFILE); g_iNum = 0; g_iX =0; //ͼʼX g_iY= 350; //ͼʼY Game_Paint(hwnd); return TRUE; } //-----------------------------------Game_Paint( )-------------------------------------- // ƺڴ˺нлƲ //-------------------------------------------------------------------------------------------------- VOID Game_Paint( HWND hwnd ) { if(g_iNum == 8) //жǷ񳬹ͼţͼš7ʾͼΪ"0" g_iNum = 0; //mdcϱͼ SelectObject(g_bufdc,g_hBackGround); BitBlt(g_mdc,0,0,WINDOW_WIDTH,WINDOW_HEIGHT,g_bufdc,0,0,SRCCOPY); //mdcн͸ SelectObject(g_bufdc,g_hSprite); TransparentBlt(g_mdc,g_iX,g_iY,60,108,g_bufdc,g_iNum*60,0,60,108,RGB(255,0,0));//TransparentBlt͸ɫʷ //Ļʾڴ BitBlt(g_hdc,0,0,WINDOW_WIDTH,WINDOW_HEIGHT,g_mdc,0,0,SRCCOPY); g_tPre = GetTickCount(); //¼˴λͼʱ䣬´ϷѭжǷѾﵽ²趨ʱ g_iNum++; //g_iNumֵ1ΪһҪʾͼ g_iX+=10; //´ͼ //ͼ곬ڱԵΪ-60 if(g_iX>=WINDOW_WIDTH) g_iX =-60; } //-----------------------------------Game_CleanUp( )-------------------------------- // Դڴ˺нг˳ǰԴ //--------------------------------------------------------------------------------------------------- BOOL Game_CleanUp( HWND hwnd ) { //ͷԴ DeleteObject(g_hBackGround); DeleteObject(g_hSprite); DeleteDC(g_bufdc); DeleteDC(g_mdc); ReleaseDC(hwnd,g_hdc); return TRUE; } ================================================ FILE: GDI-Game-Demo/13_GDIdemo9.cpp ================================================ //-----------------------------------˵---------------------------------------------- // :GDIdemo10 // 20133 Create by dzī // Ϸʾ֮ͼ ʾ //------------------------------------------------------------------------------------------------ //-----------------------------------ͷļ֡--------------------------------------- // ͷļ //------------------------------------------------------------------------------------------------ #include #include //ʹswprintf_sͷļ #include //ʹûȡϵͳʱtime()Ҫͷļ //-----------------------------------ļ֡--------------------------------------- // Ŀļ //------------------------------------------------------------------------------------------------ #pragma comment(lib,"winmm.lib") //PlaySoundļ #pragma comment(lib,"Msimg32.lib") //ʹTransparentBltĿļ //-----------------------------------궨岿֡-------------------------------------------- // һЩ //------------------------------------------------------------------------------------------------ #define WINDOW_WIDTH 800 //Ϊڿȶĺ꣬Էڴ˴޸Ĵڿ #define WINDOW_HEIGHT 600 //Ϊڸ߶ȶĺ꣬Էڴ˴޸Ĵڸ߶ #define WINDOW_TITLE L"ϨϷ롿Ϸʾ֮ ͼ" //Ϊڱⶨĺ #define SPRITE_NUMBER 30 //SPRITE_NUMBERʾҪֵĿڴ趨Ϊ30 //-----------------------------------ȫֽṹ嶨岿֡------------------------------------- // ȫֽṹ嶨 //------------------------------------------------------------------------------------------------ struct Sprites //spriteṹϵṹԱxyΪͼ꣬directionΪĿǰƶ { int x,y; //xyΪͼ int direction; // directionΪĿǰƶ }; //-----------------------------------ȫֱ֡------------------------------------- // ȫֱ //------------------------------------------------------------------------------------------------ HDC g_hdc=NULL,g_mdc=NULL,g_bufdc=NULL; //ȫ豸ȫڴDC HBITMAP g_hSprite[4],g_hBackGround; //λͼλͼ DWORD g_tPre=0,g_tNow=0; //l¼ʱ,g_tPre¼һλͼʱ䣬g_tNow¼˴׼ͼʱ int g_iPicNum=0,g_iX=0,g_iY=0; //g_iPicNum¼ͼ,g_iX,g_iYֱ¼ͼĺ Sprites Sprite[SPRITE_NUMBER]; //SPRITE_NUMBERֵSprite[] //-----------------------------------ȫֺ֡------------------------------------- // ȫֺֹδıʶϵд //------------------------------------------------------------------------------------------------ LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam );//ڹ̺ BOOL Game_Init(HWND hwnd); //ڴ˺нԴijʼ VOID Game_Paint( HWND hwnd); //ڴ˺нлͼд BOOL Game_CleanUp(HWND hwnd ); //ڴ˺нԴ //-----------------------------------WinMain( )-------------------------------------- // WindowsӦóںǵij↑ʼ //------------------------------------------------------------------------------------------------ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nShowCmd) { //1ڴIJ֮һʼһĴ 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; //ָڹ̵ijʵ 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(WHITE_BRUSH); //ΪhbrBackgroundԱָһɫˢ wndClass.lpszMenuName = NULL; //һԿַָֹ˵Դ֡ wndClass.lpszClassName = L"ForTheDreamOfGameDevelop"; //һԿַָֹ֡ //2ڴIJ֮עᴰ if( !RegisterClassEx( &wndClass ) ) //괰ںҪԴעᣬܴ͵Ĵ return -1; //3ڴIJ֮ʽ HWND hwnd = CreateWindow( L"ForTheDreamOfGameDevelop",WINDOW_TITLE, //ϲּĴںCreateWindow WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, WINDOW_WIDTH, WINDOW_HEIGHT, NULL, NULL, hInstance, NULL ); //4ڴIJ֮ģڵƶʾ MoveWindow(hwnd,250,80,WINDOW_WIDTH,WINDOW_HEIGHT,true); //ʾʱλãʹϽλڣ250,80 ShowWindow( hwnd, nShowCmd ); //ShowWindowʾ UpdateWindow(hwnd); //Դڽи£·Ҫװһ //ϷԴijʼʼʧܣһϢ򣬲FALSE if (!Game_Init (hwnd)) { MessageBox(hwnd, L"Դʼʧ", L"Ϣ", 0); //ʹMessageBoxһϢ return FALSE; } PlaySound(L"OrcTheme.wav", NULL, SND_FILENAME | SND_ASYNC|SND_LOOP); //ѭű //5Ϣѭ MSG msg = { 0 }; //岢ʼmsg while( msg.message != WM_QUIT ) //ʹwhileѭϢWM_QUITϢͼѭ { if( PeekMessage( &msg, 0, 0, 0, PM_REMOVE ) ) //鿴ӦóϢУϢʱеϢɷȥ { TranslateMessage( &msg ); //ϢתΪַϢ DispatchMessage( &msg ); //ַһϢڳ } else { g_tNow = GetTickCount(); //ȡǰϵͳʱ if(g_tNow-g_tPre >= 150) //˴ѭϴλͼʱ0.1ʱٽػ Game_Paint(hwnd); } } //6ע UnregisterClass(L"ForTheDreamOfGameDevelop", wndClass.hInstance); //׼ע return 0; } //-----------------------------------WndProc( )-------------------------------------- // ڹ̺WndProc,ԴϢд //------------------------------------------------------------------------------------------------ LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ) { switch( message ) //switch俪ʼ { case WM_KEYDOWN: // Ǽ̰Ϣ if (wParam == VK_ESCAPE) // µļESC DestroyWindow(hwnd); // ٴ, һWM_DESTROYϢ break; //switch case WM_DESTROY: //ǴϢ Game_CleanUp(hwnd); //ԶԴGame_CleanUp˳ǰԴ PostQuitMessage( 0 ); //ϵͳиֹ߳ӦWM_DESTROYϢ break; //switch default: //caseϣִиdefault return DefWindowProc( hwnd, message, wParam, lParam ); //ȱʡĴڹ } return 0; //˳ } //-----------------------------------BubSort( )-------------------------------------- // ݷ //------------------------------------------------------------------------------------------------ VOID BubSort(int n) { int i,j; bool f; Sprites tmp; for(i=0;i WINDOW_HEIGHT-100) Sprite[i].y = WINDOW_HEIGHT-100; Sprite[i].direction = 1; break; case 2: // Sprite[i].x-= 20; if(Sprite[i].x < 0) Sprite[i].x = 0; Sprite[i].direction = 2; break; case 3: // Sprite[i].x+= 20; if(Sprite[i].x >WINDOW_WIDTH-100) Sprite[i].x = WINDOW_WIDTH-100; Sprite[i].direction = 3; break; } } } //-----------------------------------Game_CleanUp( )-------------------------------- // Դڴ˺нг˳ǰԴ //--------------------------------------------------------------------------------------------------- BOOL Game_CleanUp( HWND hwnd ) { //ͷԴ DeleteObject(g_hBackGround); for (int i=0;i<4;i++) { DeleteObject(g_hSprite[i]); } DeleteDC(g_bufdc); DeleteDC(g_mdc); ReleaseDC(hwnd,g_hdc); return TRUE; } ================================================ FILE: GDI-Game-Demo/14_GDIdemo10.cpp ================================================ //-----------------------------------˵---------------------------------------------- // :GDIdemo10 // 20133 Create by dzī // WindowsϢ֮Ϣ ʾ //------------------------------------------------------------------------------------------------ //-----------------------------------ͷļ֡--------------------------------------- // ͷļ //------------------------------------------------------------------------------------------------ #include #include //ʹswprintf_sͷļ //-----------------------------------ļ֡--------------------------------------- // Ŀļ //------------------------------------------------------------------------------------------------ #pragma comment(lib,"winmm.lib") //PlaySoundļ #pragma comment(lib,"Msimg32.lib") //ʹTransparentBltĿļ //-----------------------------------궨岿֡-------------------------------------------- // һЩ //------------------------------------------------------------------------------------------------ #define WINDOW_WIDTH 800 //Ϊڿȶĺ꣬Էڴ˴޸Ĵڿ #define WINDOW_HEIGHT 600 //Ϊڸ߶ȶĺ꣬Էڴ˴޸Ĵڸ߶ #define WINDOW_TITLE L"ϨϷ롿WindowsϢ֮ Ϣ " //Ϊڱⶨĺ //-----------------------------------ȫֱ֡------------------------------------- // ȫֱ //------------------------------------------------------------------------------------------------ HDC g_hdc=NULL,g_mdc=NULL,g_bufdc=NULL; //ȫ豸ȫڴDC HBITMAP g_hSprite[4]={NULL},g_hBackGround=NULL; //λͼڴ洢ŷͼԼ洢ͼľ DWORD g_tPre=0,g_tNow=0; //l¼ʱ,g_tPre¼һλͼʱ䣬g_tNow¼˴׼ͼʱ int g_iNum=0,g_iX=0,g_iY=0; //g_iNum¼ͼţg_iXg_iYֱʾͼĺ int g_iDirection=0;//g_iDirectionΪƶ0123ϣ£ҷϵƶ //-----------------------------------ȫֺ֡------------------------------------- // ȫֺֹδıʶϵд //------------------------------------------------------------------------------------------------ LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam );//ڹ̺ BOOL Game_Init(HWND hwnd); //ڴ˺нԴijʼ VOID Game_Paint( HWND hwnd); //ڴ˺нлͼд BOOL Game_CleanUp(HWND hwnd ); //ڴ˺нԴ //-----------------------------------WinMain( )-------------------------------------- // WindowsӦóںǵij↑ʼ //------------------------------------------------------------------------------------------------ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nShowCmd) { //1ڴIJ֮һʼһĴ 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; //ָڹ̵ijʵ 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(WHITE_BRUSH); //ΪhbrBackgroundԱָһɫˢ wndClass.lpszMenuName = NULL; //һԿַָֹ˵Դ֡ wndClass.lpszClassName = L"ForTheDreamOfGameDevelop"; //һԿַָֹ֡ //2ڴIJ֮עᴰ if( !RegisterClassEx( &wndClass ) ) //괰ںҪԴעᣬܴ͵Ĵ return -1; //3ڴIJ֮ʽ HWND hwnd = CreateWindow( L"ForTheDreamOfGameDevelop",WINDOW_TITLE, //ϲּĴںCreateWindow WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, WINDOW_WIDTH, WINDOW_HEIGHT, NULL, NULL, hInstance, NULL ); //4ڴIJ֮ģڵƶʾ MoveWindow(hwnd,250,80,WINDOW_WIDTH,WINDOW_HEIGHT,true); //ʾʱλãʹϽλڣ250,80 ShowWindow( hwnd, nShowCmd ); //ShowWindowʾ UpdateWindow(hwnd); //Դڽи£·Ҫװһ //ϷԴijʼʼʧܣһϢ򣬲FALSE if (!Game_Init (hwnd)) { MessageBox(hwnd, L"Դʼʧ", L"Ϣ", 0); //ʹMessageBoxһϢ return FALSE; } PlaySound(L"ɽ».wav", NULL, SND_FILENAME | SND_ASYNC|SND_LOOP); //ѭű //5Ϣѭ MSG msg = { 0 }; //岢ʼmsg while( msg.message != WM_QUIT ) //ʹwhileѭϢWM_QUITϢͼѭ { if( PeekMessage( &msg, 0, 0, 0, PM_REMOVE ) ) //鿴ӦóϢУϢʱеϢɷȥ { TranslateMessage( &msg ); //ϢתΪַϢ DispatchMessage( &msg ); //ַһϢڳ } else { g_tNow = GetTickCount(); //ȡǰϵͳʱ if(g_tNow-g_tPre >= 50) //˴ѭϴλͼʱ0.05ʱٽػ Game_Paint(hwnd); } } //6ע UnregisterClass(L"ForTheDreamOfGameDevelop", wndClass.hInstance); //׼ע return 0; } //-----------------------------------WndProc( )-------------------------------------- // ڹ̺WndProc,ԴϢд //------------------------------------------------------------------------------------------------ LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ) { switch( message ) //switch俪ʼ { case WM_KEYDOWN: //¼Ϣ //жϰ switch (wParam) { case VK_ESCAPE: //¡Esc DestroyWindow(hwnd); // ٴ, һWM_DESTROYϢ PostQuitMessage( 0 ); // break; case VK_UP: //¡ //ݰƶÿΰһΰƶ10λͼXYֵжǷ񳬳 g_iY -= 10; g_iDirection = 0; if(g_iY < 0) g_iY = 0; break; case VK_DOWN: //¡ g_iY += 10; g_iDirection = 1; if(g_iY > WINDOW_HEIGHT-135) g_iY = WINDOW_HEIGHT-135; break; case VK_LEFT: //¡ g_iX -= 10; g_iDirection = 2; if(g_iX < 0) g_iX = 0; break; case VK_RIGHT: //¡ g_iX += 10; g_iDirection = 3; if(g_iX > WINDOW_WIDTH-75) g_iX = WINDOW_WIDTH-75; break; } break; //switch case WM_DESTROY: //ǴϢ Game_CleanUp(hwnd); //ԶԴGame_CleanUp˳ǰԴ PostQuitMessage( 0 ); //ϵͳиֹ߳ӦWM_DESTROYϢ break; //switch default: //caseϣִиdefault return DefWindowProc( hwnd, message, wParam, lParam ); //ȱʡĴڹ } return 0; //˳ } //-----------------------------------Game_Init( )-------------------------------------- // ʼһЩ򵥵ijʼ //------------------------------------------------------------------------------------------------ BOOL Game_Init( HWND hwnd ) { HBITMAP bmp; g_hdc = GetDC(hwnd); g_mdc = CreateCompatibleDC(g_hdc); //һhdcݵڴDC g_bufdc = CreateCompatibleDC(g_hdc);//ٴһhdcݵĻDC bmp = CreateCompatibleBitmap(g_hdc,WINDOW_WIDTH,WINDOW_HEIGHT); //趨ͼʼλúƶ g_iX = 150; g_iY = 350; g_iDirection = 3; g_iNum = 0; SelectObject(g_mdc,bmp); //ظܶͼͼ0,1,2,3ϣ£ƶ g_hSprite[0] = (HBITMAP)LoadImage(NULL,L"go1.bmp",IMAGE_BITMAP,480,216,LR_LOADFROMFILE); g_hSprite[1] = (HBITMAP)LoadImage(NULL,L"go2.bmp",IMAGE_BITMAP,480,216,LR_LOADFROMFILE); g_hSprite[2] = (HBITMAP)LoadImage(NULL,L"go3.bmp",IMAGE_BITMAP,480,216,LR_LOADFROMFILE); g_hSprite[3] = (HBITMAP)LoadImage(NULL,L"go4.bmp",IMAGE_BITMAP,480,216,LR_LOADFROMFILE); g_hBackGround = (HBITMAP)LoadImage(NULL,L"bg.bmp",IMAGE_BITMAP,WINDOW_WIDTH,WINDOW_HEIGHT,LR_LOADFROMFILE); Game_Paint(hwnd); return TRUE; } //-----------------------------------Game_Paint( )-------------------------------------- // ƺڴ˺нлƲ //-------------------------------------------------------------------------------------------------- VOID Game_Paint( HWND hwnd ) { //mdcϱͼ SelectObject(g_bufdc,g_hBackGround); BitBlt(g_mdc,0,0,WINDOW_WIDTH,WINDOW_HEIGHT,g_bufdc,0,0,SRCCOPY); //ĿǰƶȡӦ߶ͼȷȡͼĿ߶ SelectObject(g_bufdc,g_hSprite[g_iDirection]); BitBlt(g_mdc,g_iX,g_iY,60,108,g_bufdc,g_iNum*60,108,SRCAND); BitBlt(g_mdc,g_iX,g_iY,60,108,g_bufdc,g_iNum*60,0,SRCPAINT); //Ļʾڴ BitBlt(g_hdc,0,0,WINDOW_WIDTH,WINDOW_HEIGHT,g_mdc,0,0,SRCCOPY); g_tPre = GetTickCount(); //¼˴λͼʱ g_iNum++; if(g_iNum == 8) g_iNum = 0; } //-----------------------------------Game_CleanUp( )-------------------------------- // Դڴ˺нг˳ǰԴ //--------------------------------------------------------------------------------------------------- BOOL Game_CleanUp( HWND hwnd ) { //ͷԴ DeleteObject(g_hBackGround); for (int i=0;i<4;i++) { DeleteObject(g_hSprite[i]); } DeleteDC(g_bufdc); DeleteDC(g_mdc); ReleaseDC(hwnd,g_hdc); return TRUE; } ================================================ FILE: GDI-Game-Demo/15_GDIdemo11.cpp ================================================ //-----------------------------------˵---------------------------------------------- // :GDIdemo11 // 20133 Create by dzī // WindowsϢ֮ Ϣ ʾ //------------------------------------------------------------------------------------------------ //-----------------------------------ͷļ֡--------------------------------------- // ͷļ //------------------------------------------------------------------------------------------------ #include #include //ʹswprintf_sͷļ //-----------------------------------ļ֡--------------------------------------- // Ŀļ //------------------------------------------------------------------------------------------------ #pragma comment(lib,"winmm.lib") //PlaySoundļ #pragma comment(lib,"Msimg32.lib") //ʹTransparentBltĿļ //-----------------------------------궨岿֡-------------------------------------------- // һЩ //------------------------------------------------------------------------------------------------ #define WINDOW_WIDTH 800 //Ϊڿȶĺ꣬Էڴ˴޸Ĵڿ #define WINDOW_HEIGHT 600 //Ϊڸ߶ȶĺ꣬Էڴ˴޸Ĵڸ߶ #define WINDOW_TITLE L"ϨϷ롿WindowsϢ֮ Ϣ " //Ϊڱⶨĺ //-----------------------------------ȫֽṹ嶨岿֡------------------------------------- // ȫֽṹ嶨 //------------------------------------------------------------------------------------------------ struct SwordBullets //SwordBulletsṹӵ { int x,y; //ӵ bool exist; //ӵǷ }; //-----------------------------------ȫֱ֡------------------------------------- // ȫֱ //------------------------------------------------------------------------------------------------ HDC g_hdc=NULL,g_mdc=NULL,g_bufdc=NULL; //ȫ豸ȫڴDC HBITMAP g_hSwordMan=NULL,g_hSwordBlade=NULL,g_hBackGround=NULL; //λͼڴ洢λͼԴ DWORD g_tPre=0,g_tNow=0; //l¼ʱ,g_tPre¼һλͼʱ䣬g_tNow¼˴׼ͼʱ int g_iX=0,g_iY=0,g_iXnow=0,g_iYnow=0; //g_iX,g_iYλãg_iXnowg_iYnowǰ꣬Ҳͼλ int g_iBGOffset=0,g_iBulletNum=0; //g_iBGOffsetΪҪüȣg_iBulletNum¼нӵĿ SwordBullets Bullet[30]; //һSwordBullets͵飬洢Ľӵ //-----------------------------------ȫֺ֡------------------------------------- // ȫֺֹδıʶϵд //------------------------------------------------------------------------------------------------ LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam );//ڹ̺ BOOL Game_Init(HWND hwnd); //ڴ˺нԴijʼ VOID Game_Paint( HWND hwnd); //ڴ˺нлͼд BOOL Game_CleanUp(HWND hwnd ); //ڴ˺нԴ //-----------------------------------WinMain( )-------------------------------------- // WindowsӦóںǵij↑ʼ //------------------------------------------------------------------------------------------------ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nShowCmd) { //1ڴIJ֮һʼһĴ 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; //ָڹ̵ijʵ 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(WHITE_BRUSH); //ΪhbrBackgroundԱָһɫˢ wndClass.lpszMenuName = NULL; //һԿַָֹ˵Դ֡ wndClass.lpszClassName = L"ForTheDreamOfGameDevelop"; //һԿַָֹ֡ //2ڴIJ֮עᴰ if( !RegisterClassEx( &wndClass ) ) //괰ںҪԴעᣬܴ͵Ĵ return -1; //3ڴIJ֮ʽ HWND hwnd = CreateWindow( L"ForTheDreamOfGameDevelop",WINDOW_TITLE, //ϲּĴںCreateWindow WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, WINDOW_WIDTH, WINDOW_HEIGHT, NULL, NULL, hInstance, NULL ); //4ڴIJ֮ģڵƶʾ MoveWindow(hwnd,250,80,WINDOW_WIDTH,WINDOW_HEIGHT,true); //ʾʱλãʹϽλڣ250,80 ShowWindow( hwnd, nShowCmd ); //ShowWindowʾ UpdateWindow(hwnd); //Դڽи£·Ҫװһ //ϷԴijʼʼʧܣһϢ򣬲FALSE if (!Game_Init (hwnd)) { MessageBox(hwnd, L"Դʼʧ", L"Ϣ", 0); //ʹMessageBoxһϢ return FALSE; } PlaySound(L"ɽԭս3.wav", NULL, SND_FILENAME | SND_ASYNC|SND_LOOP); //ѭű //5Ϣѭ MSG msg = { 0 }; //岢ʼmsg while( msg.message != WM_QUIT ) //ʹwhileѭϢWM_QUITϢͼѭ { if( PeekMessage( &msg, 0, 0, 0, PM_REMOVE ) ) //鿴ӦóϢУϢʱеϢɷȥ { TranslateMessage( &msg ); //ϢתΪַϢ DispatchMessage( &msg ); //ַһϢڳ } else { g_tNow = GetTickCount(); //ȡǰϵͳʱ if(g_tNow-g_tPre >= 5) //˴ѭϴλͼʱ0.1ʱٽػ Game_Paint(hwnd); } } //6ע UnregisterClass(L"ForTheDreamOfGameDevelop", wndClass.hInstance); //׼ע return 0; } //-----------------------------------WndProc( )-------------------------------------- // ڹ̺WndProc,ԴϢд //------------------------------------------------------------------------------------------------ LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ) { switch( message ) //switch俪ʼ { case WM_KEYDOWN: //¼Ϣ //жϰ switch (wParam) { case VK_ESCAPE: //¡Esc DestroyWindow(hwnd); // ٴ, һWM_DESTROYϢ PostQuitMessage( 0 ); // break; } break; case WM_LBUTTONDOWN: //Ϣ for(int i=0;i<30;i++) { if(!Bullet[i].exist) { Bullet[i].x = g_iXnow; //ӵx Bullet[i].y = g_iYnow + 30; //ӵy Bullet[i].exist = true; g_iBulletNum++; //ۼӽӵĿ break; } } case WM_MOUSEMOVE: //ƶϢ //XĴ g_iX = LOWORD(lParam); //ȡX if(g_iX > WINDOW_WIDTH-317) //ٽ g_iX = WINDOW_WIDTH-317; else if(g_iX < 0) g_iX = 0; //YĴ g_iY = HIWORD(lParam); //ȡY if(g_iY > WINDOW_HEIGHT-283) g_iY = WINDOW_HEIGHT-283; else if(g_iY < -200) g_iY = -200; break; case WM_DESTROY: //ǴϢ Game_CleanUp(hwnd); //ԶԴGame_CleanUp˳ǰԴ PostQuitMessage( 0 ); //ϵͳиֹ߳ӦWM_DESTROYϢ break; //switch default: //caseϣִиdefault return DefWindowProc( hwnd, message, wParam, lParam ); //ȱʡĴڹ } return 0; //˳ } //-----------------------------------Game_Init( )-------------------------------------- // ʼһЩ򵥵ijʼ //------------------------------------------------------------------------------------------------ BOOL Game_Init( HWND hwnd ) { HBITMAP bmp; g_hdc = GetDC(hwnd); g_mdc = CreateCompatibleDC(g_hdc); //һhdcݵڴDC g_bufdc = CreateCompatibleDC(g_hdc);//ٴһhdcݵĻDC bmp = CreateCompatibleBitmap(g_hdc,WINDOW_WIDTH,WINDOW_HEIGHT); //趨ͼʼֵλóʼֵ g_iX = 300; g_iY = 100; g_iXnow = 300; g_iYnow = 100; SelectObject(g_mdc,bmp); //ظܶͼͼ g_hSwordMan = (HBITMAP)LoadImage(NULL,L"swordman.bmp",IMAGE_BITMAP,317,283,LR_LOADFROMFILE); g_hSwordBlade = (HBITMAP)LoadImage(NULL,L"swordblade.bmp",IMAGE_BITMAP,100,26,LR_LOADFROMFILE); g_hBackGround = (HBITMAP)LoadImage(NULL,L"bg.bmp",IMAGE_BITMAP,WINDOW_WIDTH,WINDOW_HEIGHT,LR_LOADFROMFILE); POINT pt,lt,rb; RECT rect; //趨λ pt.x = 300; pt.y = 100; ClientToScreen(hwnd,&pt); SetCursorPos(pt.x,pt.y); ShowCursor(false); // //ƶ GetClientRect(hwnd,&rect); //ȡôڲ //ϵlt lt.x = rect.left; lt.y = rect.top; //rb rb.x = rect.right; rb.y = rect.bottom; //ltrbĴתΪĻ ClientToScreen(hwnd,<); ClientToScreen(hwnd,&rb); //Ļ趨 rect.left = lt.x; rect.top = lt.y; rect.right = rb.x; rect.bottom = rb.y; //ƶ ClipCursor(&rect); Game_Paint(hwnd); return TRUE; } //-----------------------------------Game_Paint( )-------------------------------------- // ƺڴ˺нлƲ //-------------------------------------------------------------------------------------------------- VOID Game_Paint( HWND hwnd ) { //mdcϱͼ SelectObject(g_bufdc,g_hBackGround); BitBlt(g_mdc,0,0,g_iBGOffset,WINDOW_HEIGHT,g_bufdc,WINDOW_WIDTH-g_iBGOffset,0,SRCCOPY); BitBlt(g_mdc,g_iBGOffset,0,WINDOW_WIDTH-g_iBGOffset,WINDOW_HEIGHT,g_bufdc,0,0,SRCCOPY); wchar_t str[20] = {}; //㽣ͼ꣬趨ÿνнͼʱͼ꣨g_iXnowg_iYnow10λڵĿĵ㣨xyӽֱͬΪֹ if(g_iXnow < g_iX)//ǰͼXСX { g_iXnow += 10; if(g_iXnow > g_iX) g_iXnow = g_iX; } else //ǰͼXX { g_iXnow -=10; if(g_iXnow < g_iX) g_iXnow = g_iX; } if(g_iYnow < g_iY) //ǰͼYСY { g_iYnow += 10; if(g_iYnow > g_iY) g_iYnow = g_iY; } else //ǰͼYY { g_iYnow -= 10; if(g_iYnow < g_iY) g_iYnow = g_iY; } //Ͻͼ SelectObject(g_bufdc,g_hSwordMan); TransparentBlt(g_mdc,g_iXnow,g_iYnow,317,283,g_bufdc,0,0,317,283,RGB(0,0,0)); //ӵͼжϽӵĿg_iBulletNumֵǷΪ0Ϊ0ԽӵиڵĽӵڵ꣨b[i].x,b[i].yѭͼ SelectObject(g_bufdc,g_hSwordBlade); if(g_iBulletNum!=0) for(int i=0;i<30;i++) if(Bullet[i].exist) { //Ͻӵͼ TransparentBlt(g_mdc,Bullet[i].x-70,Bullet[i].y+100,100,33,g_bufdc,0,0,100,26,RGB(0,0,0)); //һӵꡣӵǴģˣÿXϵֵݼ10λͼƶЧӵ´εѳڵĿɼΧh[i].x<0,ôӵΪڣӵg_iBulletNumֵ1. Bullet[i].x -= 10; if(Bullet[i].x < 0) { g_iBulletNum--; Bullet[i].exist = false; } } HFONT hFont; hFont=CreateFont(20,0,0,0,0,0,0,0,GB2312_CHARSET,0,0,0,0,TEXT("΢ź")); // SelectObject(g_mdc,hFont); //ѡ嵽g_mdc SetBkMode(g_mdc, TRANSPARENT); //ֱ͸ SetTextColor(g_mdc,RGB(255,255,0)); //ɫ //Ͻǽ swprintf_s(str,L"XΪ%d ",g_iX); TextOut(g_mdc,0,0,str,wcslen(str)); swprintf_s(str,L"YΪ%d ",g_iY); TextOut(g_mdc,0,20,str,wcslen(str)); //ϱͼ BitBlt(g_hdc,0,0,WINDOW_WIDTH,WINDOW_HEIGHT,g_mdc,0,0,SRCCOPY); g_tPre = GetTickCount(); g_iBGOffset += 5; //ñ+5 if(g_iBGOffset==WINDOW_WIDTH)//ﵽ˱ֵ g_iBGOffset = 0; } //-----------------------------------Game_CleanUp( )-------------------------------- // Դڴ˺нг˳ǰԴ //--------------------------------------------------------------------------------------------------- BOOL Game_CleanUp( HWND hwnd ) { //ͷԴ DeleteObject(g_hBackGround); DeleteDC(g_bufdc); DeleteDC(g_mdc); ReleaseDC(hwnd,g_hdc); return TRUE; } ================================================ FILE: GDI-Game-Demo/16_GDIdemo12.cpp ================================================ //-----------------------------------˵---------------------------------------------- // :GDIdemo12 // 20133 Create by dzī // ˶ģ֮ ŭС ʾ //------------------------------------------------------------------------------------------------ //-----------------------------------ͷļ֡--------------------------------------- // ͷļ //------------------------------------------------------------------------------------------------ #include #include //ʹswprintf_sͷļ //-----------------------------------ļ֡--------------------------------------- // Ŀļ //------------------------------------------------------------------------------------------------ #pragma comment(lib,"winmm.lib") //PlaySoundļ #pragma comment(lib,"Msimg32.lib") //ʹTransparentBltĿļ //-----------------------------------궨岿֡-------------------------------------------- // һЩ //------------------------------------------------------------------------------------------------ #define WINDOW_WIDTH 800 //Ϊڿȶĺ꣬Էڴ˴޸Ĵڿ #define WINDOW_HEIGHT 600 //Ϊڸ߶ȶĺ꣬Էڴ˴޸Ĵڸ߶ #define WINDOW_TITLE L"ϨϷ롿˶ģ֮ ŭСʾ" //Ϊڱⶨĺ //-----------------------------------ȫֱ֡------------------------------------- // ȫֱ //------------------------------------------------------------------------------------------------ HDC g_hdc=NULL,g_mdc=NULL,g_bufdc=NULL; //ȫ豸ȫڴDC HBITMAP g_hAngrybird=NULL,g_hBackGround=NULL; //λͼڴ洢λͼԴ DWORD g_tPre=0,g_tNow=0; //¼ʱ,g_tPre¼һλͼʱ䣬g_tNow¼˴׼ͼʱ int g_iX=0,g_iY=0,g_iXSpeed=0,g_iYSpeed=0; //g_iX,g_iYͼλãg_iXSpeed,g_iYSpeedʾXYϵٶ RECT g_rect; //һRECTṹ壬ڴڲ //-----------------------------------ȫֺ֡------------------------------------- // ȫֺֹδıʶϵд //------------------------------------------------------------------------------------------------ LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam );//ڹ̺ BOOL Game_Init(HWND hwnd); //ڴ˺нԴijʼ VOID Game_Paint( HWND hwnd); //ڴ˺нлͼд BOOL Game_CleanUp(HWND hwnd ); //ڴ˺нԴ //-----------------------------------WinMain( )-------------------------------------- // WindowsӦóںǵij↑ʼ //------------------------------------------------------------------------------------------------ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nShowCmd) { //1ڴIJ֮һʼһĴ 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; //ָڹ̵ijʵ 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(WHITE_BRUSH); //ΪhbrBackgroundԱָһɫˢ wndClass.lpszMenuName = NULL; //һԿַָֹ˵Դ֡ wndClass.lpszClassName = L"ForTheDreamOfGameDevelop"; //һԿַָֹ֡ //2ڴIJ֮עᴰ if( !RegisterClassEx( &wndClass ) ) //괰ںҪԴעᣬܴ͵Ĵ return -1; //3ڴIJ֮ʽ HWND hwnd = CreateWindow( L"ForTheDreamOfGameDevelop",WINDOW_TITLE, //ϲּĴںCreateWindow WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, WINDOW_WIDTH, WINDOW_HEIGHT, NULL, NULL, hInstance, NULL ); //4ڴIJ֮ģڵƶʾ MoveWindow(hwnd,250,80,WINDOW_WIDTH,WINDOW_HEIGHT,true); //ʾʱλãʹϽλڣ250,80 ShowWindow( hwnd, nShowCmd ); //ShowWindowʾ UpdateWindow(hwnd); //Դڽи£·Ҫװһ //ϷԴijʼʼʧܣһϢ򣬲FALSE if (!Game_Init (hwnd)) { MessageBox(hwnd, L"Դʼʧ", L"Ϣ", 0); //ʹMessageBoxһϢ return FALSE; } PlaySound(L"֥.wav", NULL, SND_FILENAME | SND_ASYNC|SND_LOOP); //ѭű //5Ϣѭ MSG msg = { 0 }; //岢ʼmsg while( msg.message != WM_QUIT ) //ʹwhileѭϢWM_QUITϢͼѭ { if( PeekMessage( &msg, 0, 0, 0, PM_REMOVE ) ) //鿴ӦóϢУϢʱеϢɷȥ { TranslateMessage( &msg ); //ϢתΪַϢ DispatchMessage( &msg ); //ַһϢڳ } else { g_tNow = GetTickCount(); //ȡǰϵͳʱ if(g_tNow-g_tPre >= 20) //˴ѭϴλͼʱ0.1ʱٽػ Game_Paint(hwnd); } } //6ע UnregisterClass(L"ForTheDreamOfGameDevelop", wndClass.hInstance); //׼ע return 0; } //-----------------------------------WndProc( )-------------------------------------- // ڹ̺WndProc,ԴϢд //------------------------------------------------------------------------------------------------ LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ) { switch( message ) //switch俪ʼ { case WM_KEYDOWN: //Ϣ if(wParam==VK_ESCAPE) //¡Esc PostQuitMessage(0); break; case WM_DESTROY: //ǴϢ Game_CleanUp(hwnd); //ԶԴGame_CleanUp˳ǰԴ PostQuitMessage( 0 ); //ϵͳиֹ߳ӦWM_DESTROYϢ break; //switch default: //caseϣִиdefault return DefWindowProc( hwnd, message, wParam, lParam ); //ȱʡĴڹ } return 0; //˳ } //-----------------------------------Game_Init( )-------------------------------------- // ʼһЩ򵥵ijʼ //------------------------------------------------------------------------------------------------ BOOL Game_Init( HWND hwnd ) { HBITMAP bmp; g_hdc = GetDC(hwnd); g_mdc = CreateCompatibleDC(g_hdc); //һhdcݵڴDC g_bufdc = CreateCompatibleDC(g_hdc);//ٴһhdcݵĻDC bmp = CreateCompatibleBitmap(g_hdc,WINDOW_WIDTH,WINDOW_HEIGHT); //һʹڼݵĿյλͼ SelectObject(g_mdc,bmp); //ϷλͼԴ g_hBackGround = (HBITMAP)LoadImage(NULL,L"bg.bmp",IMAGE_BITMAP,WINDOW_WIDTH,WINDOW_HEIGHT,LR_LOADFROMFILE); g_hAngrybird = (HBITMAP)LoadImage(NULL,L"angrybird.bmp",IMAGE_BITMAP,120,60,LR_LOADFROMFILE); GetClientRect(hwnd,&g_rect); //ȡڲĴС //Сijʼͳʼٶ g_iX=50; g_iY=50; g_iXSpeed=20; g_iYSpeed=20; Game_Paint(hwnd); return TRUE; } //-----------------------------------Game_Paint( )-------------------------------------- // ƺڴ˺нлƲ //-------------------------------------------------------------------------------------------------- VOID Game_Paint( HWND hwnd ) { //mdcϱͼ SelectObject(g_bufdc,g_hBackGround); BitBlt(g_mdc,0,0,WINDOW_WIDTH,WINDOW_HEIGHT,g_bufdc,0,0,SRCCOPY); //ݵǰСͼ SelectObject(g_bufdc,g_hAngrybird); BitBlt(g_mdc,g_iX,g_iY,60,60,g_bufdc,60,0,SRCAND); BitBlt(g_mdc,g_iX,g_iY,60,60,g_bufdc,0,0,SRCPAINT); //g_mdcеg_hdc BitBlt(g_hdc,0,0,WINDOW_WIDTH,WINDOW_HEIGHT,g_mdc,0,0,SRCCOPY); //Xͼٶ g_iX += g_iXSpeed; //ͼ //ڱԵٶȷ if(g_iX <= 0) { g_iX = 0; g_iXSpeed = -g_iXSpeed; } else if(g_iX >= g_rect.right-60) { g_iX = g_rect.right - 60; g_iXSpeed = -g_iXSpeed; } //Yͼٶ g_iY += g_iYSpeed; //ͼ //ڱԵٶȷ if(g_iY<=0) { g_iY = 0; g_iYSpeed = -g_iYSpeed; } else if(g_iY >= g_rect.bottom-60) { g_iY = g_rect.bottom - 60; g_iYSpeed = -g_iYSpeed; } g_tPre = GetTickCount(); //¼˴λͼʱ } //-----------------------------------Game_CleanUp( )-------------------------------- // Դڴ˺нг˳ǰԴ //--------------------------------------------------------------------------------------------------- BOOL Game_CleanUp( HWND hwnd ) { //ͷԴ DeleteObject(g_hBackGround); DeleteObject(g_hAngrybird); DeleteDC(g_bufdc); DeleteDC(g_mdc); ReleaseDC(hwnd,g_hdc); return TRUE; } ================================================ FILE: GDI-Game-Demo/17_GDIdemo13.cpp ================================================ //-----------------------------------˵---------------------------------------------- // :GDIdemo13 // 20133 Create by dzī // ŭСģ ʾ //------------------------------------------------------------------------------------------------ //-----------------------------------ͷļ֡--------------------------------------- // ͷļ //------------------------------------------------------------------------------------------------ #include #include //ʹswprintf_sͷļ //-----------------------------------ļ֡--------------------------------------- // Ŀļ //------------------------------------------------------------------------------------------------ #pragma comment(lib,"winmm.lib") //PlaySoundļ #pragma comment(lib,"Msimg32.lib") //ʹTransparentBltĿļ //-----------------------------------궨岿֡-------------------------------------------- // һЩ //------------------------------------------------------------------------------------------------ #define WINDOW_WIDTH 800 //Ϊڿȶĺ꣬Էڴ˴޸Ĵڿ #define WINDOW_HEIGHT 600 //Ϊڸ߶ȶĺ꣬Էڴ˴޸Ĵڸ߶ #define WINDOW_TITLE L"ϨϷ롿ŭСģdemo" //Ϊڱⶨĺ //-----------------------------------ȫֱ֡------------------------------------- // ȫֱ //------------------------------------------------------------------------------------------------ HDC g_hdc=NULL,g_mdc=NULL,g_bufdc=NULL; //ȫ豸ȫڴDC HBITMAP g_hAngrybird=NULL,g_hBackGround=NULL; //λͼڴ洢λͼԴ DWORD g_tPre=0,g_tNow=0; //l¼ʱ,g_tPre¼һλͼʱ䣬g_tNow¼˴׼ͼʱ int g_iX=0,g_iY=0,g_iXSpeed=0,g_iYSpeed=0,g_iYGravity=0; //g_iX,g_iYͼλãg_iXSpeed,g_iYSpeedʾXYϵٶ,g_iYGravityʾٶ RECT g_rect; //һRECTṹ壬ڴڲ //-----------------------------------ȫֺ֡------------------------------------- // ȫֺֹδıʶϵд //------------------------------------------------------------------------------------------------ LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam );//ڹ̺ BOOL Game_Init(HWND hwnd); //ڴ˺нԴijʼ VOID Game_Paint( HWND hwnd); //ڴ˺нлͼд BOOL Game_CleanUp(HWND hwnd ); //ڴ˺нԴ //-----------------------------------WinMain( )-------------------------------------- // WindowsӦóںǵij↑ʼ //------------------------------------------------------------------------------------------------ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nShowCmd) { //1ڴIJ֮һʼһĴ 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; //ָڹ̵ijʵ 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(WHITE_BRUSH); //ΪhbrBackgroundԱָһɫˢ wndClass.lpszMenuName = NULL; //һԿַָֹ˵Դ֡ wndClass.lpszClassName = L"ForTheDreamOfGameDevelop"; //һԿַָֹ֡ //2ڴIJ֮עᴰ if( !RegisterClassEx( &wndClass ) ) //괰ںҪԴעᣬܴ͵Ĵ return -1; //3ڴIJ֮ʽ HWND hwnd = CreateWindow( L"ForTheDreamOfGameDevelop",WINDOW_TITLE, //ϲּĴںCreateWindow WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, WINDOW_WIDTH, WINDOW_HEIGHT, NULL, NULL, hInstance, NULL ); //4ڴIJ֮ģڵƶʾ MoveWindow(hwnd,250,80,WINDOW_WIDTH,WINDOW_HEIGHT,true); //ʾʱλãʹϽλڣ250,80 ShowWindow( hwnd, nShowCmd ); //ShowWindowʾ UpdateWindow(hwnd); //Դڽи£·Ҫװһ //ϷԴijʼʼʧܣһϢ򣬲FALSE if (!Game_Init (hwnd)) { MessageBox(hwnd, L"Դʼʧ", L"Ϣ", 0); //ʹMessageBoxһϢ return FALSE; } PlaySound(L"ӥ른.wav", NULL, SND_FILENAME | SND_ASYNC|SND_LOOP); //ѭű //5Ϣѭ MSG msg = { 0 }; //岢ʼmsg while( msg.message != WM_QUIT ) //ʹwhileѭϢWM_QUITϢͼѭ { if( PeekMessage( &msg, 0, 0, 0, PM_REMOVE ) ) //鿴ӦóϢУϢʱеϢɷȥ { TranslateMessage( &msg ); //ϢתΪַϢ DispatchMessage( &msg ); //ַһϢڳ } else { g_tNow = GetTickCount(); //ȡǰϵͳʱ if(g_tNow-g_tPre >= 20) //˴ѭϴλͼʱ0.1ʱٽػ Game_Paint(hwnd); } } //6ע UnregisterClass(L"ForTheDreamOfGameDevelop", wndClass.hInstance); //׼ע return 0; } //-----------------------------------WndProc( )-------------------------------------- // ڹ̺WndProc,ԴϢд //------------------------------------------------------------------------------------------------ LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ) { switch( message ) //switch俪ʼ { case WM_KEYDOWN: //Ϣ if(wParam==VK_ESCAPE) //¡Esc PostQuitMessage(0); break; case WM_DESTROY: //ǴϢ Game_CleanUp(hwnd); //ԶԴGame_CleanUp˳ǰԴ PostQuitMessage( 0 ); //ϵͳиֹ߳ӦWM_DESTROYϢ break; //switch default: //caseϣִиdefault return DefWindowProc( hwnd, message, wParam, lParam ); //ȱʡĴڹ } return 0; //˳ } //-----------------------------------Game_Init( )-------------------------------------- // ʼһЩ򵥵ijʼ //------------------------------------------------------------------------------------------------ BOOL Game_Init( HWND hwnd ) { HBITMAP bmp; g_hdc = GetDC(hwnd); g_mdc = CreateCompatibleDC(g_hdc); //һhdcݵڴDC g_bufdc = CreateCompatibleDC(g_hdc);//ٴһhdcݵĻDC bmp = CreateCompatibleBitmap(g_hdc,WINDOW_WIDTH,WINDOW_HEIGHT); //һʹڼݵĿյλͼ SelectObject(g_mdc,bmp);//λͼŵg_mdc //ϷλͼԴ g_hBackGround = (HBITMAP)LoadImage(NULL,L"bg.bmp",IMAGE_BITMAP,WINDOW_WIDTH,WINDOW_HEIGHT,LR_LOADFROMFILE); g_hAngrybird = (HBITMAP)LoadImage(NULL,L"angrybird.bmp",IMAGE_BITMAP,120,60,LR_LOADFROMFILE); GetClientRect(hwnd,&g_rect); //ȡڲĴС //øʼֵ g_iX=0; //ʼg_iX=0 g_iY=100;//ʼg_iY=100 g_iXSpeed=3; //ʼˮƽٶg_iXSpeed=3 g_iYSpeed=0; //ʼֱٶg_iYSpeed=0 g_iYGravity=3; //ٶΪʾ㣬Ϊ3 Game_Paint(hwnd); return TRUE; } //-----------------------------------Game_Paint( )-------------------------------------- // ƺڴ˺нлƲ //-------------------------------------------------------------------------------------------------- VOID Game_Paint( HWND hwnd ) { //mdcϱͼ SelectObject(g_bufdc,g_hBackGround); BitBlt(g_mdc,0,0,WINDOW_WIDTH,WINDOW_HEIGHT,g_bufdc,0,0,SRCCOPY); //Сͼ SelectObject(g_bufdc,g_hAngrybird); BitBlt(g_mdc,g_iX,g_iY,60,60,g_bufdc,60,0,SRCAND); BitBlt(g_mdc,g_iX,g_iY,60,60,g_bufdc,0,0,SRCPAINT); //g_mdcеg_hdc BitBlt(g_hdc,0,0,WINDOW_WIDTH,WINDOW_HEIGHT,g_mdc,0,0,SRCCOPY); //ϵͳʵִ g_iX += g_iXSpeed; //X᷽ͼ꣬ÿһGame_Paintxͼһ㶨vx൱˶ g_iYSpeed = g_iYSpeed + g_iYGravity; //Y᷽ٶȷg_iYSpeedÿһGame_Paintĵþͼһg_iYGravityٶȣ g_iY += g_iYSpeed; //Y᷽ͼ꣬ÿһGame_Paintyͼһոıg_iYSpeed൱ڼ˶ //жǷ񴥵أڱ߽磬g_iYSpeedΪ෴ if(g_iY >= g_rect.bottom-60) { g_iY= g_rect.bottom - 60; g_iYSpeed= -g_iYSpeed; } g_tPre = GetTickCount(); //¼˴λͼʱ } //-----------------------------------Game_CleanUp( )-------------------------------- // Դڴ˺нг˳ǰԴ //--------------------------------------------------------------------------------------------------- BOOL Game_CleanUp( HWND hwnd ) { //ͷԴ DeleteObject(g_hBackGround); DeleteObject(g_hAngrybird); DeleteDC(g_bufdc); DeleteDC(g_mdc); ReleaseDC(hwnd,g_hdc); return TRUE; } ================================================ FILE: GDI-Game-Demo/18_GDIdemo14.cpp ================================================ //-----------------------------------˵---------------------------------------------- // :GDIdemo14 // 20133 Create by dzī // ŭСĦģ ʾ //------------------------------------------------------------------------------------------------ //-----------------------------------ͷļ֡--------------------------------------- // ͷļ //------------------------------------------------------------------------------------------------ #include #include //ʹswprintf_sͷļ //-----------------------------------ļ֡--------------------------------------- // Ŀļ //------------------------------------------------------------------------------------------------ #pragma comment(lib,"winmm.lib") //PlaySoundļ #pragma comment(lib,"Msimg32.lib") //ʹTransparentBltĿļ //-----------------------------------궨岿֡-------------------------------------------- // һЩ //------------------------------------------------------------------------------------------------ #define WINDOW_WIDTH 800 //Ϊڿȶĺ꣬Էڴ˴޸Ĵڿ #define WINDOW_HEIGHT 600 //Ϊڸ߶ȶĺ꣬Էڴ˴޸Ĵڸ߶ #define WINDOW_TITLE L"ϨϷ롿ŭСĦģdemo" //Ϊڱⶨĺ //-----------------------------------ȫֱ֡------------------------------------- // ȫֱ //------------------------------------------------------------------------------------------------ HDC g_hdc=NULL,g_mdc=NULL,g_bufdc=NULL; //ȫ豸ȫڴDC HBITMAP g_hAngrybird=NULL,g_hBackGround=NULL; //λͼڴ洢ͼƬز DWORD g_tPre=0,g_tNow=0; //l¼ʱ,g_tPre¼һλͼʱ䣬g_tNow¼˴׼ͼʱ int g_iX,g_iY,g_iXSpeed,g_iYSpeed; //g_iX,g_iYͼλãg_iXSpeed,g_iYSpeedʾXYϵٶ int g_iYGravity=0,g_iXFriction=0,g_iYFriction=0; //ٶg_iYGravityxĦΪg_iXFrictionfĦΪg_iYFriction RECT g_rect; //һRECTṹ壬ڴڲ //-----------------------------------ȫֺ֡------------------------------------- // ȫֺֹδıʶϵд //------------------------------------------------------------------------------------------------ LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam );//ڹ̺ BOOL Game_Init(HWND hwnd); //ڴ˺нԴijʼ VOID Game_Paint( HWND hwnd); //ڴ˺нлͼд BOOL Game_CleanUp(HWND hwnd ); //ڴ˺нԴ //-----------------------------------WinMain( )-------------------------------------- // WindowsӦóںǵij↑ʼ //------------------------------------------------------------------------------------------------ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nShowCmd) { //1ڴIJ֮һʼһĴ 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; //ָڹ̵ijʵ 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(WHITE_BRUSH); //ΪhbrBackgroundԱָһɫˢ wndClass.lpszMenuName = NULL; //һԿַָֹ˵Դ֡ wndClass.lpszClassName = L"ForTheDreamOfGameDevelop"; //һԿַָֹ֡ //2ڴIJ֮עᴰ if( !RegisterClassEx( &wndClass ) ) //괰ںҪԴעᣬܴ͵Ĵ return -1; //3ڴIJ֮ʽ HWND hwnd = CreateWindow( L"ForTheDreamOfGameDevelop",WINDOW_TITLE, //ϲּĴںCreateWindow WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, WINDOW_WIDTH, WINDOW_HEIGHT, NULL, NULL, hInstance, NULL ); //4ڴIJ֮ģڵƶʾ MoveWindow(hwnd,250,80,WINDOW_WIDTH,WINDOW_HEIGHT,true); //ʾʱλãʹϽλڣ250,80 ShowWindow( hwnd, nShowCmd ); //ShowWindowʾ UpdateWindow(hwnd); //Դڽи£·Ҫװһ //ϷԴijʼʼʧܣһϢ򣬲FALSE if (!Game_Init (hwnd)) { MessageBox(hwnd, L"Դʼʧ", L"Ϣ", 0); //ʹMessageBoxһϢ return FALSE; } PlaySound(L"NOIR2.wav", NULL, SND_FILENAME | SND_ASYNC|SND_LOOP); //ѭű //5Ϣѭ MSG msg = { 0 }; //岢ʼmsg while( msg.message != WM_QUIT ) //ʹwhileѭϢWM_QUITϢͼѭ { if( PeekMessage( &msg, 0, 0, 0, PM_REMOVE ) ) //鿴ӦóϢУϢʱеϢɷȥ { TranslateMessage( &msg ); //ϢתΪַϢ DispatchMessage( &msg ); //ַһϢڳ } else { g_tNow = GetTickCount(); //ȡǰϵͳʱ if(g_tNow-g_tPre >= 40) //˴ѭϴλͼʱ0.04ʱٽػ Game_Paint(hwnd); } } //6ע UnregisterClass(L"ForTheDreamOfGameDevelop", wndClass.hInstance); //׼ע return 0; } //-----------------------------------WndProc( )-------------------------------------- // ڹ̺WndProc,ԴϢд //------------------------------------------------------------------------------------------------ LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ) { switch( message ) //switch俪ʼ { case WM_KEYDOWN: //Ϣ if(wParam==VK_ESCAPE) //¡Esc PostQuitMessage(0); break; case WM_DESTROY: //ǴϢ Game_CleanUp(hwnd); //ԶԴGame_CleanUp˳ǰԴ PostQuitMessage( 0 ); //ϵͳиֹ߳ӦWM_DESTROYϢ break; //switch default: //caseϣִиdefault return DefWindowProc( hwnd, message, wParam, lParam ); //ȱʡĴڹ } return 0; //˳ } //-----------------------------------Game_Init( )-------------------------------------- // ʼһЩ򵥵ijʼ //------------------------------------------------------------------------------------------------ BOOL Game_Init( HWND hwnd ) { HBITMAP bmp; g_hdc = GetDC(hwnd); g_mdc = CreateCompatibleDC(g_hdc); //һhdcݵڴDC g_bufdc = CreateCompatibleDC(g_hdc);//ٴһhdcݵĻDC bmp = CreateCompatibleBitmap(g_hdc,WINDOW_WIDTH,WINDOW_HEIGHT); //һʹڼݵĿյλͼ SelectObject(g_mdc,bmp);//λͼŵmdc g_hBackGround = (HBITMAP)LoadImage(NULL,L"bg.bmp",IMAGE_BITMAP,WINDOW_WIDTH,WINDOW_HEIGHT,LR_LOADFROMFILE); g_hAngrybird = (HBITMAP)LoadImage(NULL,L"angrybird.bmp",IMAGE_BITMAP,140,70,LR_LOADFROMFILE); GetClientRect(hwnd,&g_rect); //ȡڲĴС //øʼֵ g_iX=0; //ʼg_iX=0 g_iY=100;//ʼg_iY=100 g_iXSpeed=8;//ʼˮƽٶg_iXSpeed=8 g_iYSpeed=0; //ʼֱٶg_iYSpeed=0 g_iYGravity=3;//ٶΪʾ㣬Ϊ3 g_iXFriction=-1; //ˮƽĦΪ-1 g_iYFriction=-4; //ֱĦΪ-4 Game_Paint(hwnd); return TRUE; } //-----------------------------------Game_Paint( )-------------------------------------- // ƺڴ˺нлƲ //-------------------------------------------------------------------------------------------------- VOID Game_Paint( HWND hwnd ) { //mdcϱͼ SelectObject(g_bufdc,g_hBackGround); BitBlt(g_mdc,0,0,WINDOW_WIDTH,WINDOW_HEIGHT,g_bufdc,0,0,SRCCOPY); //Сͼ SelectObject(g_bufdc,g_hAngrybird); BitBlt(g_mdc,g_iX,g_iY,70,70,g_bufdc,70,0,SRCAND); BitBlt(g_mdc,g_iX,g_iY,70,70,g_bufdc,0,0,SRCPAINT); //g_mdcеg_hdc BitBlt(g_hdc,0,0,WINDOW_WIDTH,WINDOW_HEIGHT,g_mdc,0,0,SRCCOPY); //Xͼٶ g_iX += g_iXSpeed; //X᷽ͼ꣬ÿһGame_Paintxͼһ㶨g_iXSpeed൱˶ g_iYSpeed = g_iYSpeed + g_iYGravity; //Y᷽ٶȷg_iYSpeedÿһGame_Paintĵþͼһg_iYGravityٶȣ g_iY += g_iYSpeed; //Y᷽ͼ꣬ÿһGame_Paintyͼһոıg_iYSpeed൱ڼ˶ //жǷ񴥵أڱ߽磬vyΪ෴ if(g_iY >= g_rect.bottom-70) { g_iY= g_rect.bottom - 70; //X᷽Ħ g_iXSpeed += g_iXFriction; // vx=fx+vxg_iXFrictionΪֵÿһGame_Paintg_iXSpeed㶨Сһg_iXFrictionֵĴС if(g_iXSpeed < 0) //g_iXSpeedֵݼС0ʱͽΪ0СXƶ g_iXSpeed = 0; //Y᷽Ħ g_iYSpeed += g_iYFriction; //vy=fy+vyfyͬΪֵÿһGame_Paintg_iYSpeed㶨Сһg_iYFrictionľֵ if(g_iYSpeed < 0) //ٶȼСڵ0Ϊ㣬СXƶ g_iYSpeed = 0; //YٶȴС䣬 g_iYSpeed= -g_iYSpeed; } g_tPre = GetTickCount(); //¼˴λͼʱ } //-----------------------------------Game_CleanUp( )-------------------------------- // Դڴ˺нг˳ǰԴ //--------------------------------------------------------------------------------------------------- BOOL Game_CleanUp( HWND hwnd ) { //ͷԴ DeleteObject(g_hBackGround); DeleteObject(g_hAngrybird); DeleteDC(g_bufdc); DeleteDC(g_mdc); ReleaseDC(hwnd,g_hdc); return TRUE; } ================================================ FILE: GDI-Game-Demo/19_GDIdemo15.cpp ================================================ //-----------------------------------˵---------------------------------------------- // :GDIdemo4 // 20133 Create by dzī // ϵͳ֮ ѩ ʾ //------------------------------------------------------------------------------------------------ //-----------------------------------ͷļ֡--------------------------------------- // ͷļ //------------------------------------------------------------------------------------------------ #include #include //ʹswprintf_sͷļ #include //ʹûȡϵͳʱtime()Ҫͷļ //-----------------------------------ļ֡--------------------------------------- // Ŀļ //------------------------------------------------------------------------------------------------ #pragma comment(lib,"winmm.lib") //PlaySoundļ #pragma comment(lib,"Msimg32.lib") //ʹTransparentBltĿļ //-----------------------------------궨岿֡-------------------------------------------- // һЩ //------------------------------------------------------------------------------------------------ #define WINDOW_WIDTH 800 //Ϊڿȶĺ꣬Էڴ˴޸Ĵڿ #define WINDOW_HEIGHT 600 //Ϊڸ߶ȶĺ꣬Էڴ˴޸Ĵڸ߶ #define WINDOW_TITLE L"ϨϷ롿ϵͳ֮ ѩdemo" //Ϊڱⶨĺ #define PARTICLE_NUMBER 80 //ʾĺ꣬Է޸ //-----------------------------------ȫֽṹ嶨岿֡------------------------------------- // ȫֽṹ嶨 //------------------------------------------------------------------------------------------------ struct SNOW { int x; //ѩ X int y; //ѩY BOOL exist; //ѩǷ }; //-----------------------------------ȫֱ֡------------------------------------- // ȫֱ //------------------------------------------------------------------------------------------------ HDC g_hdc=NULL,g_mdc=NULL,g_bufdc=NULL; //ȫ豸ȫڴDC HBITMAP g_hSnow=NULL,g_hBackGround=NULL; //λͼڴ洢λͼԴ DWORD g_tPre=0,g_tNow=0; //l¼ʱ,g_tPre¼һλͼʱ䣬g_tNow¼˴׼ͼʱ RECT g_rect; //һRECTṹ壬ڴڲ SNOW SnowFlowers[PARTICLE_NUMBER]; //ѩ int g_SnowNum=0; //g_SnowNumڼ //-----------------------------------ȫֺ֡------------------------------------- // ȫֺֹδıʶϵд //------------------------------------------------------------------------------------------------ LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam );//ڹ̺ BOOL Game_Init(HWND hwnd); //ڴ˺нԴijʼ VOID Game_Paint( HWND hwnd); //ڴ˺нлͼд BOOL Game_CleanUp(HWND hwnd ); //ڴ˺нԴ //-----------------------------------WinMain( )-------------------------------------- // WindowsӦóںǵij↑ʼ //------------------------------------------------------------------------------------------------ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nShowCmd) { //1ڴIJ֮һʼһĴ 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; //ָڹ̵ijʵ 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(WHITE_BRUSH); //ΪhbrBackgroundԱָһɫˢ wndClass.lpszMenuName = NULL; //һԿַָֹ˵Դ֡ wndClass.lpszClassName = L"ForTheDreamOfGameDevelop"; //һԿַָֹ֡ //2ڴIJ֮עᴰ if( !RegisterClassEx( &wndClass ) ) //괰ںҪԴעᣬܴ͵Ĵ return -1; //3ڴIJ֮ʽ HWND hwnd = CreateWindow( L"ForTheDreamOfGameDevelop",WINDOW_TITLE, //ϲּĴںCreateWindow WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, WINDOW_WIDTH, WINDOW_HEIGHT, NULL, NULL, hInstance, NULL ); //4ڴIJ֮ģڵƶʾ MoveWindow(hwnd,250,80,WINDOW_WIDTH,WINDOW_HEIGHT,true); //ʾʱλãʹϽλڣ250,80 ShowWindow( hwnd, nShowCmd ); //ShowWindowʾ UpdateWindow(hwnd); //Դڽи£·Ҫװһ //ϷԴijʼʼʧܣһϢ򣬲FALSE if (!Game_Init (hwnd)) { MessageBox(hwnd, L"Դʼʧ", L"Ϣ", 0); //ʹMessageBoxһϢ return FALSE; } PlaySound(L"NOIR3.wav", NULL, SND_FILENAME | SND_ASYNC|SND_LOOP); //ѭű //5Ϣѭ MSG msg = { 0 }; //岢ʼmsg while( msg.message != WM_QUIT ) //ʹwhileѭϢWM_QUITϢͼѭ { if( PeekMessage( &msg, 0, 0, 0, PM_REMOVE ) ) //鿴ӦóϢУϢʱеϢɷȥ { TranslateMessage( &msg ); //ϢתΪַϢ DispatchMessage( &msg ); //ַһϢڳ } else { g_tNow = GetTickCount(); //ȡǰϵͳʱ if(g_tNow-g_tPre >= 60) //˴ѭϴλͼʱ0.06ʱٽػ Game_Paint(hwnd); } } //6ע UnregisterClass(L"ForTheDreamOfGameDevelop", wndClass.hInstance); //׼ע return 0; } //-----------------------------------WndProc( )-------------------------------------- // ڹ̺WndProc,ԴϢд //------------------------------------------------------------------------------------------------ LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ) { switch( message ) //switch俪ʼ { case WM_KEYDOWN: //Ϣ if(wParam==VK_ESCAPE) //¡Esc PostQuitMessage(0); break; case WM_DESTROY: //ǴϢ Game_CleanUp(hwnd); //ԶԴGame_CleanUp˳ǰԴ PostQuitMessage( 0 ); //ϵͳиֹ߳ӦWM_DESTROYϢ break; //switch default: //caseϣִиdefault return DefWindowProc( hwnd, message, wParam, lParam ); //ȱʡĴڹ } return 0; //˳ } //-----------------------------------Game_Init( )-------------------------------------- // ʼһЩ򵥵ijʼ //------------------------------------------------------------------------------------------------ BOOL Game_Init( HWND hwnd ) { srand((unsigned)time(NULL)); //ϵͳʱʼ HBITMAP bmp; g_hdc = GetDC(hwnd); g_mdc = CreateCompatibleDC(g_hdc); //һhdcݵڴDC g_bufdc = CreateCompatibleDC(g_hdc);//ٴһhdcݵĻDC bmp = CreateCompatibleBitmap(g_hdc,WINDOW_WIDTH,WINDOW_HEIGHT); //һʹڼݵĿյλͼ SelectObject(g_mdc,bmp);//λͼŵg_mdc //λͼԴ g_hBackGround = (HBITMAP)LoadImage(NULL,L"bg.bmp",IMAGE_BITMAP,WINDOW_WIDTH,WINDOW_HEIGHT,LR_LOADFROMFILE); g_hSnow = (HBITMAP)LoadImage(NULL,L"snow.bmp",IMAGE_BITMAP,30,30,LR_LOADFROMFILE); GetClientRect(hwnd,&g_rect); //ȡڲĴС Game_Paint(hwnd); return TRUE; } //-----------------------------------Game_Paint( )-------------------------------------- // ƺڴ˺нлƲ //-------------------------------------------------------------------------------------------------- VOID Game_Paint( HWND hwnd ) { //mdcϱͼ SelectObject(g_bufdc,g_hBackGround); BitBlt(g_mdc,0,0,WINDOW_WIDTH,WINDOW_HEIGHT,g_bufdc,0,0,SRCCOPY); // if(g_SnowNum< PARTICLE_NUMBER) //Сڹ涨ʱµӣ趨ÿӵֵ { SnowFlowers[g_SnowNum].x = rand()%g_rect.right; //ӵXΪˮƽϵλ SnowFlowers[g_SnowNum].y = 0; //ÿӵY궼Ϊ"0"Ӵ SnowFlowers[g_SnowNum].exist = true; //趨Ӵ g_SnowNum++; //ÿһӺۼӼ } //жǷڣڣ͸ͼ for(int i=0;i g_rect.bottom) { SnowFlowers[i].x = rand()%g_rect.right; SnowFlowers[i].y = 0; } } } //mdcеȫhdc BitBlt(g_hdc,0,0,WINDOW_WIDTH,WINDOW_HEIGHT,g_mdc,0,0,SRCCOPY); g_tPre = GetTickCount(); //¼˴λͼʱ } //-----------------------------------Game_CleanUp( )-------------------------------- // Դڴ˺нг˳ǰԴ //--------------------------------------------------------------------------------------------------- BOOL Game_CleanUp( HWND hwnd ) { //ͷԴ DeleteObject(g_hBackGround); DeleteObject(g_hSnow); DeleteDC(g_bufdc); DeleteDC(g_mdc); ReleaseDC(hwnd,g_hdc); return TRUE; } ================================================ FILE: GDI-Game-Demo/1_HelloVisualStudio.cpp ================================================ #include int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow) { MessageBox( NULL, L"First blood! ãVisual Studio", L" Ϣ", 0 );//ʾһϢ return 0; } ================================================ FILE: GDI-Game-Demo/20_GDIdemo16.cpp ================================================ //-----------------------------------˵---------------------------------------------- // :GDIdemo16 // 20133 Create by dzī // ϵͳ֮ ǹ ʾ //------------------------------------------------------------------------------------------------ //-----------------------------------ͷļ֡--------------------------------------- // ͷļ //------------------------------------------------------------------------------------------------ #include #include //ʹswprintf_sͷļ #include //ʹûȡϵͳʱtimeҪͷļ //-----------------------------------ļ֡--------------------------------------- // Ŀļ //------------------------------------------------------------------------------------------------ #pragma comment(lib,"winmm.lib") //PlaySoundļ #pragma comment(lib,"Msimg32.lib") //ʹTransparentBltĿļ //-----------------------------------궨岿֡-------------------------------------------- // һЩ //------------------------------------------------------------------------------------------------ #define WINDOW_WIDTH 932 //Ϊڿȶĺ꣬Էڴ˴޸Ĵڿ #define WINDOW_HEIGHT 700 //Ϊڸ߶ȶĺ꣬Էڴ˴޸Ĵڸ߶ #define WINDOW_TITLE L"ϨϷ롿ϵͳ֮ ǹdemo" //Ϊڱⶨĺ #define FLYSTAR_NUMBER 100 //ʾĺ꣬Է޸ #define FLYSTAR_LASTED_FRAME 60 //ʾӳ֡ĺ꣬Է޸ÿǹųʱ //-----------------------------------ȫֽṹ嶨岿֡------------------------------------- // ȫֽṹ嶨 //------------------------------------------------------------------------------------------------ struct FLYSTAR { int x; //ǹڵx int y; //ǹڵy int vx; //ǹxٶ int vy; //ǹyٶ int lasted; //ǹڵʱ BOOL exist; //ǹǷ }; //-----------------------------------ȫֱ֡------------------------------------- // ȫֱ //------------------------------------------------------------------------------------------------ HDC g_hdc=NULL,g_mdc=NULL,g_bufdc=NULL; //ȫ豸ȫڴDC HBITMAP g_hStar=NULL,g_hBackGround=NULL; //λͼڴ洢λͼԴ DWORD g_tPre=0,g_tNow=0; //l¼ʱ,g_tPre¼һλͼʱ䣬g_tNow¼˴׼ͼʱ RECT g_rect; //һRECTṹ壬ڴڲ FLYSTAR FlyStars[FLYSTAR_NUMBER]; // int g_StarNum=0; //g_StarNumڼ //-----------------------------------ȫֺ֡------------------------------------- // ȫֺֹδıʶϵд //------------------------------------------------------------------------------------------------ LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam );//ڹ̺ BOOL Game_Init(HWND hwnd); //ڴ˺нԴijʼ VOID Game_Paint( HWND hwnd); //ڴ˺нлͼд BOOL Game_CleanUp(HWND hwnd ); //ڴ˺нԴ //-----------------------------------WinMain( )-------------------------------------- // WindowsӦóںǵij↑ʼ //------------------------------------------------------------------------------------------------ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nShowCmd) { //1ڴIJ֮һʼһĴ 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; //ָڹ̵ijʵ 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(WHITE_BRUSH); //ΪhbrBackgroundԱָһɫˢ wndClass.lpszMenuName = NULL; //һԿַָֹ˵Դ֡ wndClass.lpszClassName = L"ForTheDreamOfGameDevelop"; //һԿַָֹ֡ //2ڴIJ֮עᴰ if( !RegisterClassEx( &wndClass ) ) //괰ںҪԴעᣬܴ͵Ĵ return -1; //3ڴIJ֮ʽ HWND hwnd = CreateWindow( L"ForTheDreamOfGameDevelop",WINDOW_TITLE, //ϲּĴںCreateWindow WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, WINDOW_WIDTH, WINDOW_HEIGHT, NULL, NULL, hInstance, NULL ); //4ڴIJ֮ģڵƶʾ MoveWindow(hwnd,150,20,WINDOW_WIDTH,WINDOW_HEIGHT,true); //ʾʱλãʹϽλڣ150,20 ShowWindow( hwnd, nShowCmd ); //ShowWindowʾ UpdateWindow(hwnd); //Դڽи£·Ҫװһ //ϷԴijʼʼʧܣһϢ򣬲FALSE if (!Game_Init (hwnd)) { MessageBox(hwnd, L"Դʼʧ", L"Ϣ", 0); //ʹMessageBoxһϢ return FALSE; } PlaySound(L"뤫 (Long Version).wav", NULL, SND_FILENAME | SND_ASYNC|SND_LOOP); //ѭű //5Ϣѭ MSG msg = { 0 }; //岢ʼmsg while( msg.message != WM_QUIT ) //ʹwhileѭϢWM_QUITϢͼѭ { if( PeekMessage( &msg, 0, 0, 0, PM_REMOVE ) ) //鿴ӦóϢУϢʱеϢɷȥ { TranslateMessage( &msg ); //ϢתΪַϢ DispatchMessage( &msg ); //ַһϢڳ } else { g_tNow = GetTickCount(); //ȡǰϵͳʱ if(g_tNow-g_tPre >= 30) //˴ѭϴλͼʱ0.03ʱٽػ Game_Paint(hwnd); } } //6ע UnregisterClass(L"ForTheDreamOfGameDevelop", wndClass.hInstance); //׼ע return 0; } //-----------------------------------WndProc( )-------------------------------------- // ڹ̺WndProc,ԴϢд //------------------------------------------------------------------------------------------------ LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ) { switch( message ) //switch俪ʼ { case WM_KEYDOWN: //Ϣ if(wParam==VK_ESCAPE) //¡Esc PostQuitMessage(0); break; case WM_DESTROY: //ǴϢ Game_CleanUp(hwnd); //ԶԴGame_CleanUp˳ǰԴ PostQuitMessage( 0 ); //ϵͳиֹ߳ӦWM_DESTROYϢ break; //switch default: //caseϣִиdefault return DefWindowProc( hwnd, message, wParam, lParam ); //ȱʡĴڹ } return 0; //˳ } //-----------------------------------Game_Init( )-------------------------------------- // ʼһЩ򵥵ijʼ //------------------------------------------------------------------------------------------------ BOOL Game_Init( HWND hwnd ) { srand((unsigned)time(NULL)); //ϵͳʱʼ HBITMAP bmp; g_hdc = GetDC(hwnd); g_mdc = CreateCompatibleDC(g_hdc); //һhdcݵڴDC g_bufdc = CreateCompatibleDC(g_hdc);//ٴһhdcݵĻDC bmp = CreateCompatibleBitmap(g_hdc,WINDOW_WIDTH,WINDOW_HEIGHT); //һʹڼݵĿյλͼ SelectObject(g_mdc,bmp);//λͼŵg_mdc //λͼ g_hBackGround = (HBITMAP)LoadImage(NULL,L"bg.bmp",IMAGE_BITMAP,WINDOW_WIDTH,WINDOW_HEIGHT,LR_LOADFROMFILE); g_hStar = (HBITMAP)LoadImage(NULL,L"star.bmp",IMAGE_BITMAP,30,30,LR_LOADFROMFILE); GetClientRect(hwnd,&g_rect); //ȡڲĴС Game_Paint(hwnd); return TRUE; } //-----------------------------------Game_Paint( )-------------------------------------- // ƺڴ˺нлƲ //-------------------------------------------------------------------------------------------------- VOID Game_Paint( HWND hwnd ) { //mdcϱͼ SelectObject(g_bufdc,g_hBackGround); BitBlt(g_mdc,0,0,WINDOW_WIDTH,WINDOW_HEIGHT,g_bufdc,0,0,SRCCOPY); // if(g_StarNum == 0) //ñը { int x=rand()%g_rect.right; int y=rand()%g_rect.bottom; for(int i=0;ig_rect.right || FlyStars[i].y<=-10 || FlyStars[i].y>g_rect.bottom || FlyStars[i].lasted>FLYSTAR_LASTED_FRAME) { FlyStars[i].exist = false; //ɾǹ g_StarNum--; //ݼǹ } } } //mdcеȫhdc BitBlt(g_hdc,0,0,WINDOW_WIDTH,WINDOW_HEIGHT,g_mdc,0,0,SRCCOPY); g_tPre = GetTickCount(); //¼˴λͼʱ } //-----------------------------------Game_CleanUp( )-------------------------------- // Դڴ˺нг˳ǰԴ //--------------------------------------------------------------------------------------------------- BOOL Game_CleanUp( HWND hwnd ) { //ͷԴ DeleteObject(g_hBackGround); DeleteObject(g_hStar); DeleteDC(g_bufdc); DeleteDC(g_mdc); ReleaseDC(hwnd,g_hdc); return TRUE; } ================================================ FILE: GDI-Game-Demo/21_GDIdemo17.cpp ================================================ //-----------------------------------˵---------------------------------------------- // :GDIdemo17 // 20133 Create by dzī // СͻغϷ߶ //------------------------------------------------------------------------------------------------ //-----------------------------------ͷļ֡--------------------------------------- // ͷļ //------------------------------------------------------------------------------------------------ #include #include //ʹswprintf_sͷļ #include //ʹûȡϵͳʱtime()Ҫͷļ //-----------------------------------ļ֡--------------------------------------- // Ŀļ //------------------------------------------------------------------------------------------------ #pragma comment(lib,"winmm.lib") //PlaySoundļ #pragma comment(lib,"Msimg32.lib") //ʹTransparentBltĿļ //-----------------------------------궨岿֡-------------------------------------------- // һЩ //------------------------------------------------------------------------------------------------ #define WINDOW_WIDTH 800 //Ϊڿȶĺ꣬Էڴ˴޸Ĵڿ #define WINDOW_HEIGHT 600 //Ϊڸ߶ȶĺ꣬Էڴ˴޸Ĵڸ߶ #define WINDOW_TITLE L"ϨϷ롿߶" //Ϊڱⶨĺ #define PARTICLE_NUMBER 50 //ʾĺ꣬Է޸ //-----------------------------------ȫֽṹö嶨岿֡------------------------- // ȫֽṹöٵĶ //------------------------------------------------------------------------------------------------ //һɫṹ struct CHARACTER { int NowHp; //ǰֵ int MaxHp; //ֵ int NowMp; //ǰħֵ int MaxMp; //ħֵ int Level; //ɫȼ int Strength; //ɫֵ int Intelligence; //ɫֵ int Agility; //ɫֵ }; struct SNOW { int x; //ѩ X int y; //ѩY BOOL exist; //ѩǷ }; //һö enum ActionTypes { ACTION_TYPE_NORMAL=0, //ͨ ACTION_TYPE_CRITICAL=1, //һ ACTION_TYPE_MAGIC=2, //ħ ACTION_TYPE_MISS=3, // ACTION_TYPE_RECOVER=4, //ͷŻָħ }; //-----------------------------------ȫֱ֡------------------------------------- // ȫֱ //------------------------------------------------------------------------------------------------ HDC g_hdc=NULL,g_mdc=NULL,g_bufdc=NULL; //ȫ豸ȫڴDC DWORD g_tPre=0,g_tNow=0; //l¼ʱ,g_tPre¼һλͼʱ䣬g_tNow¼˴׼ͼʱ RECT g_rect; //һRECTṹ壬ڴڲ int g_iFrameNum,g_iTxtNum; //֡ wchar_t text[8][100]; //洢ֵַ BOOL g_bCanAttack,g_bGameOver; //Ϸ״̬ʶɫǷԹϷǷ SNOW SnowFlowers[PARTICLE_NUMBER]; //ѩ int g_SnowNum=0; //g_SnowNumѩļ CHARACTER Hero,Boss; //ɫṹʵֱʾӢۺBOSS ActionTypes HeroActionType,BossActionType; //öʵֱʾӢۺBOSSĶ //һϵλͼĶ HBITMAP g_hBackGround,g_hGameOver,g_hVictory,g_hSnow; //ϷϷʤλͼ HBITMAP g_hMonsterBitmap,g_hHeroBitmap,g_hRecoverSkill; //BOSSɫͼӢ۽ɫͼָͼλͼ HBITMAP g_hSkillButton1,g_hSkillButton2,g_hSkillButton3,g_hSkillButton4; //4ܰťλͼ HBITMAP g_hHeroSkill1,g_hHeroSkill2,g_hHeroSkill3; //3ӢۼЧλͼ HBITMAP g_hBossSkill1,g_hBossSkill2,g_hBossSkill3; //3BOSSЧλͼ //-----------------------------------ȫֺ֡------------------------------------- // ȫֺֹδıʶϵд //------------------------------------------------------------------------------------------------ LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam );//ڹ̺ BOOL Game_Init(HWND hwnd); //ڴ˺нԴijʼ VOID Game_Main( HWND hwnd); //ڴ˺нлͼд BOOL Game_ShutDown(HWND hwnd ); //ڴ˺нԴ VOID Die_Check(int NowHp,bool isHero); //麯 VOID Message_Insert(wchar_t* str); //Ϣ VOID HeroAction_Logic(); //Ӣ۶߼жϺ VOID HeroAction_Paint(); //Ӣ۶ͼ VOID BossAction_Logic(); //ﶯ߼жϺ VOID BossAction_Paint(); //ﶯͼ VOID Snow_Paint(); //-----------------------------------WinMain( )-------------------------------------- // WindowsӦóںǵij↑ʼ //------------------------------------------------------------------------------------------------ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nShowCmd) { //1ڴIJ֮һʼһĴ 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; //ָڹ̵ijʵ 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(WHITE_BRUSH); //ΪhbrBackgroundԱָһɫˢ wndClass.lpszMenuName = NULL; //һԿַָֹ˵Դ֡ wndClass.lpszClassName = L"ForTheDreamOfGameDevelop"; //һԿַָֹ֡ //2ڴIJ֮עᴰ if( !RegisterClassEx( &wndClass ) ) //괰ںҪԴעᣬܴ͵Ĵ return -1; //3ڴIJ֮ʽ HWND hwnd = CreateWindow( L"ForTheDreamOfGameDevelop",WINDOW_TITLE, //ϲּĴںCreateWindow WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, WINDOW_WIDTH, WINDOW_HEIGHT, NULL, NULL, hInstance, NULL ); //4ڴIJ֮ģڵƶʾ MoveWindow(hwnd,250,80,WINDOW_WIDTH,WINDOW_HEIGHT,true); //ʾʱλãʹϽλڣ250,80 ShowWindow( hwnd, nShowCmd ); //ShowWindowʾ UpdateWindow(hwnd); //Դڽи£·Ҫװһ //ϷԴijʼʼʧܣһϢ򣬲FALSE if (!Game_Init (hwnd)) { MessageBox(hwnd, L"Դʼʧ", L"Ϣ", 0); //ʹMessageBoxһϢ return FALSE; } PlaySound(L"GameMedia\\λԭ-ս1-ɭ.wav", NULL, SND_FILENAME | SND_ASYNC|SND_LOOP); //ѭű //5Ϣѭ MSG msg = { 0 }; //岢ʼmsg while( msg.message != WM_QUIT ) //ʹwhileѭϢWM_QUITϢͼѭ { if( PeekMessage( &msg, 0, 0, 0, PM_REMOVE ) ) //鿴ӦóϢУϢʱеϢɷȥ { TranslateMessage( &msg ); //ϢתΪַϢ DispatchMessage( &msg ); //ַһϢڳ } else { g_tNow = GetTickCount(); //ȡǰϵͳʱ if(g_tNow-g_tPre >= 60) //˴ѭϴλͼʱ0.06ʱٽػ Game_Main(hwnd); } } //6ע UnregisterClass(L"ForTheDreamOfGameDevelop", wndClass.hInstance); //׼ע return 0; } //-----------------------------------WndProc( )-------------------------------------- // ڹ̺WndProc,ԴϢд //------------------------------------------------------------------------------------------------ LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ) { switch( message ) //switch俪ʼ { case WM_KEYDOWN: //Ϣ if(wParam==VK_ESCAPE) //¡Esc PostQuitMessage(0); break; case WM_LBUTTONDOWN: //Ϣ if(!g_bCanAttack) { int x = LOWORD(lParam); //X int y = HIWORD(lParam); //Y if(x >= 530 && x <= 570 && y >=420 && y <= 470) { g_bCanAttack = true; HeroActionType=ACTION_TYPE_NORMAL; } if(x >= 590 && x <= 640 && y >=420 && y <= 470) { g_bCanAttack = true; HeroActionType=ACTION_TYPE_MAGIC; } if(x >= 650 && x <= 700 && y >=420 && y <= 470) { g_bCanAttack = true; HeroActionType=ACTION_TYPE_RECOVER; } } break; case WM_DESTROY: //ǴϢ Game_ShutDown(hwnd); //ԶԴGame_ShutDown˳ǰԴ PostQuitMessage( 0 ); //ϵͳиֹ߳ӦWM_DESTROYϢ break; //switch default: //caseϣִиdefault return DefWindowProc( hwnd, message, wParam, lParam ); //ȱʡĴڹ } return 0; //˳ } //-----------------------------------Game_Init( )-------------------------------------- // ʼϷԴijʼ //------------------------------------------------------------------------------------------------ BOOL Game_Init( HWND hwnd ) { srand((unsigned)time(NULL)); //ϵͳʱʼ HBITMAP bmp; //ϵĴ g_hdc = GetDC(hwnd); g_mdc = CreateCompatibleDC(g_hdc); //һhdcݵڴDC g_bufdc = CreateCompatibleDC(g_hdc);//ٴһhdcݵĻDC bmp = CreateCompatibleBitmap(g_hdc,WINDOW_WIDTH,WINDOW_HEIGHT); //һʹڼݵĿյλͼ SelectObject(g_mdc,bmp);//λͼŵmdc //һϵϷԴͼλͼ g_hGameOver=(HBITMAP)LoadImage(NULL,L"GameMedia\\gameover.bmp",IMAGE_BITMAP,1086,396,LR_LOADFROMFILE); //Ϸλͼ g_hVictory=(HBITMAP)LoadImage(NULL,L"GameMedia\\victory.bmp",IMAGE_BITMAP,800,600,LR_LOADFROMFILE); //Ϸʤλͼ g_hBackGround = (HBITMAP)LoadImage(NULL,L"GameMedia\\bg.bmp",IMAGE_BITMAP,800,600,LR_LOADFROMFILE); //λͼ g_hMonsterBitmap = (HBITMAP)LoadImage(NULL,L"GameMedia\\monster.bmp",IMAGE_BITMAP,360,360,LR_LOADFROMFILE); //ɫλͼ g_hHeroBitmap = (HBITMAP)LoadImage(NULL,L"GameMedia\\hero.bmp",IMAGE_BITMAP,360,360,LR_LOADFROMFILE); //Ӣ۽ɫλͼ g_hHeroSkill1=(HBITMAP)LoadImage(NULL,L"GameMedia\\heroslash.bmp",IMAGE_BITMAP,364,140,LR_LOADFROMFILE); //Ӣ1λͼ g_hHeroSkill2=(HBITMAP)LoadImage(NULL,L"GameMedia\\heromagic.bmp",IMAGE_BITMAP,374,288,LR_LOADFROMFILE); //Ӣ2λͼ g_hHeroSkill3=(HBITMAP)LoadImage(NULL,L"GameMedia\\herocritical.bmp",IMAGE_BITMAP,574,306,LR_LOADFROMFILE); //Ӣ3λͼ g_hSkillButton1 = (HBITMAP)LoadImage(NULL,L"GameMedia\\skillbutton1.bmp",IMAGE_BITMAP,50,50,LR_LOADFROMFILE); //1ͼλͼ g_hSkillButton2= (HBITMAP)LoadImage(NULL,L"GameMedia\\skillbutton2.bmp",IMAGE_BITMAP,50,50,LR_LOADFROMFILE); //2ͼλͼ g_hSkillButton3= (HBITMAP)LoadImage(NULL,L"GameMedia\\skillbutton3.bmp",IMAGE_BITMAP,50,50,LR_LOADFROMFILE); //3ͼλͼ g_hSkillButton4= (HBITMAP)LoadImage(NULL,L"GameMedia\\skillbutton4.bmp",IMAGE_BITMAP,50,50,LR_LOADFROMFILE); //4ͼλͼ g_hBossSkill1= (HBITMAP)LoadImage(NULL,L"GameMedia\\monsterslash.bmp",IMAGE_BITMAP,234,188,LR_LOADFROMFILE); //1λͼ g_hBossSkill2= (HBITMAP)LoadImage(NULL,L"GameMedia\\monstermagic.bmp",IMAGE_BITMAP,387,254,LR_LOADFROMFILE); //2λͼ g_hBossSkill3= (HBITMAP)LoadImage(NULL,L"GameMedia\\monstercritical.bmp",IMAGE_BITMAP,574,306,LR_LOADFROMFILE); //3λͼ g_hSnow = (HBITMAP)LoadImage(NULL,L"GameMedia\\snow.bmp",IMAGE_BITMAP,30,30,LR_LOADFROMFILE); //ѩλͼ g_hRecoverSkill = (HBITMAP)LoadImage(NULL,L"GameMedia\\recover.bmp",IMAGE_BITMAP,150,150,LR_LOADFROMFILE); //ָλͼ GetClientRect(hwnd,&g_rect); //ȡڲĴС //趨ʥʿĸֵ Hero.NowHp = Hero.MaxHp = 1000; //趨ֵĵǰֵ Hero.Level = 6; //趨ҽɫȼ Hero.NowMp=Hero.MaxMp=60; //ħֵĵǰֵ Hero.Strength = 10; //趨Ӣ۵ֵ Hero.Agility=20; //趨Ӣ۵ֵ Hero.Intelligence=10; //趨Ӣ۵ֵ //趨BOSSƽħĸֵ Boss.NowHp = Boss.MaxHp = 2000; //趨BOSSֵĵǰֵ Boss.Level = 10; //趨BOSSĵȼ Boss.Strength = 10; //趨BOSSֵ Boss.Agility=10; //趨BOSSֵ Boss.Intelligence=10; //趨BOSSֵ g_iTxtNum = 0; //ʼʾϢĿ // HFONT hFont; hFont=CreateFont(20,0,0,0,700,0,0,0,GB2312_CHARSET,0,0,0,0,TEXT("΢ź")); SelectObject(g_mdc,hFont); SetBkMode(g_mdc, TRANSPARENT); //ʾ͸ Game_Main(hwnd); //һϷMain return TRUE; } //-----------------------------------Game_Main( )-------------------------------------- // ϷMainϷ࣬ϷССĺ //-------------------------------------------------------------------------------------------------- VOID Game_Main( HWND hwnd ) { wchar_t str[100]; //mdcϱͼ SelectObject(g_bufdc,g_hBackGround); BitBlt(g_mdc,0,0,WINDOW_WIDTH,WINDOW_HEIGHT,g_bufdc,0,0,SRCCOPY); //ѩЧĻ if (!g_bGameOver)//Ϸδ { Snow_Paint(); //÷װѩЧĺģѩ } //ʾսϢ SetTextColor(g_mdc,RGB(255,255,255)); for(int i=0;i0) { //Ϲͼ SelectObject(g_bufdc,g_hMonsterBitmap); TransparentBlt(g_mdc,0,50,360,360,g_bufdc,0,0,360,360,RGB(0,0,0));//TransparentBlt͸ͼ //ʾѪ swprintf_s(str,L"%d / %d",Boss.NowHp,Boss.MaxHp); SetTextColor(g_mdc,RGB(255,10,10)); TextOut(g_mdc,100,370,str,wcslen(str)); } //ͼԼֵħֵʾ if(Hero.NowHp>0) { //ͼ SelectObject(g_bufdc,g_hHeroBitmap); TransparentBlt(g_mdc,400,50,360,360,g_bufdc,0,0,360,360,RGB(0,0,0));//͸ɫΪRGB(0,0,0)ɫ //ʾѪ swprintf_s(str,L"%d / %d",Hero.NowHp,Hero.MaxHp); SetTextColor(g_mdc,RGB(255,10,10)); TextOut(g_mdc,600,350,str, wcslen(str)); //ʾħֵ swprintf_s(str,L"%d / %d",Hero.NowMp,Hero.MaxMp); SetTextColor(g_mdc,RGB(10,10,255)); TextOut(g_mdc,600,370,str, wcslen(str)); } //жϷǷ if(g_bGameOver) { if(Hero.NowHp <= 0) //GameOverͼƬ { SelectObject(g_bufdc,g_hGameOver); BitBlt(g_mdc,120,50,543,396,g_bufdc,543,0,SRCAND); BitBlt(g_mdc,120,50,543,396,g_bufdc,0,0,SRCPAINT); } else //ʤͼƬ { SelectObject(g_bufdc,g_hVictory); TransparentBlt(g_mdc,0,0,800,600,g_bufdc,0,0,800,600,RGB(0,0,0));//͸ɫΪRGB(0,0,0) } } //ϷûΪҿɹ״̬ϼͼ else if(!g_bCanAttack) //ϼܰť { SelectObject(g_bufdc,g_hSkillButton1); BitBlt(g_mdc,530,420,50,50,g_bufdc,0,0,SRCCOPY); SelectObject(g_bufdc,g_hSkillButton2); BitBlt(g_mdc,590,420,50,50,g_bufdc,0,0,SRCCOPY); SelectObject(g_bufdc,g_hSkillButton3); BitBlt(g_mdc,650,420,50,50,g_bufdc,0,0,SRCCOPY); SelectObject(g_bufdc,g_hSkillButton4); BitBlt(g_mdc,710,420,50,50,g_bufdc,0,0,SRCCOPY); } //ϷûΪҲɹ״̬㿪ʼĻͼ else { g_iFrameNum++; //5~10ʱʾҹЧͼ if(g_iFrameNum>=5 && g_iFrameNum<=10) { //5ʱ֮ǰϷ߼Ϣʾ if(g_iFrameNum == 5) { HeroAction_Logic( ); Die_Check(Boss.NowHp,false); } //ĶͽӦͼ HeroAction_Paint(); } //15ʱжϹ if(g_iFrameNum == 15) { BossAction_Logic(); } //26~30ʱʾ﹥ͼ if(g_iFrameNum>=26 && g_iFrameNum<=30) { BossAction_Paint(); } if(g_iFrameNum == 30) //غϽ { g_bCanAttack = false; g_iFrameNum = 0; //ÿغϵħȻָ6̶ֵ0ֵ֮һֵ if(!g_bGameOver) { int MpRecover=2*(rand()%Hero.Intelligence)+6; Hero.NowMp+=MpRecover; if (Hero.NowMp>=Hero.MaxMp) { Hero.NowMp=Hero.MaxMp; } swprintf_s(str,L"غϽԶָˡ%dħֵ",MpRecover); Message_Insert(str); } } } //mdcеȫhdc BitBlt(g_hdc,0,0,WINDOW_WIDTH,WINDOW_HEIGHT,g_mdc,0,0,SRCCOPY); g_tPre = GetTickCount(); //¼˴λͼʱ } //-----------------------------------Message_Insert( )---------------------------------- // սϢڲϢ //--------------------------------------------------------------------------------------------------- void Message_Insert(wchar_t* str) { //δ8Ϣֱ¿һϢ if(g_iTxtNum < 8) { swprintf_s(text[g_iTxtNum],str); g_iTxtNum++; } //8ϢֻмһϢ else { for(int i=0;i=30) { damage = 5*(2*(rand()%Hero.Agility) + Hero.Level*Hero.Intelligence); Boss.NowHp -= (int)damage; Hero.NowMp-=30; swprintf_s(str,L"ʥʿͷһ𽣷...Թճˡ%d˺",damage); } else { HeroActionType=ACTION_TYPE_MISS; swprintf_s(str,L"ɵ~!ħֵ30㣬ʩʧܣغϰ׷~"); } Message_Insert(str); break; case ACTION_TYPE_RECOVER: //ʹ if(Hero.NowMp>=40) { Hero.NowMp-=40; int HpRecover=5*(5*(rand()%Hero.Intelligence)+40); Hero.NowHp+=HpRecover; if (Hero.NowHp>=Hero.MaxHp) { Hero.NowHp=Hero.MaxHp; } swprintf_s(str,L"ʥʿʹָˡ%dֵоöˡ",HpRecover); } else { HeroActionType=ACTION_TYPE_MISS; swprintf_s(str,L"ɵ~!ħֵ40㣬ʩʧܣغϰ׷~"); } Message_Insert(str); break; } } //-----------------------------------HeroAction_Paint( )------------------------------- // Ҷͼ //-------------------------------------------------------------------------------------------------- VOID HeroAction_Paint() { switch (HeroActionType) { case ACTION_TYPE_NORMAL: //ͨ޵ն SelectObject(g_bufdc,g_hHeroSkill1); TransparentBlt(g_mdc,50,170,364,140,g_bufdc,0,0,364,140,RGB(0,0,0));//TransparentBlt͸ɫΪRGB(0,0,0) break; case ACTION_TYPE_CRITICAL: //ͽ SelectObject(g_bufdc,g_hHeroSkill3); TransparentBlt(g_mdc,20,60,574,306,g_bufdc,0,0,574,306,RGB(0,0,0));//TransparentBlt͸ɫΪRGB(0,0,0) break; case ACTION_TYPE_MAGIC: //ħһ𽣷 SelectObject(g_bufdc,g_hHeroSkill2); TransparentBlt(g_mdc,50,100,374,288,g_bufdc,0,0,374,288,RGB(0,0,0));//TransparentBlt͸ɫΪRGB(0,0,0) break; case ACTION_TYPE_RECOVER: //ָ SelectObject(g_bufdc,g_hRecoverSkill); TransparentBlt(g_mdc,560,170,150,150,g_bufdc,0,0,150,150,RGB(0,0,0));//TransparentBlt͸ɫΪRGB(0,0,0) break; } } //-----------------------------------BossAction_Logic( )------------------------------- // Boss߼жϺ //-------------------------------------------------------------------------------------------------- VOID BossAction_Logic() { srand((unsigned)time(NULL)); //ϵͳʱʼ if(Boss.NowHp > (Boss.MaxHp/2)) //ֵ1/2ʱ { switch(rand()%3) { case 0: //ͷͨڤ BossActionType = ACTION_TYPE_NORMAL; break; case 1: //ͷһ BossActionType = ACTION_TYPE_CRITICAL; break; case 2: //ʹѪ BossActionType = ACTION_TYPE_MAGIC; break; } } else //ֵС1/2ʱ { switch(rand()%3) { case 0: //ͷѪ BossActionType = ACTION_TYPE_MAGIC; break; case 1: //ͷһ BossActionType = ACTION_TYPE_CRITICAL; break; case 2: //ʹ÷˹ķظ BossActionType = ACTION_TYPE_RECOVER; break; } } } //-----------------------------------BossAction_Paint( )------------------------------- // Bossͼ //-------------------------------------------------------------------------------------------------- VOID BossAction_Paint() { int damage=0,recover=0; wchar_t str[100]; switch(BossActionType) { case ACTION_TYPE_NORMAL: //ͷͨڤ SelectObject(g_bufdc,g_hBossSkill1); TransparentBlt(g_mdc,500,150,234,188,g_bufdc,0,0,234,188,RGB(0,0,0));//TransparentBlt͸ɫΪRGB(0,0,0) //30ʱ˺̶ȲʾϢ if(g_iFrameNum == 30) { damage = rand()%Boss.Agility+ Boss.Level*Boss.Strength; Hero.NowHp -= (int)damage; swprintf_s(str,L"ƽħͷڤ...ճɡ %d ˺",damage); Message_Insert(str); Die_Check(Hero.NowHp,true); } break; case ACTION_TYPE_MAGIC: //ͷѪ SelectObject(g_bufdc,g_hBossSkill2); TransparentBlt(g_mdc,450,150,387,254,g_bufdc,0,0,387,254,RGB(0,0,0));//TransparentBlt͸ɫΪRGB(0,0,0) //30ʱ˺̶ȲʾϢ if(g_iFrameNum == 30) { damage = 2*(2*(rand()%Boss.Agility) + Boss.Strength*Boss.Intelligence); //Ѫ˺ֵ Hero.NowHp -= damage; //ӢѪһ˺ֵ recover =(int)((float)damage*0.2f); //Ѫ20% Boss.NowHp+=recover; //ָѪ swprintf_s(str,L"ƽħͷѪ...ճɡ %d ˺,ָ%dֵ",damage,recover); //ָʽ Message_Insert(str); //Ϣ Die_Check(Hero.NowHp,true); } break; case ACTION_TYPE_CRITICAL: //ͷһ SelectObject(g_bufdc,g_hBossSkill3); TransparentBlt(g_mdc,280,100,574,306,g_bufdc,0,0,574,306,RGB(0,0,0));//TransparentBlt͸ɫΪRGB(0,0,0) //30ʱ˺̶ȲʾϢ if(g_iFrameNum == 30) { damage = 2*(rand()%Boss.Agility+ Boss.Level*Boss.Strength); Hero.NowHp -= (int)damage; swprintf_s(str,L"ƽħһ...ճɡ%d˺.",damage); Message_Insert(str); Die_Check(Hero.NowHp,true); } break; case ACTION_TYPE_RECOVER: //ʹ÷˹ķѪ SelectObject(g_bufdc,g_hRecoverSkill); TransparentBlt(g_mdc,150,150,150,150,g_bufdc,0,0,150,150,RGB(0,0,0));//TransparentBlt͸ɫΪRGB(0,0,0) //30ʱظֵʾϢ if(g_iFrameNum == 30) { recover= 2*Boss.Intelligence*Boss.Intelligence; Boss.NowHp +=recover; swprintf_s(str,L"ƽħʹ÷˹ķ...ָˡ%dֵ",recover); Message_Insert(str); } break; } } //-----------------------------------Snow_Paint( )-------------------------------------- // װѩЧĺģѩ //-------------------------------------------------------------------------------------------------- VOID Snow_Paint() { // if(g_SnowNum< PARTICLE_NUMBER) //Сڹ涨ʱµӣ趨ÿӵֵ { SnowFlowers[g_SnowNum].x = rand()%g_rect.right; //ӵXΪˮƽϵλ SnowFlowers[g_SnowNum].y = 0; //ÿӵY궼Ϊ"0"Ӵ SnowFlowers[g_SnowNum].exist = true; //趨Ӵ g_SnowNum++; //ÿһӺۼӼ } //жǷڣڣ͸ͼ for(int i=0;i g_rect.bottom) { SnowFlowers[i].x = rand()%g_rect.right; SnowFlowers[i].y = 0; } } } } //-----------------------------------Game_ShutDown( )--------------------------------- // Դڴ˺нг˳ǰԴ //-------------------------------------------------------------------------------------------------- BOOL Game_ShutDown( HWND hwnd ) { //ͷԴ DeleteObject(g_hBackGround); DeleteObject(g_hBackGround); DeleteObject(g_hGameOver); DeleteObject(g_hVictory); DeleteObject(g_hSnow); DeleteObject(g_hMonsterBitmap); DeleteObject(g_hHeroBitmap); DeleteObject(g_hRecoverSkill); DeleteObject(g_hSkillButton1); DeleteObject(g_hSkillButton2); DeleteObject(g_hSkillButton3); DeleteObject(g_hSkillButton4); DeleteObject(g_hHeroSkill1); DeleteObject(g_hHeroSkill2); DeleteObject(g_hHeroSkill3); DeleteObject(g_hBossSkill1); DeleteObject(g_hBossSkill2); DeleteObject(g_hBossSkill3); DeleteDC(g_bufdc); DeleteDC(g_mdc); ReleaseDC(hwnd,g_hdc); return TRUE; } ================================================ FILE: GDI-Game-Demo/2_FirstBlood!.cpp ================================================ #include #pragma comment(lib,"winmm.lib") int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow) { PlaySound(L"FirstBlood.wav", NULL, SND_FILENAME | SND_ASYNC); //Ч MessageBox( NULL, L"First blood! ãϷ磬ˣ", L"First blood! Ϣ", 0 );//ʾһϢ return 0; } ================================================ FILE: GDI-Game-Demo/3_GameCore.cpp ================================================ //-----------------------------------˵---------------------------------------------- // :GameCore // 20133 Create by dzī // ô빴ճϷij //------------------------------------------------------------------------------------------------ //-----------------------------------ͷļ֡--------------------------------------- // ͷļ //------------------------------------------------------------------------------------------------ #include //-----------------------------------궨岿֡-------------------------------------------- // һЩ //------------------------------------------------------------------------------------------------ #define WINDOW_WIDTH 800 //Ϊڿȶĺ꣬Էڴ˴޸Ĵڿ #define WINDOW_HEIGHT 600 //Ϊڸ߶ȶĺ꣬Էڴ˴޸Ĵڸ߶ #define WINDOW_TITLE L"ϨϷ롿Ŀ" //Ϊڱⶨĺ //-----------------------------------ȫֺ֡------------------------------------- // ȫֺֹδıʶϵд //------------------------------------------------------------------------------------------------ LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ); //ڹ̺ //-----------------------------------WinMain( )-------------------------------------- // WindowsӦóںǵij↑ʼ //------------------------------------------------------------------------------------------------ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nShowCmd) { //1ڴIJ֮һʼһĴ 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; //ָڹ̵ijʵ 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ڴIJ֮עᴰ if( !RegisterClassEx( &wndClass ) ) //괰ںҪԴעᣬܴ͵Ĵ return -1; //3ڴIJ֮ʽ HWND hwnd = CreateWindow( L"ForTheDreamOfGameDevelop",WINDOW_TITLE, //ϲּĴںCreateWindow WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, WINDOW_WIDTH, WINDOW_HEIGHT, NULL, NULL, hInstance, NULL ); //4ڴIJ֮ģڵƶʾ MoveWindow(hwnd,250,80,WINDOW_WIDTH,WINDOW_HEIGHT,true); //ʾʱλãʹϽλڣ250,80 ShowWindow( hwnd, nShowCmd ); //ShowWindowʾ UpdateWindow(hwnd); //Դڽи£·Ҫװһ //5Ϣѭ MSG msg = { 0 }; //岢ʼmsg while( msg.message != WM_QUIT ) //ʹwhileѭϢWM_QUITϢͼѭ { if( PeekMessage( &msg, 0, 0, 0, PM_REMOVE ) ) //鿴ӦóϢУϢʱеϢɷȥ { TranslateMessage( &msg ); //ϢתΪַϢ DispatchMessage( &msg ); //ַһϢڳ } } //6ע UnregisterClass(L"ForTheDreamOfGameDevelop", wndClass.hInstance); //׼ע return 0; } //-----------------------------------WndProc( )-------------------------------------- // ڹ̺WndProc,ԴϢд //------------------------------------------------------------------------------------------------ LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ) { switch( message ) //switch俪ʼ { case WM_PAINT: // ǿͻػϢ ValidateRect(hwnd, NULL); // ¿ͻʾ break; //switch case WM_KEYDOWN: // Ǽ̰Ϣ if (wParam == VK_ESCAPE) // µļESC DestroyWindow(hwnd); // ٴ, һWM_DESTROYϢ break; //switch case WM_DESTROY: //ǴϢ PostQuitMessage( 0 ); //ϵͳиֹ߳ӦWM_DESTROYϢ break; //switch default: //caseϣִиdefault return DefWindowProc( hwnd, message, wParam, lParam ); //ȱʡĴڹ } return 0; //˳ } ================================================ FILE: GDI-Game-Demo/4_GDIdemoCore.cpp ================================================ //-----------------------------------˵---------------------------------------------- // :GDIdemoCore // 20133 Create by dzī // ʵGDIϷĺij //------------------------------------------------------------------------------------------------ //-----------------------------------ͷļ֡--------------------------------------- // ͷļ //------------------------------------------------------------------------------------------------ #include //-----------------------------------궨岿֡-------------------------------------------- // һЩ //------------------------------------------------------------------------------------------------ #define WINDOW_WIDTH 800 //Ϊڿȶĺ꣬Էڴ˴޸Ĵڿ #define WINDOW_HEIGHT 600 //Ϊڸ߶ȶĺ꣬Էڴ˴޸Ĵڸ߶ #define WINDOW_TITLE L"ϨϷ롿GDIĿ" //Ϊڱⶨĺ //-----------------------------------ȫֱ֡------------------------------------- // ȫֱ //------------------------------------------------------------------------------------------------ HDC g_hdc=NULL; //ȫ豸 //-----------------------------------ȫֺ֡------------------------------------- // ȫֺֹδıʶϵд //------------------------------------------------------------------------------------------------ LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam );//ڹ̺ BOOL Game_Init(HWND hwnd); //ڴ˺нԴijʼ VOID Game_Paint( HWND hwnd); //ڴ˺нлͼд BOOL Game_CleanUp(HWND hwnd ); //ڴ˺нԴ //-----------------------------------WinMain( )-------------------------------------- // WindowsӦóںǵij↑ʼ //------------------------------------------------------------------------------------------------ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nShowCmd) { //1ڴIJ֮һʼһĴ 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; //ָڹ̵ijʵ 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ڴIJ֮עᴰ if( !RegisterClassEx( &wndClass ) ) //괰ںҪԴעᣬܴ͵Ĵ return -1; //3ڴIJ֮ʽ HWND hwnd = CreateWindow( L"ForTheDreamOfGameDevelop",WINDOW_TITLE, //ϲּĴںCreateWindow WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, WINDOW_WIDTH, WINDOW_HEIGHT, NULL, NULL, hInstance, NULL ); //4ڴIJ֮ģڵƶʾ MoveWindow(hwnd,250,80,WINDOW_WIDTH,WINDOW_HEIGHT,true); //ʾʱλãʹϽλڣ250,80 ShowWindow( hwnd, nShowCmd ); //ShowWindowʾ UpdateWindow(hwnd); //Դڽи£·Ҫװһ //ϷԴijʼʼʧܣһϢ򣬲FALSE if (!Game_Init (hwnd)) { MessageBox(hwnd, L"Դʼʧ", L"Ϣ", 0); //ʹMessageBoxһϢ return FALSE; } //5Ϣѭ MSG msg = { 0 }; //岢ʼmsg while( msg.message != WM_QUIT ) //ʹwhileѭϢWM_QUITϢͼѭ { if( PeekMessage( &msg, 0, 0, 0, PM_REMOVE ) ) //鿴ӦóϢУϢʱеϢɷȥ { TranslateMessage( &msg ); //ϢתΪַϢ DispatchMessage( &msg ); //ַһϢڳ } } //6ע UnregisterClass(L"ForTheDreamOfGameDevelop", wndClass.hInstance); //׼ע return 0; } //-----------------------------------WndProc( )-------------------------------------- // ڹ̺WndProc,ԴϢд //------------------------------------------------------------------------------------------------ LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ) { PAINTSTRUCT paintStruct; //һPAINTSTRUCTṹ¼һЩϢ switch( message ) //switch俪ʼ { case WM_PAINT: // ǿͻػϢ g_hdc = BeginPaint( hwnd, &paintStruct ); //ָڽлͼ׼ýͻͼйصϢ䵽paintStructṹС Game_Paint( hwnd); EndPaint( hwnd, &paintStruct ); //EndPaintָڵĻ滭̽ ValidateRect(hwnd, NULL); // ¿ͻʾ break; //switch case WM_KEYDOWN: // Ǽ̰Ϣ if (wParam == VK_ESCAPE) // µļESC DestroyWindow(hwnd); // ٴ, һWM_DESTROYϢ break; //switch case WM_DESTROY: //ǴϢ Game_CleanUp(hwnd); //ԶԴGame_CleanUp˳ǰԴ PostQuitMessage( 0 ); //ϵͳиֹ߳ӦWM_DESTROYϢ break; //switch default: //caseϣִиdefault return DefWindowProc( hwnd, message, wParam, lParam ); //ȱʡĴڹ } return 0; //˳ } //-----------------------------------Game_Init( )-------------------------------------- // ʼһЩ򵥵ijʼ //------------------------------------------------------------------------------------------------ BOOL Game_Init( HWND hwnd ) { g_hdc = GetDC(hwnd); Game_Paint( hwnd); return TRUE; } //-----------------------------------Game_Paint( )-------------------------------------- // ƺڴ˺нлƲ //-------------------------------------------------------------------------------------------------- VOID Game_Paint( HWND hwnd ) { } //-----------------------------------Game_CleanUp( )-------------------------------- // Դڴ˺нг˳ǰԴ //--------------------------------------------------------------------------------------------------- BOOL Game_CleanUp( HWND hwnd ) { ReleaseDC(hwnd,g_hdc); return TRUE; } ================================================ FILE: GDI-Game-Demo/5_GDIdemo1.cpp ================================================ //-----------------------------------˵---------------------------------------------- // :GDIdemoCore // 20133 Create by dzī // GDIλͼʾ //------------------------------------------------------------------------------------------------ //-----------------------------------ͷļ֡--------------------------------------- // ͷļ //------------------------------------------------------------------------------------------------ #include #include //ʹûȡϵͳʱtimeҪͷļ //-----------------------------------ļ֡--------------------------------------- // Ŀļ //------------------------------------------------------------------------------------------------ #pragma comment(lib,"winmm.lib") //PlaySoundļ //-----------------------------------궨岿֡-------------------------------------------- // һЩ //------------------------------------------------------------------------------------------------ #define WINDOW_WIDTH 800 //Ϊڿȶĺ꣬Էڴ˴޸Ĵڿ #define WINDOW_HEIGHT 600 //Ϊڸ߶ȶĺ꣬Էڴ˴޸Ĵڸ߶ #define WINDOW_TITLE L"ϨϷ롿GDIλͼ" //Ϊڱⶨĺ //-----------------------------------ȫֱ֡------------------------------------- // ȫֱ //------------------------------------------------------------------------------------------------ HDC g_hdc=NULL; //ȫ豸 HPEN g_hPen[7]={0}; //廭ʾ HBRUSH g_hBrush[7]={0}; //廭ˢ int g_iPenStyle[7] = {PS_SOLID,PS_DASH,PS_DOT,PS_DASHDOT,PS_DASHDOTDOT,PS_NULL,PS_INSIDEFRAME}; //廭ʽ鲢ʼ int g_iBrushStyle[6] = {HS_VERTICAL,HS_HORIZONTAL,HS_CROSS,HS_DIAGCROSS,HS_FDIAGONAL,HS_BDIAGONAL}; //廭ˢʽ鲢ʼ //-----------------------------------ȫֺ֡------------------------------------- // ȫֺֹδıʶϵд //------------------------------------------------------------------------------------------------ LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam );//ڹ̺ BOOL Game_Init(HWND hwnd); //ڴ˺нԴijʼ VOID Game_Paint( HWND hwnd); //ڴ˺нлͼд BOOL Game_CleanUp(HWND hwnd ); //ڴ˺нԴ //-----------------------------------WinMain( )-------------------------------------- // WindowsӦóںǵij↑ʼ //------------------------------------------------------------------------------------------------ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nShowCmd) { //1ڴIJ֮һʼһĴ 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; //ָڹ̵ijʵ 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(WHITE_BRUSH); //ΪhbrBackgroundԱָһɫˢ wndClass.lpszMenuName = NULL; //һԿַָֹ˵Դ֡ wndClass.lpszClassName = L"ForTheDreamOfGameDevelop"; //һԿַָֹ֡ //2ڴIJ֮עᴰ if( !RegisterClassEx( &wndClass ) ) //괰ںҪԴעᣬܴ͵Ĵ return -1; //3ڴIJ֮ʽ HWND hwnd = CreateWindow( L"ForTheDreamOfGameDevelop",WINDOW_TITLE, //ϲּĴںCreateWindow WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, WINDOW_WIDTH, WINDOW_HEIGHT, NULL, NULL, hInstance, NULL ); //4ڴIJ֮ģڵƶʾ MoveWindow(hwnd,250,80,WINDOW_WIDTH,WINDOW_HEIGHT,true); //ʾʱλãʹϽλڣ250,80 ShowWindow( hwnd, nShowCmd ); //ShowWindowʾ UpdateWindow(hwnd); //Դڽи£·Ҫװһ //ϷԴijʼʼʧܣһϢ򣬲FALSE if (!Game_Init (hwnd)) { MessageBox(hwnd, L"Դʼʧ", L"Ϣ", 0); //ʹMessageBoxһϢ return FALSE; } PlaySound(L"AIR - Ӱ.wav", NULL, SND_FILENAME | SND_ASYNC|SND_LOOP); //ѭű //5Ϣѭ MSG msg = { 0 }; //岢ʼmsg while( msg.message != WM_QUIT ) //ʹwhileѭϢWM_QUITϢͼѭ { if( PeekMessage( &msg, 0, 0, 0, PM_REMOVE ) ) //鿴ӦóϢУϢʱеϢɷȥ { TranslateMessage( &msg ); //ϢתΪַϢ DispatchMessage( &msg ); //ַһϢڳ } } //6ע UnregisterClass(L"ForTheDreamOfGameDevelop", wndClass.hInstance); //׼ע return 0; } //-----------------------------------WndProc( )-------------------------------------- // ڹ̺WndProc,ԴϢд //------------------------------------------------------------------------------------------------ LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ) { PAINTSTRUCT paintStruct; //һPAINTSTRUCTṹ¼һЩϢ switch( message ) //switch俪ʼ { case WM_PAINT: // ǿͻػϢ g_hdc = BeginPaint( hwnd, &paintStruct ); //ָڽлͼ׼ýͻͼйصϢ䵽paintStructṹС Game_Paint( hwnd); EndPaint( hwnd, &paintStruct ); //EndPaintָڵĻ滭̽ ValidateRect(hwnd, NULL); // ¿ͻʾ break; //switch case WM_KEYDOWN: // Ǽ̰Ϣ if (wParam == VK_ESCAPE) // µļESC DestroyWindow(hwnd); // ٴ, һWM_DESTROYϢ break; //switch case WM_DESTROY: //ǴϢ Game_CleanUp(hwnd); //ԶԴGame_CleanUp˳ǰԴ PostQuitMessage( 0 ); //ϵͳиֹ߳ӦWM_DESTROYϢ break; //switch default: //caseϣִиdefault return DefWindowProc( hwnd, message, wParam, lParam ); //ȱʡĴڹ } return 0; //˳ } //-----------------------------------Game_Init( )-------------------------------------- // ʼһЩ򵥵ijʼ //------------------------------------------------------------------------------------------------ BOOL Game_Init( HWND hwnd ) { g_hdc = GetDC(hwnd); //ȡ豸 srand((unsigned)time(NULL)); //ϵͳʱʼ //ʼʺͻˢɫֵ for(int i=0;i<=6;i++) { g_hPen[i] = CreatePen(g_iPenStyle[i],1,RGB(rand()%256,rand()%256,rand()%256)); if(i==6) g_hBrush[i] = CreateSolidBrush(RGB(rand()%256,rand()%256,rand()%256)); else g_hBrush[i] = CreateHatchBrush(g_iBrushStyle[i],RGB(rand()%256,rand()%256,rand()%256)); } Game_Paint(hwnd); ReleaseDC(hwnd,g_hdc); return TRUE; } //-----------------------------------Game_Paint( )-------------------------------------- // ƺڴ˺нлƲ //-------------------------------------------------------------------------------------------------- VOID Game_Paint( HWND hwnd ) { //һyֵ int y=0; //һforѭ7ֲͬĻʻ for(int i=0;i<=6;i++) { y = (i+1) * 70; SelectObject(g_hdc,g_hPen[i]);//ӦĻѡ MoveToEx(g_hdc,30,y,NULL); //ꡱƶӦģ30y괦 LineTo(g_hdc,100,y); //ӣ30y괦100y߶ } /*ע滭y=420滭εʱ*/ //xֵ int x1 = 120; int x2 = 190; //7ֲͬĻˢ for(int i=0;i<=6;i++) { SelectObject(g_hdc,g_hBrush[i]); //ѡûˢ Rectangle(g_hdc,x1,70,x2,y); //һյľΣϽΪx1,50½Ϊx2y x1 += 90; x2 += 90; } } //-----------------------------------Game_CleanUp( )-------------------------------- // Դڴ˺нг˳ǰԴ //--------------------------------------------------------------------------------------------------- BOOL Game_CleanUp( HWND hwnd ) { //һforѭͷŵеĻʺͻˢ for (int i=0;i<=6;i++) { DeleteObject(g_hPen[i]); DeleteObject(g_hBrush[i]); } return TRUE; } ================================================ FILE: GDI-Game-Demo/6_GDIdemo2.cpp ================================================ //-----------------------------------˵---------------------------------------------- // :GDIdemoCore // 20133 Create by dzī // GDIʾ //------------------------------------------------------------------------------------------------ //-----------------------------------ͷļ֡--------------------------------------- // ͷļ //------------------------------------------------------------------------------------------------ #include //-----------------------------------ļ֡--------------------------------------- // Ŀļ //------------------------------------------------------------------------------------------------ #pragma comment(lib,"winmm.lib") //PlaySoundļ //-----------------------------------궨岿֡-------------------------------------------- // һЩ //------------------------------------------------------------------------------------------------ #define WINDOW_WIDTH 800 //Ϊڿȶĺ꣬Էڴ˴޸Ĵڿ #define WINDOW_HEIGHT 600 //Ϊڸ߶ȶĺ꣬Էڴ˴޸Ĵڸ߶ #define WINDOW_TITLE L"ϨϷ롿GDIʾ" //Ϊڱⶨĺ //-----------------------------------ȫֱ֡------------------------------------- // ȫֱ //------------------------------------------------------------------------------------------------ HDC g_hdc=NULL; //ȫ豸 //-----------------------------------ȫֺ֡------------------------------------- // ȫֺֹδıʶϵд //------------------------------------------------------------------------------------------------ LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam );//ڹ̺ BOOL Game_Init(HWND hwnd); //ڴ˺нԴijʼ VOID Game_Paint( HWND hwnd); //ڴ˺нлͼд BOOL Game_CleanUp(HWND hwnd ); //ڴ˺нԴ //-----------------------------------WinMain( )-------------------------------------- // WindowsӦóںǵij↑ʼ //------------------------------------------------------------------------------------------------ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nShowCmd) { //1ڴIJ֮һʼһĴ 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; //ָڹ̵ijʵ 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(WHITE_BRUSH); //ΪhbrBackgroundԱָһɫˢ wndClass.lpszMenuName = NULL; //һԿַָֹ˵Դ֡ wndClass.lpszClassName = L"ForTheDreamOfGameDevelop"; //һԿַָֹ֡ //2ڴIJ֮עᴰ if( !RegisterClassEx( &wndClass ) ) //괰ںҪԴעᣬܴ͵Ĵ return -1; //3ڴIJ֮ʽ HWND hwnd = CreateWindow( L"ForTheDreamOfGameDevelop",WINDOW_TITLE, //ϲּĴںCreateWindow WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, WINDOW_WIDTH, WINDOW_HEIGHT, NULL, NULL, hInstance, NULL ); //4ڴIJ֮ģڵƶʾ MoveWindow(hwnd,250,80,WINDOW_WIDTH,WINDOW_HEIGHT,true); //ʾʱλãʹϽλڣ250,80 ShowWindow( hwnd, nShowCmd ); //ShowWindowʾ UpdateWindow(hwnd); //Դڽи£·Ҫװһ //ϷԴijʼʼʧܣһϢ򣬲FALSE if (!Game_Init (hwnd)) { MessageBox(hwnd, L"Դʼʧ", L"Ϣ", 0); //ʹMessageBoxһϢ return FALSE; } PlaySound(L"֮ʫ.wav", NULL, SND_FILENAME | SND_ASYNC|SND_LOOP); //ѭű //5Ϣѭ MSG msg = { 0 }; //岢ʼmsg while( msg.message != WM_QUIT ) //ʹwhileѭϢWM_QUITϢͼѭ { if( PeekMessage( &msg, 0, 0, 0, PM_REMOVE ) ) //鿴ӦóϢУϢʱеϢɷȥ { TranslateMessage( &msg ); //ϢתΪַϢ DispatchMessage( &msg ); //ַһϢڳ } } //6ע UnregisterClass(L"ForTheDreamOfGameDevelop", wndClass.hInstance); //׼ע return 0; } //-----------------------------------WndProc( )-------------------------------------- // ڹ̺WndProc,ԴϢд //------------------------------------------------------------------------------------------------ LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ) { PAINTSTRUCT paintStruct; //һPAINTSTRUCTṹ¼һЩϢ switch( message ) //switch俪ʼ { case WM_PAINT: // ǿͻػϢ g_hdc = BeginPaint( hwnd, &paintStruct ); //ָڽлͼ׼ýͻͼйصϢ䵽paintStructṹС Game_Paint( hwnd); EndPaint( hwnd, &paintStruct ); //EndPaintָڵĻ滭̽ ValidateRect(hwnd, NULL); // ¿ͻʾ break; //switch case WM_KEYDOWN: // Ǽ̰Ϣ if (wParam == VK_ESCAPE) // µļESC DestroyWindow(hwnd); // ٴ, һWM_DESTROYϢ break; //switch case WM_DESTROY: //ǴϢ Game_CleanUp(hwnd); //ԶԴGame_CleanUp˳ǰԴ PostQuitMessage( 0 ); //ϵͳиֹ߳ӦWM_DESTROYϢ break; //switch default: //caseϣִиdefault return DefWindowProc( hwnd, message, wParam, lParam ); //ȱʡĴڹ } return 0; //˳ } //-----------------------------------Game_Init( )-------------------------------------- // ʼһЩ򵥵ijʼ //------------------------------------------------------------------------------------------------ BOOL Game_Init( HWND hwnd ) { g_hdc = GetDC(hwnd); //ȡ豸 Game_Paint(hwnd); ReleaseDC(hwnd,g_hdc); //ͷ豸 return TRUE; } //-----------------------------------Game_Paint( )-------------------------------------- // ƺڴ˺нлƲ //-------------------------------------------------------------------------------------------------- VOID Game_Paint( HWND hwnd ) { HFONT hFont=CreateFont(30,0,0,0,0,0,0,0,GB2312_CHARSET,0,0,0,0,L"΢ź"); //һ SelectObject(g_hdc,hFont); //ѡ豸 SetBkMode(g_hdc, TRANSPARENT); //ֱɫΪ͸ // wchar_t text1[]=L"е붼Գ棬ֻҪȥ׷ǡ"; wchar_t text2[]=L"All our dreams can come true, if we have the courage to pursue them. "; wchar_t text3[]=L"--------ֶ ˹"; //ɫһ SetTextColor(g_hdc,RGB(50,255,50)); TextOut(g_hdc,30,150,text1,wcslen(text1)); //ɫڶ SetTextColor(g_hdc,RGB(50,50,255)); TextOut(g_hdc,30,200,text2,wcslen(text2)); //ɫ SetTextColor(g_hdc,RGB(255,150,50)); TextOut(g_hdc,500,250,text3,wcslen(text3)); DeleteObject(hFont);//ͷ } //-----------------------------------Game_CleanUp( )-------------------------------- // Դڴ˺нг˳ǰԴ //--------------------------------------------------------------------------------------------------- BOOL Game_CleanUp( HWND hwnd ) { return TRUE; } ================================================ FILE: GDI-Game-Demo/7_GDIdemo3.cpp ================================================ //-----------------------------------˵---------------------------------------------- // :GDIdemoCore // 20133 Create by dzī // GDIλͼʾ //------------------------------------------------------------------------------------------------ //-----------------------------------ͷļ֡--------------------------------------- // ͷļ //------------------------------------------------------------------------------------------------ #include //-----------------------------------ļ֡--------------------------------------- // Ŀļ //------------------------------------------------------------------------------------------------ #pragma comment(lib,"winmm.lib") //PlaySoundļ //-----------------------------------궨岿֡-------------------------------------------- // һЩ //------------------------------------------------------------------------------------------------ #define WINDOW_WIDTH 932 //Ϊڿȶĺ꣬Էڴ˴޸Ĵڿ #define WINDOW_HEIGHT 700 //Ϊڸ߶ȶĺ꣬Էڴ˴޸Ĵڸ߶ #define WINDOW_TITLE L"ϨϷ롿GDIλͼʾ" //Ϊڱⶨĺ //-----------------------------------ȫֱ֡------------------------------------- // ȫֱ //------------------------------------------------------------------------------------------------ HDC g_hdc=NULL,g_mdc=NULL; //ȫ豸 HBITMAP g_hBitmap=NULL; //һλͼ //-----------------------------------ȫֺ֡------------------------------------- // ȫֺֹδıʶϵд //------------------------------------------------------------------------------------------------ LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam );//ڹ̺ BOOL Game_Init(HWND hwnd); //ڴ˺нԴijʼ VOID Game_Paint( HWND hwnd); //ڴ˺нлͼд BOOL Game_CleanUp(HWND hwnd ); //ڴ˺нԴ //-----------------------------------WinMain( )-------------------------------------- // WindowsӦóںǵij↑ʼ //------------------------------------------------------------------------------------------------ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nShowCmd) { //1ڴIJ֮һʼһĴ 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; //ָڹ̵ijʵ 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(WHITE_BRUSH); //ΪhbrBackgroundԱָһɫˢ wndClass.lpszMenuName = NULL; //һԿַָֹ˵Դ֡ wndClass.lpszClassName = L"ForTheDreamOfGameDevelop"; //һԿַָֹ֡ //2ڴIJ֮עᴰ if( !RegisterClassEx( &wndClass ) ) //괰ںҪԴעᣬܴ͵Ĵ return -1; //3ڴIJ֮ʽ HWND hwnd = CreateWindow( L"ForTheDreamOfGameDevelop",WINDOW_TITLE, //ϲּĴںCreateWindow WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, WINDOW_WIDTH, WINDOW_HEIGHT, NULL, NULL, hInstance, NULL ); //4ڴIJ֮ģڵƶʾ MoveWindow(hwnd,200,20,WINDOW_WIDTH,WINDOW_HEIGHT,true); //ʾʱλãʹϽλڣ200,20 ShowWindow( hwnd, nShowCmd ); //ShowWindowʾ UpdateWindow(hwnd); //Դڽи£·Ҫװһ //ϷԴijʼʼʧܣһϢ򣬲FALSE if (!Game_Init (hwnd)) { MessageBox(hwnd, L"Դʼʧ", L"Ϣ", 0); //ʹMessageBoxһϢ return FALSE; } PlaySound(L"o.wav", NULL, SND_FILENAME | SND_ASYNC|SND_LOOP); //ѭű //5Ϣѭ MSG msg = { 0 }; //岢ʼmsg while( msg.message != WM_QUIT ) //ʹwhileѭϢWM_QUITϢͼѭ { if( PeekMessage( &msg, 0, 0, 0, PM_REMOVE ) ) //鿴ӦóϢУϢʱеϢɷȥ { TranslateMessage( &msg ); //ϢתΪַϢ DispatchMessage( &msg ); //ַһϢڳ } } //6ע UnregisterClass(L"ForTheDreamOfGameDevelop", wndClass.hInstance); //׼ע return 0; } //-----------------------------------WndProc( )-------------------------------------- // ڹ̺WndProc,ԴϢд //------------------------------------------------------------------------------------------------ LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ) { PAINTSTRUCT paintStruct; //һPAINTSTRUCTṹ¼һЩϢ switch( message ) //switch俪ʼ { case WM_PAINT: // ǿͻػϢ g_hdc = BeginPaint( hwnd, &paintStruct ); //ָڽлͼ׼ýͻͼйصϢ䵽paintStructṹС Game_Paint( hwnd); EndPaint( hwnd, &paintStruct ); //EndPaintָڵĻ滭̽ ValidateRect(hwnd, NULL); // ¿ͻʾ break; //switch case WM_KEYDOWN: // Ǽ̰Ϣ if (wParam == VK_ESCAPE) // µļESC DestroyWindow(hwnd); // ٴ, һWM_DESTROYϢ break; //switch case WM_DESTROY: //ǴϢ Game_CleanUp(hwnd); //ԶԴGame_CleanUp˳ǰԴ PostQuitMessage( 0 ); //ϵͳиֹ߳ӦWM_DESTROYϢ break; //switch default: //caseϣִиdefault return DefWindowProc( hwnd, message, wParam, lParam ); //ȱʡĴڹ } return 0; //˳ } //-----------------------------------Game_Init( )-------------------------------------- // ʼһЩ򵥵ijʼ //------------------------------------------------------------------------------------------------ BOOL Game_Init( HWND hwnd ) { g_hdc = GetDC(hwnd); //ȡ豸 //-----λͼIJ֮һλͼ----- g_hBitmap = (HBITMAP)LoadImage(NULL,L"Naruto.bmp",IMAGE_BITMAP,WINDOW_WIDTH,WINDOW_HEIGHT,LR_LOADFROMFILE); //λͼ //-----λͼIJ֮DC----- g_mdc = CreateCompatibleDC(g_hdc); //豸ڴDC Game_Paint(hwnd); ReleaseDC(hwnd,g_hdc); //ͷ豸 return TRUE; } //-----------------------------------Game_Paint( )-------------------------------------- // ƺڴ˺нлƲ //-------------------------------------------------------------------------------------------------- VOID Game_Paint( HWND hwnd ) { //-----λͼIJ֮ѡλͼ ----- SelectObject(g_mdc,g_hBitmap); //λͼѡ뵽g_mdcڴDC //-----λͼIJ֮ģͼ----- BitBlt(g_hdc,0,0,WINDOW_WIDTH,WINDOW_HEIGHT,g_mdc,0,0,SRCCOPY); //BitBltͼΪڴС } //-----------------------------------Game_CleanUp( )-------------------------------- // Դڴ˺нг˳ǰԴ //--------------------------------------------------------------------------------------------------- BOOL Game_CleanUp( HWND hwnd ) { //ͷԴ DeleteObject(g_hBitmap); DeleteDC(g_mdc); return TRUE; } ================================================ FILE: GDI-Game-Demo/8_GDIdemo4.cpp ================================================ //-----------------------------------˵---------------------------------------------- // :GDIdemo4 // 20133 Create by dzī // ͸ͼϵ֮͸ַ ʾ //------------------------------------------------------------------------------------------------ //-----------------------------------ͷļ֡--------------------------------------- // ͷļ //------------------------------------------------------------------------------------------------ #include //-----------------------------------ļ֡--------------------------------------- // Ŀļ //------------------------------------------------------------------------------------------------ #pragma comment(lib,"winmm.lib") //PlaySoundļ //-----------------------------------궨岿֡-------------------------------------------- // һЩ //------------------------------------------------------------------------------------------------ #define WINDOW_WIDTH 932 //Ϊڿȶĺ꣬Էڴ˴޸Ĵڿ #define WINDOW_HEIGHT 700 //Ϊڸ߶ȶĺ꣬Էڴ˴޸Ĵڸ߶ #define WINDOW_TITLE L"ϨϷ롿͸ͼϵ֮͸ַ" //Ϊڱⶨĺ //-----------------------------------ȫֱ֡------------------------------------- // ȫֱ //------------------------------------------------------------------------------------------------ HDC g_hdc=NULL,g_mdc=NULL; //ȫ豸ȫڴDC HBITMAP g_hBackGround,g_hCharacter1,g_hCharacter2; //3λͼ3ͼƬĴ //-----------------------------------ȫֺ֡------------------------------------- // ȫֺֹδıʶϵд //------------------------------------------------------------------------------------------------ LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam );//ڹ̺ BOOL Game_Init(HWND hwnd); //ڴ˺нԴijʼ VOID Game_Paint( HWND hwnd); //ڴ˺нлͼд BOOL Game_CleanUp(HWND hwnd ); //ڴ˺нԴ //-----------------------------------WinMain( )-------------------------------------- // WindowsӦóںǵij↑ʼ //------------------------------------------------------------------------------------------------ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nShowCmd) { //1ڴIJ֮һʼһĴ 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; //ָڹ̵ijʵ 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(WHITE_BRUSH); //ΪhbrBackgroundԱָһɫˢ wndClass.lpszMenuName = NULL; //һԿַָֹ˵Դ֡ wndClass.lpszClassName = L"ForTheDreamOfGameDevelop"; //һԿַָֹ֡ //2ڴIJ֮עᴰ if( !RegisterClassEx( &wndClass ) ) //괰ںҪԴעᣬܴ͵Ĵ return -1; //3ڴIJ֮ʽ HWND hwnd = CreateWindow( L"ForTheDreamOfGameDevelop",WINDOW_TITLE, //ϲּĴںCreateWindow WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, WINDOW_WIDTH, WINDOW_HEIGHT, NULL, NULL, hInstance, NULL ); //4ڴIJ֮ģڵƶʾ MoveWindow(hwnd,200,20,WINDOW_WIDTH,WINDOW_HEIGHT,true); //ʾʱλãʹϽλڣ200,20 ShowWindow( hwnd, nShowCmd ); //ShowWindowʾ UpdateWindow(hwnd); //Դڽи£·Ҫװһ //ϷԴijʼʼʧܣһϢ򣬲FALSE if (!Game_Init (hwnd)) { MessageBox(hwnd, L"Դʼʧ", L"Ϣ", 0); //ʹMessageBoxһϢ return FALSE; } PlaySound(L"ƿʱ1.wav", NULL, SND_FILENAME | SND_ASYNC|SND_LOOP); //ѭű //5Ϣѭ MSG msg = { 0 }; //岢ʼmsg while( msg.message != WM_QUIT ) //ʹwhileѭϢWM_QUITϢͼѭ { if( PeekMessage( &msg, 0, 0, 0, PM_REMOVE ) ) //鿴ӦóϢУϢʱеϢɷȥ { TranslateMessage( &msg ); //ϢתΪַϢ DispatchMessage( &msg ); //ַһϢڳ } } //6ע UnregisterClass(L"ForTheDreamOfGameDevelop", wndClass.hInstance); //׼ע return 0; } //-----------------------------------WndProc( )-------------------------------------- // ڹ̺WndProc,ԴϢд //------------------------------------------------------------------------------------------------ LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ) { PAINTSTRUCT paintStruct; //һPAINTSTRUCTṹ¼һЩϢ switch( message ) //switch俪ʼ { case WM_PAINT: // ǿͻػϢ g_hdc = BeginPaint( hwnd, &paintStruct ); //ָڽлͼ׼ýͻͼйصϢ䵽paintStructṹС Game_Paint( hwnd); EndPaint( hwnd, &paintStruct ); //EndPaintָڵĻ滭̽ ValidateRect(hwnd, NULL); // ¿ͻʾ break; //switch case WM_KEYDOWN: // Ǽ̰Ϣ if (wParam == VK_ESCAPE) // µļESC DestroyWindow(hwnd); // ٴ, һWM_DESTROYϢ break; //switch case WM_DESTROY: //ǴϢ Game_CleanUp(hwnd); //ԶԴGame_CleanUp˳ǰԴ PostQuitMessage( 0 ); //ϵͳиֹ߳ӦWM_DESTROYϢ break; //switch default: //caseϣִиdefault return DefWindowProc( hwnd, message, wParam, lParam ); //ȱʡĴڹ } return 0; //˳ } //-----------------------------------Game_Init( )-------------------------------------- // ʼһЩ򵥵ijʼ //------------------------------------------------------------------------------------------------ BOOL Game_Init( HWND hwnd ) { g_hdc = GetDC(hwnd); //ȡ豸 //-----λͼIJ֮һλͼ----- //ļ3λͼ g_hBackGround = (HBITMAP)LoadImage(NULL,L"bg.bmp",IMAGE_BITMAP,WINDOW_WIDTH,WINDOW_HEIGHT,LR_LOADFROMFILE); g_hCharacter1 = (HBITMAP)LoadImage(NULL,L"character1.bmp",IMAGE_BITMAP,640,579,LR_LOADFROMFILE); g_hCharacter2 = (HBITMAP)LoadImage(NULL,L"character2.bmp",IMAGE_BITMAP,800,584,LR_LOADFROMFILE); //-----λͼIJ֮DC----- g_mdc = CreateCompatibleDC(g_hdc); //豸ڴDC Game_Paint(hwnd); ReleaseDC(hwnd,g_hdc); //ͷ豸 return TRUE; } //-----------------------------------Game_Paint( )-------------------------------------- // ƺڴ˺нлƲ //-------------------------------------------------------------------------------------------------- VOID Game_Paint( HWND hwnd ) { //ϱͼ SelectObject(g_mdc,g_hBackGround); BitBlt(g_hdc,0,0,WINDOW_WIDTH,WINDOW_HEIGHT,g_mdc,0,0,SRCCOPY); //BitBltg_hdcϱͼ //͸ַƳһ SelectObject(g_mdc,g_hCharacter1); BitBlt(g_hdc,50,WINDOW_HEIGHT-579,320,640,g_mdc,320,0,SRCAND);//͸ַһͼ뱳ͼ"AND" BitBlt(g_hdc,50,WINDOW_HEIGHT-579,320,640,g_mdc,0,0,SRCPAINT);//͸ַڶǰͼ뱳ͼ"OR" //͸ַƳڶ SelectObject(g_mdc,g_hCharacter2); BitBlt(g_hdc,450,WINDOW_HEIGHT-584,400,584,g_mdc,400,0,SRCAND);//͸ַһͼ뱳ͼ"AND" BitBlt(g_hdc,450,WINDOW_HEIGHT-584,400,584,g_mdc,0,0,SRCPAINT);//͸ַڶǰͼ뱳ͼ"OR" } //-----------------------------------Game_CleanUp( )-------------------------------- // Դڴ˺нг˳ǰԴ //--------------------------------------------------------------------------------------------------- BOOL Game_CleanUp( HWND hwnd ) { //ͷԴ DeleteObject(g_hBackGround); DeleteObject(g_hCharacter2); DeleteObject(g_hCharacter1); DeleteDC(g_mdc); return TRUE; } ================================================ FILE: GDI-Game-Demo/9_GDIdemo5.cpp ================================================ //-----------------------------------˵---------------------------------------------- // :GDIdemo5 // 20133 Create by dzī // ͸ͼϵ֮͸ɫʷ ʾ //------------------------------------------------------------------------------------------------ //-----------------------------------ͷļ֡--------------------------------------- // ͷļ //------------------------------------------------------------------------------------------------ #include //-----------------------------------ļ֡--------------------------------------- // Ŀļ //------------------------------------------------------------------------------------------------ #pragma comment(lib,"winmm.lib") //PlaySoundļ #pragma comment(lib,"Msimg32.lib") //ʹTransparentBltĿļ //-----------------------------------궨岿֡-------------------------------------------- // һЩ //------------------------------------------------------------------------------------------------ #define WINDOW_WIDTH 932 //Ϊڿȶĺ꣬Էڴ˴޸Ĵڿ #define WINDOW_HEIGHT 700 //Ϊڸ߶ȶĺ꣬Էڴ˴޸Ĵڸ߶ #define WINDOW_TITLE L"ϨϷ롿͸ͼϵ֮͸ɫʷ" //Ϊڱⶨĺ //-----------------------------------ȫֱ֡------------------------------------- // ȫֱ //------------------------------------------------------------------------------------------------ HDC g_hdc=NULL,g_mdc=NULL; //ȫ豸ȫڴDC HBITMAP g_hBackGround,g_hCharacter1,g_hCharacter2; //3λͼ3ͼƬĴ //-----------------------------------ȫֺ֡------------------------------------- // ȫֺֹδıʶϵд //------------------------------------------------------------------------------------------------ LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam );//ڹ̺ BOOL Game_Init(HWND hwnd); //ڴ˺нԴijʼ VOID Game_Paint( HWND hwnd); //ڴ˺нлͼд BOOL Game_CleanUp(HWND hwnd ); //ڴ˺нԴ //-----------------------------------WinMain( )-------------------------------------- // WindowsӦóںǵij↑ʼ //------------------------------------------------------------------------------------------------ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nShowCmd) { //1ڴIJ֮һʼһĴ 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; //ָڹ̵ijʵ 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(WHITE_BRUSH); //ΪhbrBackgroundԱָһɫˢ wndClass.lpszMenuName = NULL; //һԿַָֹ˵Դ֡ wndClass.lpszClassName = L"ForTheDreamOfGameDevelop"; //һԿַָֹ֡ //2ڴIJ֮עᴰ if( !RegisterClassEx( &wndClass ) ) //괰ںҪԴעᣬܴ͵Ĵ return -1; //3ڴIJ֮ʽ HWND hwnd = CreateWindow( L"ForTheDreamOfGameDevelop",WINDOW_TITLE, //ϲּĴںCreateWindow WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, WINDOW_WIDTH, WINDOW_HEIGHT, NULL, NULL, hInstance, NULL ); //4ڴIJ֮ģڵƶʾ MoveWindow(hwnd,200,20,WINDOW_WIDTH,WINDOW_HEIGHT,true); //ʾʱλãʹϽλڣ200,20 ShowWindow( hwnd, nShowCmd ); //ShowWindowʾ UpdateWindow(hwnd); //Դڽи£·Ҫװһ //ϷԴijʼʼʧܣһϢ򣬲FALSE if (!Game_Init (hwnd)) { MessageBox(hwnd, L"Դʼʧ", L"Ϣ", 0); //ʹMessageBoxһϢ return FALSE; } PlaySound(L"쥹ˮ_.wav", NULL, SND_FILENAME | SND_ASYNC|SND_LOOP); //ѭű //5Ϣѭ MSG msg = { 0 }; //岢ʼmsg while( msg.message != WM_QUIT ) //ʹwhileѭϢWM_QUITϢͼѭ { if( PeekMessage( &msg, 0, 0, 0, PM_REMOVE ) ) //鿴ӦóϢУϢʱеϢɷȥ { TranslateMessage( &msg ); //ϢתΪַϢ DispatchMessage( &msg ); //ַһϢڳ } } //6ע UnregisterClass(L"ForTheDreamOfGameDevelop", wndClass.hInstance); //׼ע return 0; } //-----------------------------------WndProc( )-------------------------------------- // ڹ̺WndProc,ԴϢд //------------------------------------------------------------------------------------------------ LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ) { PAINTSTRUCT paintStruct; //һPAINTSTRUCTṹ¼һЩϢ switch( message ) //switch俪ʼ { case WM_PAINT: // ǿͻػϢ g_hdc = BeginPaint( hwnd, &paintStruct ); //ָڽлͼ׼ýͻͼйصϢ䵽paintStructṹС Game_Paint( hwnd); EndPaint( hwnd, &paintStruct ); //EndPaintָڵĻ滭̽ ValidateRect(hwnd, NULL); // ¿ͻʾ break; //switch case WM_KEYDOWN: // Ǽ̰Ϣ if (wParam == VK_ESCAPE) // µļESC DestroyWindow(hwnd); // ٴ, һWM_DESTROYϢ break; //switch case WM_DESTROY: //ǴϢ Game_CleanUp(hwnd); //ԶԴGame_CleanUp˳ǰԴ PostQuitMessage( 0 ); //ϵͳиֹ߳ӦWM_DESTROYϢ break; //switch default: //caseϣִиdefault return DefWindowProc( hwnd, message, wParam, lParam ); //ȱʡĴڹ } return 0; //˳ } //-----------------------------------Game_Init( )-------------------------------------- // ʼһЩ򵥵ijʼ //------------------------------------------------------------------------------------------------ BOOL Game_Init( HWND hwnd ) { g_hdc = GetDC(hwnd); //ȡ豸 //-----λͼIJ֮һλͼ----- //ļ3λͼ g_hBackGround = (HBITMAP)LoadImage(NULL,L"bg.bmp",IMAGE_BITMAP,WINDOW_WIDTH,WINDOW_HEIGHT,LR_LOADFROMFILE); g_hCharacter1 = (HBITMAP)LoadImage(NULL,L"character1.bmp",IMAGE_BITMAP,535,650,LR_LOADFROMFILE); g_hCharacter2 = (HBITMAP)LoadImage(NULL,L"character2.bmp",IMAGE_BITMAP,506,650,LR_LOADFROMFILE); //-----λͼIJ֮DC----- g_mdc = CreateCompatibleDC(g_hdc); //豸ڴDC Game_Paint(hwnd); ReleaseDC(hwnd,g_hdc); //ͷ豸 return TRUE; } //-----------------------------------Game_Paint( )-------------------------------------- // ƺڴ˺нлƲ //-------------------------------------------------------------------------------------------------- VOID Game_Paint( HWND hwnd ) { //ϱͼ SelectObject(g_mdc,g_hBackGround); BitBlt(g_hdc,0,0,WINDOW_WIDTH,WINDOW_HEIGHT,g_mdc,0,0,SRCCOPY); //BitBltg_hdcϱͼ //һͼ SelectObject(g_mdc,g_hCharacter1); TransparentBlt(g_hdc,0,WINDOW_HEIGHT-650,535,650,g_mdc,0,0,535,650,RGB(0,0,0));//͸ɫΪRGB(0,0,0) //ڶͼ SelectObject(g_mdc,g_hCharacter2); TransparentBlt(g_hdc,500,WINDOW_HEIGHT-650,506,650,g_mdc,0,0,506,650,RGB(0,0,0));//͸ɫΪRGB(0,0,0) } //-----------------------------------Game_CleanUp( )-------------------------------- // Դڴ˺нг˳ǰԴ //--------------------------------------------------------------------------------------------------- BOOL Game_CleanUp( HWND hwnd ) { //ͷԴ DeleteObject(g_hBackGround); DeleteObject(g_hCharacter2); DeleteObject(g_hCharacter1); DeleteDC(g_mdc); return TRUE; } ================================================ FILE: README.md ================================================ 《逐梦旅程:Windows游戏编程之从零开始》源代码 ===============================
# 简介 这是我在23岁出国留学期间,花费一年时间所著的一本关于如何利用Win32和Direct3D、C++开发端游的入门级游戏教程。 ![](http://img.blog.csdn.net/20150327124003877?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
# 一些游戏demo运行截图
![](http://img.blog.csdn.net/20131021011428343?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) ![](http://img.blog.csdn.net/20131021011222000?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) ![](http://img.blog.csdn.net/20131021011251062?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) ![](http://img.blog.csdn.net/20131021012735937?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) ![](http://img.blog.csdn.net/20131021011652125?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) ![](http://img.blog.csdn.net/20131021011504062?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) ![](http://img.blog.csdn.net/20131021011518875?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcG9lbV9xaWFubW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
# 所有资源文件的下载 此仓库中仅上传了全部源代码,资源和工程可以移步[这里](http://pan.baidu.com/s/13PVB3)下载。



# 配套示例程序的一些说明 ### 第3章 1.【FirstBlood!】 一个简单的Windows API示例程序,并附有dota中第一个击杀会播放的很酷的“FirstBlood”音效。 2.【GameCore】 用代码勾勒出游戏开发所需的核心框架程序 ### 第4章 3.【GDIdemoCore】实现GDI游戏开发所需的核心框架程序 4.【GDIdemo1】GDI基本几何绘图示例程序 5.【GDIdemo2】GDI文字输出示例程序 6.【GDIdemo3】GDI位图绘制示例程序 ### 第5章 7.【GDIdemo4】透明贴图两套体系之:透明遮罩法示例程序 8.【GDIdemo5】透明贴图两套体系之:透明色彩法示例程序 ### 第6章 9.【GDIdemo6】游戏动画技巧之 定时器动画显示示例程序 10.【GDIdemo7】游戏动画技巧之 游戏循环动画显示示例程序 11.【GDIdemo8】游戏动画技巧之 透明动画示例程序 12.【GDIdemo9】游戏动画技巧之 排序贴图示例程序 ### 第7章 13.【GDIdemo10】Windows消息处理之键盘消息处理示例程序 14.【GDIdemo11】Windows消息处理之鼠标消息处理示例程序 ### 第8章 15.【GDIdemo12】愤怒的小鸟弹球之物理匀速运动模拟示例程序 16.【GDIdemo13】愤怒的小鸟弹球之重力环境模拟示例程序 17.【GDIdemo14】愤怒的小鸟弹球之摩擦力环境模拟示例程序 18.【GDIdemo15】粒子系统初步之雪花飞舞示例程序 19.【GDIdemo16】粒子系统初步之星光绽放示例程序 ### 第9章 20.【GDIdemo17】小型回合制游戏:《勇者斗恶龙》程序源码 ###第11章 21.【D3DdemoCore】Direct3D程序的核心框架 22.【D3Ddemo1】Direct3D初始化四步曲 示例程序 23.【D3Ddemo2】Direct3D渲染五步曲 示例程序 ### 第12章 24.【D3Ddemo3】Direct3D顶点缓存的逆袭 示例程序 25.【D3Ddemo4】Direct3D索引缓存的故事 示例程序 ###第13章 26.【D3Ddemo5】迈向三维世界:Direct3D四大变换 示例程序 ### 第14章 27.【D3Ddemo6】Direct3D中几种几何体的快捷绘制示例程序 28.【D3Ddemo7】绘制真实质感的三维世界:光照与材质示例程序 ### 第15章 29.【D3Ddemo8】游戏输入控制利器 : DirectInput 示例程序 30.【D3Ddemo9】对DirectInput的封装 示例程序 ### 第16章 31.【D3Ddemo10】为三维世界添彩:纹理映射示例程序之一 32.【D3Ddemo11】为三维世界添彩:纹理映射示例程序之二 ### 第17章 33.【D3Ddemo12】网格模型和X文件使用面面观 示例程序 ### 第18章 34.【D3Ddemo13】水乳交融的艺术:alpha混合技术 示例程序 ### 第19章 35.【D3Ddemo14】横看成岭侧成峰:深度测试和Z缓存 示例程序 ### 第20章 36.【D3Ddemo15】虚实结合的光影 : 模板技术 示例程序 ### 第21章 37.【D3Ddemo16】翱翔于三维空间:第一人称摄像机的实现示例程序 ### 第22章 38.【D3Ddemo17】钟灵毓秀的世界:三维地形系统的实现示例程序 ### 第23章 39.【D3Ddemo18】向碧蓝的苍穹致敬:三维天空的实现示例程序第24章: 40.【D3Ddemo19】让唯美的雪花飘扬:三维粒子系统的实现示例程序 ### 第25章 41.【D3Ddemo20】造物主的降临:多游戏模型的载入示例程序

# 一些链接 ### [本书的前身——在CSDN连载的【Visual C++】游戏开发专栏](http://blog.csdn.net/column/details/vc-game-programming.html "悬停显示") ### [本书的百度百科](http://baike.baidu.com/link?url=poL_81VLebCBK-7xuXqnPkeqLpgJvKNLYBHSpIoUQC837z7DG3ivMddMOKFmrZnb48woEYpFEj2XZwkMvM5m5q "悬停显示") ### [ 简介、勘误CSDN博文](http://blog.csdn.net/poem_qianmo/article/details/12895487 "悬停显示")

以上。