#include #pragma comment( lib, "winmm.lib" ) #include #include #pragma warning( disable : 4996 ) // 無駄な警告を出さなくする との事 #include #pragma warning( default : 4996 ) //----------------------------------------------------------------------------- // グローバル変数 //----------------------------------------------------------------------------- LPDIRECT3D9 g_pD3D = NULL; // D3Dのデバイス LPDIRECT3DDEVICE9 g_pd3dDevice = NULL; // レンダリングのデバイス #define D3DFVF_VERTEX (D3DFVF_XYZ | D3DFVF_DIFFUSE) typedef struct _D3DLVERTEX_ { float x,y,z; DWORD color; } D3DVERTEXCOR; D3DVERTEXCOR test[4] = { { -2, 0, 2, 0xff0000ff}, { -2, 5, 2, 0xffff0000}, { 2, 0, -2, 0xffffffff}, { 2, 5, -2, 0xff00ff00} }; D3DVERTEXCOR test2[4] = { { 2, 0, 2, 0xff00ff00}, { 2, 5, 2, 0xffffffff}, { -2, 0, -2, 0xffff0000}, { -2, 5, -2, 0xff0000ff} }; //----------------------------------------------------------------------------- // Direct3D の初期化 //----------------------------------------------------------------------------- HRESULT InitD3D( HWND hWnd ) { // D3Dのオブジェクトを作る if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) ) return E_FAIL; D3DPRESENT_PARAMETERS d3dpp; ZeroMemory( &d3dpp, sizeof(d3dpp) ); d3dpp.Windowed = TRUE; d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; d3dpp.BackBufferFormat = D3DFMT_UNKNOWN; d3dpp.EnableAutoDepthStencil = TRUE; d3dpp.AutoDepthStencilFormat = D3DFMT_D16; // D3Dのデバイスを作る if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &g_pd3dDevice ) ) ) { return E_FAIL; } // Zバッファ g_pd3dDevice->SetRenderState(D3DRS_ZENABLE,D3DZB_TRUE); //背面カリング無し g_pd3dDevice->SetRenderState( D3DRS_CULLMODE,D3DCULL_NONE); // アンビエントライティング g_pd3dDevice->SetRenderState( D3DRS_AMBIENT, 0xffffffff ); //ブレンド設定 g_pd3dDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA ); g_pd3dDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA ); g_pd3dDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE ); //ライティング無し g_pd3dDevice->SetRenderState(D3DRS_LIGHTING,FALSE); return S_OK; } void SetUp(void) { static float i = 0; D3DXMATRIX matView; D3DXMATRIX matProj; D3DXMATRIX matWorld; //回転方向を決める。XやZにも指定可能。 D3DXMatrixRotationY( &matWorld, i); if(i > 6.25) i = 0; g_pd3dDevice->SetTransform(D3DTS_WORLD,&matWorld); //カメラの座標、注視点方向、視線上方向ベクトル D3DXMatrixLookAtLH(&matView,&D3DXVECTOR3(0.0f, 9.0f, -13.0f), &D3DXVECTOR3(0.0f, 0.0f, 0.0f), &D3DXVECTOR3(0.0f, 1.0f, 0.0f)); g_pd3dDevice->SetTransform(D3DTS_VIEW,&matView); D3DXMatrixPerspectiveFovLH(&matProj,D3DX_PI/4,1.0f,1.0f,100.0f); g_pd3dDevice->SetTransform(D3DTS_PROJECTION,&matProj); } //----------------------------------------------------------------------------- // デリートする //----------------------------------------------------------------------------- VOID Cleanup() { if( g_pd3dDevice != NULL ) g_pd3dDevice->Release(); if( g_pD3D != NULL ) g_pD3D->Release(); } //----------------------------------------------------------------------------- // 描画する //----------------------------------------------------------------------------- VOID Render() { g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0,0,60), 1.0f, 0 ); if(g_pd3dDevice->BeginScene()){ //描画開始 SetUp(); g_pd3dDevice->SetFVF(D3DFVF_VERTEX); g_pd3dDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP,2,test,sizeof(D3DVERTEXCOR)); g_pd3dDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP,2,test2,sizeof(D3DVERTEXCOR)); g_pd3dDevice->EndScene(); //描画終了 } // 作成したシーンを表示 g_pd3dDevice->Present( NULL, NULL, NULL, NULL ); } //----------------------------------------------------------------------------- // プロシージャー //----------------------------------------------------------------------------- LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam ) { switch( msg ) { case WM_DESTROY: Cleanup(); PostQuitMessage( 0 ); return 0; case WM_KEYDOWN: switch(wParam) { case VK_ESCAPE: //エスケープで終了 //m_iloop = 0; PostQuitMessage(0); break; } } return DefWindowProc( hWnd, msg, wParam, lParam ); } //----------------------------------------------------------------------------- // WinMain関数 //----------------------------------------------------------------------------- INT WINAPI wWinMain( HINSTANCE hInst, HINSTANCE, LPWSTR, INT ) { //ウィンドウクラスを登録 WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L, GetModuleHandle(NULL), NULL, NULL, NULL, NULL, L"Game", NULL }; RegisterClassEx( &wc ); // ウィンドウ生成 (表示場所、大きさなどを指定) HWND hWnd = CreateWindow( L"Game", L"ゲームプログラミング", WS_OVERLAPPEDWINDOW^WS_MAXIMIZEBOX, 100, 100, 640 + 8, 480 + 34, NULL, NULL, wc.hInstance, NULL ); if( SUCCEEDED( InitD3D( hWnd ) ) )//マクロらしい。「InitD3Dが成功すれば、カッコ内を実行」、の意。 { ShowWindow( hWnd, SW_SHOWDEFAULT ); UpdateWindow( hWnd ); MSG msg; ZeroMemory( &msg, sizeof(msg) ); //メモリブロックを全て0にする関数 while( msg.message!=WM_QUIT ) { if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) ){ TranslateMessage( &msg ); DispatchMessage( &msg ); }else{ Render(); } } } UnregisterClass( L"Game", wc.hInstance ); return 0; }