ゲーム開発5:DirectX Graphics(Direct3D)を初期化する

ちょっと間が空いたけど、今回はDirect3Dの初期化と解放です。ここも定型処理だね。今回使うのはDirect3Dのデバイスとオブジェクト、Direct3DXのスプライトとフォントです。ちなみにDirect3DXはDirect3Dのラッパーです。

将来的にDirectXのバージョンが変わる可能性を考慮して(もう新しいの出てるけど)、クラスは2つに分けます。CGraphicisBaseとCGraphicsです。CGraphicisBaseにはDirectXに依存する処理を入れておき、CGraphicisに継承させます。いざ環境が変わったらCGraphicisBaseだけ差し替えれば動く、という感じにします。クラス名はCGraphicisBase90cみたいにバージョン入れた方がわかりやすいかもね。

しかし今回もDirectX8時代のソースを基に組んでるけど、細かい所が色々変わってるね。同じ名前なのにクラスがオーバーロードする訳でもなく、別物になってたりするし。ゲイツめ…

//---------------------------------------------------------
// 初期化

BOOL CGraphicsBase::Init(HWND hWnd)
{
 // 表示系初期化
 if (InitD3D(hWnd)==E_FAIL) {
  MessageBox(NULL, "Direct3Dの初期化に失敗しました", "CGraphicsBase::Init", MB_OK);
  return E_FAIL;
 }

 // スプライトオブジェクトの作成
 D3DXCreateSprite(D3Device, &D3Sprite);

 // フォント初期化
 InitFont(&D3DebugFont);

 return S_OK;
}

//---------------------------------------------------------
// Direct3D初期化

BOOL CGraphicsBase::InitD3D(HWND hWnd)
{
 D3DPRESENT_PARAMETERS d3dpp; 
 D3DDISPLAYMODE   d3ddm;

 // Direct3Dオブジェクトの作成
 if (NULL==(D3D=Direct3DCreate9(D3D_SDK_VERSION))) {
  MessageBox(NULL, "Direct3Dオブジェクトの生成に失敗しました", "CGraphicsBase::InitD3D", MB_OK);
  return E_FAIL;
 }

 // 現在のディスプレイモードを検出する
 if (FAILED(D3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &d3ddm))) {
  MessageBox(NULL, "ディスプレイモードの検出に失敗しました", "CGraphicsBase::InitD3D", MB_OK);
  return E_FAIL;
 }

 // 3Dアプリケーションの動作を指定する
 ZeroMemory(&d3dpp, sizeof(d3dpp));
 d3dpp.BackBufferWidth=640;
 d3dpp.BackBufferHeight=480;
 d3dpp.Windowed=System->ScreenMode; // フルスクリーン:FALSE
 d3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD;
 d3dpp.BackBufferFormat=d3ddm.Format;

 // Direct3Dデバイスの作成
 if (FAILED(D3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
         D3DCREATE_SOFTWARE_VERTEXPROCESSING,
         &d3dpp, &D3Device))) {
  MessageBox(NULL, "Direct3Dデバイスの生成に失敗しました", "CGraphicsBase::InitD3D", MB_OK);
  return E_FAIL;
 }

 return S_OK;
}

//---------------------------------------------------------
// フォント初期化

void CGraphicsBase::InitFont(LPD3DXFONT *D3Font)
{
 // テキスト設定
 D3DXFONT_DESCA FontDesc={
  32,     // 高さ
  0,     // 幅
  0,     // 太さ
  0,     // ミップレベル
  FALSE,    // イタリック
  SHIFTJIS_CHARSET,
  OUT_DEFAULT_PRECIS,
  DEFAULT_QUALITY,
  DEFAULT_PITCH | FF_DONTCARE,
  NULL,
 };

 // フォントオブジェクト作成
 D3DXCreateFontIndirect(D3Device, &FontDesc, D3Font);
}

//---------------------------------------------------------
// Direct3D解放

void CGraphicsBase::TermD3D()
{
 // フォント解放
 if (D3DebugFont!=NULL) {
  D3DebugFont->Release();
 }

 // スプライト解放
 if (D3Sprite!=NULL) {
  D3Sprite->Release();
 }

 // Direct3Dデバイス解放
 if (D3Device!=NULL) {
  D3Device->Release();
 }

 // Direct3Dオブジェクト解放
 if (D3D!=NULL) {
  D3D->Release();
 }
}

コメントを残す

メールアドレスが公開されることはありません。