ホーム < ゲームつくろー! < Programming TIPs編 < ここまでできる超極短DirectX基盤プログラム

ここまでできる超極短DirectX基盤プログラム



 DirectXに手を出し始めた頃、まずDirectXを体験できる状態までプログラムを作るのに一苦労しました。C言語やりたての時には1行でHello Worldを出せたんですが、DirectXはまずウィンドウプログラムを自作できないとだめでして、Hello Worldを出すというのは結構レベルの高い作業だったりしました。そこまで気楽にとはいかないまでも、とにかくDirectXにすぐに触れられる環境があると何かとありがたいものです。テストプログラムを作って効果をテストするのにも役に立ちます。そこで、手っ取り早くDirectXをテストできるように、メイン関数だけですべてを終えられる極短のDirectX基盤プログラムを作成してみました。



@ ソース公開

 以下が今回じっくり考えて作成したDirectX用の極短基盤プログラムです。このプログラムは「ここまでできる極短Windowsプログラム」をベースとしています。

// 極短DirectX基盤プログラム

#include <windows.h>
#include <tchar.h>
#include <d3d9.h>

TCHAR gName[100] = _T("DirectX Ultra Short Basical Program");

LRESULT CALLBACK WndProc(HWND hWnd, UINT mes, WPARAM wParam, LPARAM lParam){
   
if(mes == WM_DESTROY) {PostQuitMessage(0); return 0;}
   
return DefWindowProc(hWnd, mes, wParam, lParam);
}

int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
   MSG msg; HWND hWnd;
   WNDCLASSEX wcex ={
sizeof(WNDCLASSEX), CS_HREDRAW | CS_VREDRAW, WndProc, 0, 0, hInstance, NULL, NULL,
                                  (HBRUSH)(COLOR_WINDOW+1), NULL, (TCHAR*)gName, NULL};
   
if(!RegisterClassEx(&wcex)) return 0;

   
if(!(hWnd = CreateWindow(gName, gName, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0,
         NULL, NULL, hInstance, NULL)))
     
return 0;

   // Direct3Dの初期化
   LPDIRECT3D9 g_pD3D;
   LPDIRECT3DDEVICE9 g_pD3DDev;
   if( !(g_pD3D = Direct3DCreate9( D3D_SDK_VERSION )) )
return 0;

   D3DPRESENT_PARAMETERS d3dpp = {0,0,D3DFMT_UNKNOWN,0,D3DMULTISAMPLE_NONE,0,
                                                   D3DSWAPEFFECT_DISCARD,NULL,TRUE,0,D3DFMT_UNKNOWN,0,0};

   if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
                                                   D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &g_pD3DDev ) ) )
      {g_pD3D->Release();
return 0;}


   ShowWindow(hWnd, nCmdShow);

   // メッセージ ループ
   
do{
      Sleep(1);
      
if( PeekMessage(&msg, NULL, 0, 0, PM_REMOVE) ){ DispatchMessage(&msg);}
      
else{
               // Direct3Dの処理
               g_pD3DDev->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,255), 1.0f, 0 );
               g_pD3DDev->BeginScene();
                  // 描画
               g_pD3DDev->EndScene();
               g_pD3DDev->Present( NULL, NULL, NULL, NULL );
            
}
   
}while(msg.message != WM_QUIT);

   g_pD3DDev->Release();
   g_pD3D->Release();

   
return 0;
}


 ベースとした「ここまでできる極短Windowsプログラム」に追加したDirect3D関連部分を太文字で示してあります。プログラムはコメント空白を含めて57行。さすがにDirect3Dの初期化と描画部分が入るので多少長くなってしまいますが、それでも一目で眺められるレベルです。メッセージループに入った段階でIDirect3DDevice9コンポーネントが取得できていますので、それを使って「//描画」とコメントされた部分に何か書けば、ブルーバックのウィンドウ上に3Dオブジェクトが表示されます。ウィンドウを閉じれば、後にお片づけをして終了となります。

 重要なのは、この極短のプログラムを空のプロジェクトにコピペするとDirect3Dがすぐに動くということです(動作確認済み:プロジェクトに「dxguid.lib」と「d3d9.lib」へリンクが必要)。このプログラムを使えば、ちょっと思いついたプログラムのテストが簡単に行えます。○×つくろ〜では、今後このプログラムを基盤としてDirectXのチュートリアルプログラムを掲載していく予定でおります。つまり、完全に動いて余分な所が極力少ない一番わかりやすいチュートリアルの提供です。「コピペして学ぶDirectX」。結構良いかもしれません(^-^)s

 もし空プロジェクトにコピペしてデバッグができない場合はこちらをご覧ください。