ゲームプログラムのメモ書き

DirectX

ウインドウを作る

DirectXになっても基本のウインドウはほとんど変わりません。 Direct3Dを使用するための初期化が必要になるだけです。

#include <windows.h>
#include <d3dx9.h>

//---------------------------------------------------------------------------//
//プロトタイプ宣言
//---------------------------------------------------------------------------//
HRESULT InitD3d(HWND hWnd);
VOID Render(HWND hWnd);
VOID FreeDx();

//---------------------------------------------------------------------------//
//オブジェクトの開放マクロ
//---------------------------------------------------------------------------//
#define SAFE_RELEASE(p) if(p){(p)->Release(); (p) = NULL;}



//---------------------------------------------------------------------------//
//オブジェクト宣言
//---------------------------------------------------------------------------//
LPDIRECT3D9 pD3d;   //Direct3Dオブジェクト
LPDIRECT3DDEVICE9 pDevice;  //Direct3Dデバイスオブジェクト


//---------------------------------------------------------------------------//
//DirectX初期化処理
//---------------------------------------------------------------------------//
HRESULT InitD3d(HWND hWnd)
{
    //Direct3Dオブジェクトの作成
    //D3D_SDK_VERSION : そのマシンに設定されたDirectXのヴァージョンを取得する
    if(NULL == (pD3d = Direct3DCreate9(D3D_SDK_VERSION)))
    {
        MessageBox(hWnd, "Direct3Dの作成に失敗しました",
            "Error", MB_OK);

        return E_FAIL;
    }

    //Direct3Dデバイスオブジェクトの設定
    D3DPRESENT_PARAMETERS d3dpp;    //描画情報構造体
    ZeroMemory(&d3dpp, sizeof(d3dpp));

    //バックバッファフォーマット
    d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;    //デフォルト
    d3dpp.BackBufferCount = 1;                  //バックバッファの数
    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;   //スワップの設定
    d3dpp.Windowed = TRUE;                      //ウインドウモードの設定

    //デバイスの作成
    //HAL(頂点処理:ハードウェア)
    if(FAILED(hr = m_pD3d->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
        D3DCREATE_HARDWARE_VERTEXPROCESSING, &d3dpp, &m_pDevice)))
    {
        //HAL(頂点処理:ソフトウェア)
        if(FAILED(hr = m_pD3d->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
            D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &m_pDevice)))
        {
            MessageBox(hWnd, "HALモードでDirect3Dデバイスの作成に失敗:REFモードで実行します",
                "Error", MB_OK);

            //REF(頂点処理:ハードウェア)
            if(FAILED(hr = m_pD3d->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_REF, hWnd,
                D3DCREATE_HARDWARE_VERTEXPROCESSING, &d3dpp, &m_pDevice)))
            {
                //REF(頂点処理:ソフトウェア)
                if(FAILED(hr = m_pD3d->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_REF, hWnd,
                    D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &m_pDevice)))
                {
                    MessageBox(hWnd, "REFモードでDirect3Dデバイスの作成に失敗",
                        "Error", MB_OK);
                    return hr;
                }
            }
        }
    }

    //ライトをオフにする
    pDevice->SetRenderState(D3DRS_LIGHTING, FALSE);

    return hr;
}
				

初期化関数が出来ました。後はmain関数内に放り込むだけです。

//-----------------------------------------------------------------------------
// WindowProc()
// ウインドウ関数
//-----------------------------------------------------------------------------
LRESULT CALLBACK WindowProc(
    HWND hWnd,          // ウインドウハンドル
    UINT uMsg,          // メッセージ
    WPARAM wParam,      // メッセージに対する情報
    LPARAM lParam) {    // メッセージに対する情報
        
    //--メッセージ別の処理
    switch(uMsg)
    {
        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;

        case WM_KEYDOWN:
            switch(wParam)
            {
                case VK_ESCAPE:
                    PostQuitMessage(0);
                    break;
            }
            return 0;
    }
    // メインに返す情報
    return DefWindowProc(hWnd, uMsg, wParam, lParam);
}


int WINAPI WinMain(
       HINSTANCE hInstance,     //インスタンス番号
       HINSTANCE hPrevInstance,
       PSTR lpCmdLine,
       int nCmdShow)
{

    //---------------中略---------------//
	

    //DirectX初期化
    if(FAILED(InitD3d(hWnd)))
    {
        MessageBox(hWnd, "DirectXの初期化に失敗しました。",
            "ERROR", MB_OK);
        return 0;
    }

    ZeroMemory(&msg, sizeof(msg));  //msg初期化
    while(msg.message != WM_QUIT)
    {
        //Windowメッセージの取得
        if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE) > 0)
        {
            //メッセージを変換する
            TranslateMessage(&msg);
            //ウインドウ関数にメッセージを送る
            DispatchMessage(&msg);
        }
        else
        {
            //レンダリング関数
            Render();
        }
    }
    //オブジェクトの開放処理
    FreeDx();

}
				

初期化が出来ました。次は描画です。描画の更新はRender関数で行います。

//---------------------------------------------------------------------------//
//レンダリング関数
//---------------------------------------------------------------------------//
VOID Render()
{
    //画面の初期化
    pDevice->Clear(0, NULL,
        D3DCLEAR_TARGET,
        D3DCOLOR_XRGB(100, 100, 100),   //初期化時の色
        1.0f,0);

    if(SUCCEEDED(pDevice->BeginScene()))    //描画開始
    {


        pDevice->EndScene();    //描画終了
    }

    //フリップ(バックバッファを表に出す)
    pDevice->Present(NULL, NULL, NULL, NULL);
}
				

最後に後片付け。


//オブジェクト開放関数
VOID FreeDx()
{
    SAFE_RELEASE(pDevice);
    SAFE_RELEASE(pD3d);
}
			

WinAPIのみと比べると少々長くなりました。しかし初期化はほぼ変更することは無いので、 一度打ってしまえば後はコピー&ペーストです。