ドキュメント(PDF形式)と本ページのプログラムリストを参照されたい。
ドキュメントはこちら
なお、ここでのプログラミングはチュートリアル3の続きとして作業する事。
#include "stdafx.h" #include <d3dx9.h> #include "D3DQuickLib.h" CD3DEnv *g_pD3DEnv = NULL; // D3DQuickLib が提供する描画環境。 CFloor *g_pFloor = NULL; float g_fTime = 0; // アニメーションで使用する LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam); //------------------------------------------------------------ // Name: FrameMove // Desc: アニメーションを行う。 // UpdateScene 関数 からコールバックされる。 //------------------------------------------------------------ void FrameMove(float timeElapsed) { g_fTime += timeElapsed; if (g_fTime > 600.0f) g_fTime -= 600.0f; } //------------------------------------------------------------ // Name: RenderScene // Desc: レンダリングを行う。 // UpdateScene 関数 からコールバックされる。 //------------------------------------------------------------ void RenderScene(LPDIRECT3DDEVICE9 lpd3ddev) { D3DXMATRIX matWorld; D3DXMatrixIdentity(&matWorld); lpd3ddev->SetTransform( D3DTS_WORLD, &matWorld ); lpd3ddev->SetRenderState(D3DRS_ALPHABLENDENABLE,FALSE); lpd3ddev->SetRenderState(D3DRS_LIGHTING, TRUE ); g_pFloor->Render(lpd3ddev); } int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { WNDCLASSEX wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = (WNDPROC)WndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInstance; wcex.hIcon = LoadIcon(NULL, MAKEINTRESOURCE(IDI_APPLICATION)); wcex.hCursor = LoadCursor(NULL, MAKEINTRESOURCE(IDC_ARROW)); wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wcex.lpszMenuName = NULL; wcex.lpszClassName = "Game"; wcex.hIconSm = LoadIcon(NULL, IDI_APPLICATION); RegisterClassEx(&wcex); HWND hWnd; hWnd = CreateWindowEx(WS_EX_OVERLAPPEDWINDOW,wcex.lpszClassName,"Game", WS_VISIBLE|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX|WS_MAXIMIZEBOX, CW_USEDEFAULT,0,640,480,NULL,NULL,hInstance,NULL); if( !hWnd ) return FALSE; RECT bounds,client; GetWindowRect(hWnd,&bounds); GetClientRect(hWnd,&client); MoveWindow(hWnd,bounds.left,bounds.top, 640 * 2 - client.right, 480 * 2 - client.bottom, false ); ShowWindow( hWnd, nCmdShow ); UpdateWindow( hWnd ); // D3DQuickLib の初期化 g_pD3DEnv = new CD3DEnv(); if (FAILED(g_pD3DEnv->InitD3D(hWnd))){ DestroyWindow(hWnd); }else{ g_pFloor = new CFloor(g_pD3DEnv,"ground\\ground.x"); g_pD3DEnv->ReloadGraphics(); } MSG msg; while(true){ if(PeekMessage(&msg, 0, 0, 0, PM_REMOVE)){ if(msg.message == WM_QUIT) break; TranslateMessage(&msg); DispatchMessage(&msg); }else{ g_pD3DEnv->UpdateScene(FrameMove,RenderScene); } } // D3DQuickLib の終了 SAFE_DELETE(g_pFloor); SAFE_DELETE(g_pD3DEnv); return (int)msg.wParam; } LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam) { switch (message){ case WM_SIZE: // ウインドウが最大化されたら、フルスクリーンモードにする。 if (SIZE_MAXIMIZED == wParam){ if (g_pD3DEnv->IsWindowed()) g_pD3DEnv->ToggleFullscreen(); } break; case WM_SETCURSOR: // フルスクリーン時はカーソルを表示させない。 if (g_pD3DEnv->IsWindowed()) ::SetCursor(::LoadCursor(NULL,IDC_ARROW)); else ::SetCursor(NULL); break; case WM_SYSCHAR: // Alt-Enter でフルスクリーンモードへ切り替える if (lParam&0x20000000){ if (wParam == '\x0d'){ g_pD3DEnv->ToggleFullscreen(); break; } } return DefWindowProc( hWnd, message, wParam, lParam ); case WM_SYSCOMMAND: if (!g_pD3DEnv->IsWindowed()){ // フルスクリーン時 if (wParam != SC_CLOSE) break; // Windowが閉じられる前にWindowモードに戻しておく。 g_pD3DEnv->ToggleFullscreen(); Sleep(100); } return DefWindowProc( hWnd, message, wParam, lParam ); case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; }
#include "stdafx.h" #include <d3dx9.h> #include "D3DQuickLib.h" CD3DEnv *g_pD3DEnv = NULL; // D3DQuickLib が提供する描画環境。 CFloor *g_pFloor = NULL; float g_fTime = 0; // アニメーションで使用する LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam); //------------------------------------------------------------ // Name: FrameMove // Desc: アニメーションを行う。 // UpdateScene 関数 からコールバックされる。 //------------------------------------------------------------ void FrameMove(float timeElapsed) { g_fTime += timeElapsed; if (g_fTime > 600.0f) g_fTime -= 600.0f; D3DXMATRIX *pView; pView = g_pD3DEnv->GetSystemView(); D3DXMatrixLookAtLH(pView,&D3DXVECTOR3(0,2.0f,-10.0f), // カメラの位置 &D3DXVECTOR3( 0.0f, 0.0f, 0.0f ), // カメラを向ける位置 &D3DXVECTOR3( 0.0f, 1.0f, 0.0f ) ); // カメラの上を示す } //------------------------------------------------------------ // Name: RenderScene // Desc: レンダリングを行う。 // UpdateScene 関数 からコールバックされる。 //------------------------------------------------------------ void RenderScene(LPDIRECT3DDEVICE9 lpd3ddev) { D3DXMATRIX matWorld; D3DXMatrixIdentity(&matWorld); lpd3ddev->SetTransform( D3DTS_WORLD, &matWorld ); lpd3ddev->SetRenderState(D3DRS_ALPHABLENDENABLE,FALSE); lpd3ddev->SetRenderState(D3DRS_LIGHTING, TRUE ); g_pFloor->Render(lpd3ddev); } int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { WNDCLASSEX wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = (WNDPROC)WndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInstance; wcex.hIcon = LoadIcon(NULL, MAKEINTRESOURCE(IDI_APPLICATION)); wcex.hCursor = LoadCursor(NULL, MAKEINTRESOURCE(IDC_ARROW)); wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wcex.lpszMenuName = NULL; wcex.lpszClassName = "Game"; wcex.hIconSm = LoadIcon(NULL, IDI_APPLICATION); RegisterClassEx(&wcex); HWND hWnd; hWnd = CreateWindowEx(WS_EX_OVERLAPPEDWINDOW,wcex.lpszClassName,"Game", WS_VISIBLE|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX|WS_MAXIMIZEBOX, CW_USEDEFAULT,0,640,480,NULL,NULL,hInstance,NULL); if( !hWnd ) return FALSE; RECT bounds,client; GetWindowRect(hWnd,&bounds); GetClientRect(hWnd,&client); MoveWindow(hWnd,bounds.left,bounds.top, 640 * 2 - client.right, 480 * 2 - client.bottom, false ); ShowWindow( hWnd, nCmdShow ); UpdateWindow( hWnd ); // D3DQuickLib の初期化 g_pD3DEnv = new CD3DEnv(); if (FAILED(g_pD3DEnv->InitD3D(hWnd))){ DestroyWindow(hWnd); }else{ g_pFloor = new CFloor(g_pD3DEnv,"ground\\ground.x"); g_pD3DEnv->ReloadGraphics(); } MSG msg; while(true){ if(PeekMessage(&msg, 0, 0, 0, PM_REMOVE)){ if(msg.message == WM_QUIT) break; TranslateMessage(&msg); DispatchMessage(&msg); }else{ g_pD3DEnv->UpdateScene(FrameMove,RenderScene); } } // D3DQuickLib の終了 SAFE_DELETE(g_pFloor); SAFE_DELETE(g_pD3DEnv); return (int)msg.wParam; } LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam) { switch (message){ case WM_SIZE: // ウインドウが最大化されたら、フルスクリーンモードにする。 if (SIZE_MAXIMIZED == wParam){ if (g_pD3DEnv->IsWindowed()) g_pD3DEnv->ToggleFullscreen(); } break; case WM_SETCURSOR: // フルスクリーン時はカーソルを表示させない。 if (g_pD3DEnv->IsWindowed()) ::SetCursor(::LoadCursor(NULL,IDC_ARROW)); else ::SetCursor(NULL); break; case WM_SYSCHAR: // Alt-Enter でフルスクリーンモードへ切り替える if (lParam&0x20000000){ if (wParam == '\x0d'){ g_pD3DEnv->ToggleFullscreen(); break; } } return DefWindowProc( hWnd, message, wParam, lParam ); case WM_SYSCOMMAND: if (!g_pD3DEnv->IsWindowed()){ // フルスクリーン時 if (wParam != SC_CLOSE) break; // Windowが閉じられる前にWindowモードに戻しておく。 g_pD3DEnv->ToggleFullscreen(); Sleep(100); } return DefWindowProc( hWnd, message, wParam, lParam ); case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; }
#include "stdafx.h" #include <d3dx9.h> #include "D3DQuickLib.h" CD3DEnv *g_pD3DEnv = NULL; // D3DQuickLib が提供する描画環境。 CFloor *g_pFloor = NULL; CEnhancedMesh *g_pMesh = NULL; float g_fTime = 0; // アニメーションで使用する LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam); //------------------------------------------------------------ // Name: FrameMove // Desc: アニメーションを行う。 // UpdateScene 関数 からコールバックされる。 //------------------------------------------------------------ void FrameMove(float timeElapsed) { g_fTime += timeElapsed; if (g_fTime > 600.0f) g_fTime -= 600.0f; D3DXMATRIX *pView; pView = g_pD3DEnv->GetSystemView(); D3DXMatrixLookAtLH(pView,&D3DXVECTOR3(0,2.0f,-10.0f), // カメラの位置 &D3DXVECTOR3( 0.0f, 0.0f, 0.0f ), // カメラを向ける位置 &D3DXVECTOR3( 0.0f, 1.0f, 0.0f ) ); // カメラの上を示す } //------------------------------------------------------------ // Name: RenderScene // Desc: レンダリングを行う。 // UpdateScene 関数 からコールバックされる。 //------------------------------------------------------------ void RenderScene(LPDIRECT3DDEVICE9 lpd3ddev) { D3DXMATRIX matWorld; D3DXMatrixIdentity(&matWorld); lpd3ddev->SetTransform( D3DTS_WORLD, &matWorld ); lpd3ddev->SetRenderState(D3DRS_ALPHABLENDENABLE,FALSE); lpd3ddev->SetRenderState(D3DRS_LIGHTING, TRUE ); g_pFloor->Render(lpd3ddev); g_pMesh->Render(lpd3ddev); } int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { WNDCLASSEX wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = (WNDPROC)WndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInstance; wcex.hIcon = LoadIcon(NULL, MAKEINTRESOURCE(IDI_APPLICATION)); wcex.hCursor = LoadCursor(NULL, MAKEINTRESOURCE(IDC_ARROW)); wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wcex.lpszMenuName = NULL; wcex.lpszClassName = "Game"; wcex.hIconSm = LoadIcon(NULL, IDI_APPLICATION); RegisterClassEx(&wcex); HWND hWnd; hWnd = CreateWindowEx(WS_EX_OVERLAPPEDWINDOW,wcex.lpszClassName,"Game", WS_VISIBLE|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX|WS_MAXIMIZEBOX, CW_USEDEFAULT,0,640,480,NULL,NULL,hInstance,NULL); if( !hWnd ) return FALSE; RECT bounds,client; GetWindowRect(hWnd,&bounds); GetClientRect(hWnd,&client); MoveWindow(hWnd,bounds.left,bounds.top, 640 * 2 - client.right, 480 * 2 - client.bottom, false ); ShowWindow( hWnd, nCmdShow ); UpdateWindow( hWnd ); // D3DQuickLib の初期化 g_pD3DEnv = new CD3DEnv(); if (FAILED(g_pD3DEnv->InitD3D(hWnd))){ DestroyWindow(hWnd); }else{ g_pFloor = new CFloor(g_pD3DEnv,"ground\\ground.x"); g_pMesh = new CEnhancedMesh(g_pD3DEnv,"ground\\dog.x"); g_pMesh->SetNumSegs(0); // ポリゴン分割を行わない。 g_pD3DEnv->ReloadGraphics(); } MSG msg; while(true){ if(PeekMessage(&msg, 0, 0, 0, PM_REMOVE)){ if(msg.message == WM_QUIT) break; TranslateMessage(&msg); DispatchMessage(&msg); }else{ g_pD3DEnv->UpdateScene(FrameMove,RenderScene); } } // D3DQuickLib の終了 SAFE_DELETE(g_pMesh); SAFE_DELETE(g_pFloor); SAFE_DELETE(g_pD3DEnv); return (int)msg.wParam; } LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam) { switch (message){ case WM_SIZE: // ウインドウが最大化されたら、フルスクリーンモードにする。 if (SIZE_MAXIMIZED == wParam){ if (g_pD3DEnv->IsWindowed()) g_pD3DEnv->ToggleFullscreen(); } break; case WM_SETCURSOR: // フルスクリーン時はカーソルを表示させない。 if (g_pD3DEnv->IsWindowed()) ::SetCursor(::LoadCursor(NULL,IDC_ARROW)); else ::SetCursor(NULL); break; case WM_SYSCHAR: // Alt-Enter でフルスクリーンモードへ切り替える if (lParam&0x20000000){ if (wParam == '\x0d'){ g_pD3DEnv->ToggleFullscreen(); break; } } return DefWindowProc( hWnd, message, wParam, lParam ); case WM_SYSCOMMAND: if (!g_pD3DEnv->IsWindowed()){ // フルスクリーン時 if (wParam != SC_CLOSE) break; // Windowが閉じられる前にWindowモードに戻しておく。 g_pD3DEnv->ToggleFullscreen(); Sleep(100); } return DefWindowProc( hWnd, message, wParam, lParam ); case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; }
#include "stdafx.h" #include <d3dx9.h> #include "D3DQuickLib.h" CD3DEnv *g_pD3DEnv = NULL; // D3DQuickLib が提供する描画環境。 CFloor *g_pFloor = NULL; CEnhancedMesh *g_pMesh = NULL; // D3DQuickLib によるモデリングクラス。 float g_fTime = 0; // アニメーションで使用する D3DXVECTOR3 g_vPos = D3DXVECTOR3(0,0,0); LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam); //------------------------------------------------------------ // Name: FrameMove // Desc: アニメーションを行う。 // UpdateScene 関数 からコールバックされる。 //------------------------------------------------------------ void FrameMove(float timeElapsed) { g_fTime += timeElapsed; if (g_fTime > 600.0f) g_fTime -= 600.0f; D3DXMATRIX *pView; pView = g_pD3DEnv->GetSystemView(); if (g_pD3DEnv->GetDI8KeyState(DIK_LEFT)){ g_vPos.x -= 0.1f * timeElapsed; } if (g_pD3DEnv->GetDI8KeyState(DIK_RIGHT)){ g_vPos.x += 0.1f * timeElapsed; } if (g_pD3DEnv->GetDI8KeyState(DIK_UP)){ g_vPos.z += 0.1f * timeElapsed; } if (g_pD3DEnv->GetDI8KeyState(DIK_DOWN)){ g_vPos.z -= 0.1f * timeElapsed; } D3DXMatrixLookAtLH(pView,&D3DXVECTOR3(0,2.0f,-10.0f), // カメラの位置 &D3DXVECTOR3( 0.0f, 0.0f, 0.0f ), // カメラを向ける位置 &D3DXVECTOR3( 0.0f, 1.0f, 0.0f ) ); // カメラの上を示す } //------------------------------------------------------------ // Name: RenderScene // Desc: レンダリングを行う。 // UpdateScene 関数 からコールバックされる。 //------------------------------------------------------------ void RenderScene(LPDIRECT3DDEVICE9 lpd3ddev) { D3DXMATRIX matWorld; D3DXMatrixIdentity(&matWorld); lpd3ddev->SetTransform( D3DTS_WORLD, &matWorld ); lpd3ddev->SetRenderState(D3DRS_ALPHABLENDENABLE,FALSE); lpd3ddev->SetRenderState(D3DRS_LIGHTING, TRUE ); g_pFloor->Render(lpd3ddev); D3DXMatrixTranslation(&matWorld,g_vPos.x,g_vPos.y,g_vPos.z); lpd3ddev->SetTransform( D3DTS_WORLD, &matWorld); g_pMesh->Render(lpd3ddev); } int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { WNDCLASSEX wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = (WNDPROC)WndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInstance; wcex.hIcon = LoadIcon(NULL, MAKEINTRESOURCE(IDI_APPLICATION)); wcex.hCursor = LoadCursor(NULL, MAKEINTRESOURCE(IDC_ARROW)); wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wcex.lpszMenuName = NULL; wcex.lpszClassName = "Game"; wcex.hIconSm = LoadIcon(NULL, IDI_APPLICATION); RegisterClassEx(&wcex); HWND hWnd; hWnd = CreateWindowEx(WS_EX_OVERLAPPEDWINDOW,wcex.lpszClassName,"Game", WS_VISIBLE|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX|WS_MAXIMIZEBOX, CW_USEDEFAULT,0,640,480,NULL,NULL,hInstance,NULL); if( !hWnd ) return FALSE; RECT bounds,client; GetWindowRect(hWnd,&bounds); GetClientRect(hWnd,&client); MoveWindow(hWnd,bounds.left,bounds.top, 640 * 2 - client.right, 480 * 2 - client.bottom, false ); ShowWindow( hWnd, nCmdShow ); UpdateWindow( hWnd ); // D3DQuickLib の初期化 g_pD3DEnv = new CD3DEnv(); if (FAILED(g_pD3DEnv->InitD3D(hWnd))){ DestroyWindow(hWnd); }else{ g_pFloor = new CFloor(g_pD3DEnv,"ground\\ground.x"); g_pMesh = new CEnhancedMesh(g_pD3DEnv,"ground\\dog.x"); g_pMesh->SetNumSegs(0); // ポリゴン分割を行わない。 g_pD3DEnv->ReloadGraphics(); } MSG msg; while(true){ if(PeekMessage(&msg, 0, 0, 0, PM_REMOVE)){ if(msg.message == WM_QUIT) break; TranslateMessage(&msg); DispatchMessage(&msg); }else{ g_pD3DEnv->UpdateScene(FrameMove,RenderScene); } } // D3DQuickLib の終了 SAFE_DELETE(g_pMesh); SAFE_DELETE(g_pFloor); SAFE_DELETE(g_pD3DEnv); return (int)msg.wParam; } LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam) { switch (message){ case WM_SIZE: // ウインドウが最大化されたら、フルスクリーンモードにする。 if (SIZE_MAXIMIZED == wParam){ if (g_pD3DEnv->IsWindowed()) g_pD3DEnv->ToggleFullscreen(); } break; case WM_SETCURSOR: // フルスクリーン時はカーソルを表示させない。 if (g_pD3DEnv->IsWindowed()) ::SetCursor(::LoadCursor(NULL,IDC_ARROW)); else ::SetCursor(NULL); break; case WM_SYSCHAR: // Alt-Enter でフルスクリーンモードへ切り替える if (lParam&0x20000000){ if (wParam == '\x0d'){ g_pD3DEnv->ToggleFullscreen(); break; } } return DefWindowProc( hWnd, message, wParam, lParam ); case WM_SYSCOMMAND: if (!g_pD3DEnv->IsWindowed()){ // フルスクリーン時 if (wParam != SC_CLOSE) break; // Windowが閉じられる前にWindowモードに戻しておく。 g_pD3DEnv->ToggleFullscreen(); Sleep(100); } return DefWindowProc( hWnd, message, wParam, lParam ); case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; }
#include "stdafx.h" #include <d3dx9.h> #include "D3DQuickLib.h" CD3DEnv *g_pD3DEnv = NULL; // D3DQuickLib が提供する描画環境。 CFloor *g_pFloor = NULL; CEnhancedMesh *g_pMesh = NULL; // D3DQuickLib によるモデリングクラス。 float g_fTime = 0; // アニメーションで使用する D3DXVECTOR3 g_vPos = D3DXVECTOR3(0,0,0); LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam); //------------------------------------------------------------ // Name: FrameMove // Desc: アニメーションを行う。 // UpdateScene 関数 からコールバックされる。 //------------------------------------------------------------ void FrameMove(float timeElapsed) { g_fTime += timeElapsed; if (g_fTime > 600.0f) g_fTime -= 600.0f; D3DXMATRIX *pView; pView = g_pD3DEnv->GetSystemView(); if (g_pD3DEnv->GetDI8KeyState(DIK_LEFT)){ g_vPos.x -= 0.1f * timeElapsed; } if (g_pD3DEnv->GetDI8KeyState(DIK_RIGHT)){ g_vPos.x += 0.1f * timeElapsed; } if (g_pD3DEnv->GetDI8KeyState(DIK_UP)){ g_vPos.z += 0.1f * timeElapsed; } if (g_pD3DEnv->GetDI8KeyState(DIK_DOWN)){ g_vPos.z -= 0.1f * timeElapsed; } D3DXMatrixLookAtLH(pView,&D3DXVECTOR3(g_vPos.x,g_vPos.y+2.0f,g_vPos.z-10.0f), // カメラの位置 &D3DXVECTOR3( g_vPos.x, g_vPos.y, g_vPos.z ), // カメラを向ける位置 &D3DXVECTOR3( 0.0f, 1.0f, 0.0f ) ); // カメラの上を示す } //------------------------------------------------------------ // Name: RenderScene // Desc: レンダリングを行う。 // UpdateScene 関数 からコールバックされる。 //------------------------------------------------------------ void RenderScene(LPDIRECT3DDEVICE9 lpd3ddev) { D3DXMATRIX matWorld; D3DXMatrixIdentity(&matWorld); lpd3ddev->SetTransform( D3DTS_WORLD, &matWorld ); lpd3ddev->SetRenderState(D3DRS_ALPHABLENDENABLE,FALSE); lpd3ddev->SetRenderState(D3DRS_LIGHTING, TRUE ); g_pFloor->Render(lpd3ddev); D3DXMatrixTranslation(&matWorld,g_vPos.x,g_vPos.y,g_vPos.z); lpd3ddev->SetTransform( D3DTS_WORLD, &matWorld); g_pMesh->Render(lpd3ddev); } int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { WNDCLASSEX wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = (WNDPROC)WndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInstance; wcex.hIcon = LoadIcon(NULL, MAKEINTRESOURCE(IDI_APPLICATION)); wcex.hCursor = LoadCursor(NULL, MAKEINTRESOURCE(IDC_ARROW)); wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wcex.lpszMenuName = NULL; wcex.lpszClassName = "Game"; wcex.hIconSm = LoadIcon(NULL, IDI_APPLICATION); RegisterClassEx(&wcex); HWND hWnd; hWnd = CreateWindowEx(WS_EX_OVERLAPPEDWINDOW,wcex.lpszClassName,"Game", WS_VISIBLE|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX|WS_MAXIMIZEBOX, CW_USEDEFAULT,0,640,480,NULL,NULL,hInstance,NULL); if( !hWnd ) return FALSE; RECT bounds,client; GetWindowRect(hWnd,&bounds); GetClientRect(hWnd,&client); MoveWindow(hWnd,bounds.left,bounds.top, 640 * 2 - client.right, 480 * 2 - client.bottom, false ); ShowWindow( hWnd, nCmdShow ); UpdateWindow( hWnd ); // D3DQuickLib の初期化 g_pD3DEnv = new CD3DEnv(); if (FAILED(g_pD3DEnv->InitD3D(hWnd))){ DestroyWindow(hWnd); }else{ g_pFloor = new CFloor(g_pD3DEnv,"ground\\ground.x"); g_pMesh = new CEnhancedMesh(g_pD3DEnv,"ground\\dog.x"); g_pMesh->SetNumSegs(0); // ポリゴン分割を行わない。 g_pD3DEnv->ReloadGraphics(); } MSG msg; while(true){ if(PeekMessage(&msg, 0, 0, 0, PM_REMOVE)){ if(msg.message == WM_QUIT) break; TranslateMessage(&msg); DispatchMessage(&msg); }else{ g_pD3DEnv->UpdateScene(FrameMove,RenderScene); } } // D3DQuickLib の終了 SAFE_DELETE(g_pMesh); SAFE_DELETE(g_pFloor); SAFE_DELETE(g_pD3DEnv); return (int)msg.wParam; } LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam) { switch (message){ case WM_SIZE: // ウインドウが最大化されたら、フルスクリーンモードにする。 if (SIZE_MAXIMIZED == wParam){ if (g_pD3DEnv->IsWindowed()) g_pD3DEnv->ToggleFullscreen(); } break; case WM_SETCURSOR: // フルスクリーン時はカーソルを表示させない。 if (g_pD3DEnv->IsWindowed()) ::SetCursor(::LoadCursor(NULL,IDC_ARROW)); else ::SetCursor(NULL); break; case WM_SYSCHAR: // Alt-Enter でフルスクリーンモードへ切り替える if (lParam&0x20000000){ if (wParam == '\x0d'){ g_pD3DEnv->ToggleFullscreen(); break; } } return DefWindowProc( hWnd, message, wParam, lParam ); case WM_SYSCOMMAND: if (!g_pD3DEnv->IsWindowed()){ // フルスクリーン時 if (wParam != SC_CLOSE) break; // Windowが閉じられる前にWindowモードに戻しておく。 g_pD3DEnv->ToggleFullscreen(); Sleep(100); } return DefWindowProc( hWnd, message, wParam, lParam ); case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; }
#include "stdafx.h" #include <d3dx9.h> #include "D3DQuickLib.h" CD3DEnv *g_pD3DEnv = NULL; // D3DQuickLib が提供する描画環境。 CFloor *g_pFloor = NULL; CEnhancedMesh *g_pMesh = NULL; // D3DQuickLib によるモデリングクラス。 float g_fTime = 0; // アニメーションで使用する D3DXVECTOR3 g_vPos = D3DXVECTOR3(0,0,0); LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam); //------------------------------------------------------------ // Name: FrameMove // Desc: アニメーションを行う。 // UpdateScene 関数 からコールバックされる。 //------------------------------------------------------------ void FrameMove(float timeElapsed) { g_fTime += timeElapsed; if (g_fTime > 600.0f) g_fTime -= 600.0f; D3DXMATRIX *pView; pView = g_pD3DEnv->GetSystemView(); if (g_pD3DEnv->GetDI8KeyState(DIK_LEFT)){ g_vPos.x -= 0.1f * timeElapsed; } if (g_pD3DEnv->GetDI8KeyState(DIK_RIGHT)){ g_vPos.x += 0.1f * timeElapsed; } if (g_pD3DEnv->GetDI8KeyState(DIK_UP)){ g_vPos.z += 0.1f * timeElapsed; } if (g_pD3DEnv->GetDI8KeyState(DIK_DOWN)){ g_vPos.z -= 0.1f * timeElapsed; } D3DXVECTOR3 vecMin, vecMax, vecNormal; FLOAT fAlt,fDist; g_pFloor->GetBoundingBox(&vecMin, &vecMax); // かならず当たり判定を行う。 g_pFloor->ProbeTheGroundAltitude(&g_vPos,&vecMin,&vecMax,&vecNormal,&fAlt,&fDist); g_vPos.y = fAlt; D3DXMatrixLookAtLH(pView,&D3DXVECTOR3(g_vPos.x,g_vPos.y+2.0f,g_vPos.z-10.0f), // カメラの位置 &D3DXVECTOR3( g_vPos.x, g_vPos.y, g_vPos.z ), // カメラを向ける位置 &D3DXVECTOR3( 0.0f, 1.0f, 0.0f ) ); // カメラの上を示す } //------------------------------------------------------------ // Name: RenderScene // Desc: レンダリングを行う。 // UpdateScene 関数 からコールバックされる。 //------------------------------------------------------------ void RenderScene(LPDIRECT3DDEVICE9 lpd3ddev) { D3DXMATRIX matWorld; D3DXMatrixIdentity(&matWorld); lpd3ddev->SetTransform( D3DTS_WORLD, &matWorld ); lpd3ddev->SetRenderState(D3DRS_ALPHABLENDENABLE,FALSE); lpd3ddev->SetRenderState(D3DRS_LIGHTING, TRUE ); g_pFloor->Render(lpd3ddev); D3DXMatrixTranslation(&matWorld,g_vPos.x,g_vPos.y,g_vPos.z); lpd3ddev->SetTransform( D3DTS_WORLD, &matWorld); g_pMesh->Render(lpd3ddev); } int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { WNDCLASSEX wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = (WNDPROC)WndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInstance; wcex.hIcon = LoadIcon(NULL, MAKEINTRESOURCE(IDI_APPLICATION)); wcex.hCursor = LoadCursor(NULL, MAKEINTRESOURCE(IDC_ARROW)); wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wcex.lpszMenuName = NULL; wcex.lpszClassName = "Game"; wcex.hIconSm = LoadIcon(NULL, IDI_APPLICATION); RegisterClassEx(&wcex); HWND hWnd; hWnd = CreateWindowEx(WS_EX_OVERLAPPEDWINDOW,wcex.lpszClassName,"Game", WS_VISIBLE|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX|WS_MAXIMIZEBOX, CW_USEDEFAULT,0,640,480,NULL,NULL,hInstance,NULL); if( !hWnd ) return FALSE; RECT bounds,client; GetWindowRect(hWnd,&bounds); GetClientRect(hWnd,&client); MoveWindow(hWnd,bounds.left,bounds.top, 640 * 2 - client.right, 480 * 2 - client.bottom, false ); ShowWindow( hWnd, nCmdShow ); UpdateWindow( hWnd ); // D3DQuickLib の初期化 g_pD3DEnv = new CD3DEnv(); if (FAILED(g_pD3DEnv->InitD3D(hWnd))){ DestroyWindow(hWnd); }else{ g_pFloor = new CFloor(g_pD3DEnv,"ground\\ground.x"); g_pMesh = new CEnhancedMesh(g_pD3DEnv,"ground\\dog.x"); g_pMesh->SetNumSegs(0); // ポリゴン分割を行わない。 g_pD3DEnv->ReloadGraphics(); } MSG msg; while(true){ if(PeekMessage(&msg, 0, 0, 0, PM_REMOVE)){ if(msg.message == WM_QUIT) break; TranslateMessage(&msg); DispatchMessage(&msg); }else{ g_pD3DEnv->UpdateScene(FrameMove,RenderScene); } } // D3DQuickLib の終了 SAFE_DELETE(g_pMesh); SAFE_DELETE(g_pFloor); SAFE_DELETE(g_pD3DEnv); return (int)msg.wParam; } LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam) { switch (message){ case WM_SIZE: // ウインドウが最大化されたら、フルスクリーンモードにする。 if (SIZE_MAXIMIZED == wParam){ if (g_pD3DEnv->IsWindowed()) g_pD3DEnv->ToggleFullscreen(); } break; case WM_SETCURSOR: // フルスクリーン時はカーソルを表示させない。 if (g_pD3DEnv->IsWindowed()) ::SetCursor(::LoadCursor(NULL,IDC_ARROW)); else ::SetCursor(NULL); break; case WM_SYSCHAR: // Alt-Enter でフルスクリーンモードへ切り替える if (lParam&0x20000000){ if (wParam == '\x0d'){ g_pD3DEnv->ToggleFullscreen(); break; } } return DefWindowProc( hWnd, message, wParam, lParam ); case WM_SYSCOMMAND: if (!g_pD3DEnv->IsWindowed()){ // フルスクリーン時 if (wParam != SC_CLOSE) break; // Windowが閉じられる前にWindowモードに戻しておく。 g_pD3DEnv->ToggleFullscreen(); Sleep(100); } return DefWindowProc( hWnd, message, wParam, lParam ); case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; }
#include "stdafx.h" #include <d3dx9.h> #include "D3DQuickLib.h" CD3DEnv *g_pD3DEnv = NULL; // D3DQuickLib が提供する描画環境。 CFloor *g_pFloor = NULL; CEnhancedMesh *g_pMesh = NULL; // D3DQuickLib によるモデリングクラス。 float g_fTime = 0; // アニメーションで使用する D3DXVECTOR3 g_vPos = D3DXVECTOR3(0,0,0); FLOAT g_fAngle = 0.0f; LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam); //------------------------------------------------------------ // Name: FrameMove // Desc: アニメーションを行う。 // UpdateScene 関数 からコールバックされる。 //------------------------------------------------------------ void FrameMove(float timeElapsed) { g_fTime += timeElapsed; if (g_fTime > 600.0f) g_fTime -= 600.0f; D3DXMATRIX *pView; pView = g_pD3DEnv->GetSystemView(); if (g_pD3DEnv->GetDI8KeyState(DIK_LEFT)){ g_vPos.x -= 0.1f * timeElapsed; g_fAngle = -D3DX_PI * 0.5f; } if (g_pD3DEnv->GetDI8KeyState(DIK_RIGHT)){ g_vPos.x += 0.1f * timeElapsed; g_fAngle = D3DX_PI * 0.5f; } if (g_pD3DEnv->GetDI8KeyState(DIK_UP)){ g_vPos.z += 0.1f * timeElapsed; g_fAngle = 0.0f; } if (g_pD3DEnv->GetDI8KeyState(DIK_DOWN)){ g_vPos.z -= 0.1f * timeElapsed; g_fAngle = D3DX_PI; } D3DXVECTOR3 vecMin, vecMax, vecNormal; FLOAT fAlt,fDist; g_pFloor->GetBoundingBox(&vecMin, &vecMax); // かならず当たり判定を行う。 g_pFloor->ProbeTheGroundAltitude(&g_vPos,&vecMin,&vecMax,&vecNormal,&fAlt,&fDist); g_vPos.y = fAlt; D3DXMatrixLookAtLH(pView,&D3DXVECTOR3(g_vPos.x,g_vPos.y+2.0f,g_vPos.z-10.0f), // カメラの位置 &D3DXVECTOR3( g_vPos.x, g_vPos.y, g_vPos.z ), // カメラを向ける位置 &D3DXVECTOR3( 0.0f, 1.0f, 0.0f ) ); // カメラの上を示す } //------------------------------------------------------------ // Name: RenderScene // Desc: レンダリングを行う。 // UpdateScene 関数 からコールバックされる。 //------------------------------------------------------------ void RenderScene(LPDIRECT3DDEVICE9 lpd3ddev) { D3DXMATRIX matWorld; D3DXMatrixIdentity(&matWorld); lpd3ddev->SetTransform( D3DTS_WORLD, &matWorld ); lpd3ddev->SetRenderState(D3DRS_ALPHABLENDENABLE,FALSE); lpd3ddev->SetRenderState(D3DRS_LIGHTING, TRUE ); g_pFloor->Render(lpd3ddev); D3DXMatrixTranslation(&matWorld,g_vPos.x,g_vPos.y,g_vPos.z); D3DXMATRIX matRotation; D3DXMatrixRotationY(&matRotation,g_fAngle); matWorld = matRotation * matWorld; lpd3ddev->SetTransform( D3DTS_WORLD, &matWorld); g_pMesh->Render(lpd3ddev); } int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { WNDCLASSEX wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = (WNDPROC)WndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInstance; wcex.hIcon = LoadIcon(NULL, MAKEINTRESOURCE(IDI_APPLICATION)); wcex.hCursor = LoadCursor(NULL, MAKEINTRESOURCE(IDC_ARROW)); wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wcex.lpszMenuName = NULL; wcex.lpszClassName = "Game"; wcex.hIconSm = LoadIcon(NULL, IDI_APPLICATION); RegisterClassEx(&wcex); HWND hWnd; hWnd = CreateWindowEx(WS_EX_OVERLAPPEDWINDOW,wcex.lpszClassName,"Game", WS_VISIBLE|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX|WS_MAXIMIZEBOX, CW_USEDEFAULT,0,640,480,NULL,NULL,hInstance,NULL); if( !hWnd ) return FALSE; RECT bounds,client; GetWindowRect(hWnd,&bounds); GetClientRect(hWnd,&client); MoveWindow(hWnd,bounds.left,bounds.top, 640 * 2 - client.right, 480 * 2 - client.bottom, false ); ShowWindow( hWnd, nCmdShow ); UpdateWindow( hWnd ); // D3DQuickLib の初期化 g_pD3DEnv = new CD3DEnv(); if (FAILED(g_pD3DEnv->InitD3D(hWnd))){ DestroyWindow(hWnd); }else{ g_pFloor = new CFloor(g_pD3DEnv,"ground\\ground.x"); g_pMesh = new CEnhancedMesh(g_pD3DEnv,"ground\\dog.x"); g_pMesh->SetNumSegs(0); // ポリゴン分割を行わない。 g_pD3DEnv->ReloadGraphics(); } MSG msg; while(true){ if(PeekMessage(&msg, 0, 0, 0, PM_REMOVE)){ if(msg.message == WM_QUIT) break; TranslateMessage(&msg); DispatchMessage(&msg); }else{ g_pD3DEnv->UpdateScene(FrameMove,RenderScene); } } // D3DQuickLib の終了 SAFE_DELETE(g_pMesh); SAFE_DELETE(g_pFloor); SAFE_DELETE(g_pD3DEnv); return (int)msg.wParam; } LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam) { switch (message){ case WM_SIZE: // ウインドウが最大化されたら、フルスクリーンモードにする。 if (SIZE_MAXIMIZED == wParam){ if (g_pD3DEnv->IsWindowed()) g_pD3DEnv->ToggleFullscreen(); } break; case WM_SETCURSOR: // フルスクリーン時はカーソルを表示させない。 if (g_pD3DEnv->IsWindowed()) ::SetCursor(::LoadCursor(NULL,IDC_ARROW)); else ::SetCursor(NULL); break; case WM_SYSCHAR: // Alt-Enter でフルスクリーンモードへ切り替える if (lParam&0x20000000){ if (wParam == '\x0d'){ g_pD3DEnv->ToggleFullscreen(); break; } } return DefWindowProc( hWnd, message, wParam, lParam ); case WM_SYSCOMMAND: if (!g_pD3DEnv->IsWindowed()){ // フルスクリーン時 if (wParam != SC_CLOSE) break; // Windowが閉じられる前にWindowモードに戻しておく。 g_pD3DEnv->ToggleFullscreen(); Sleep(100); } return DefWindowProc( hWnd, message, wParam, lParam ); case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; }