ちょっと間が空いたけど、今回は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();
}
}