mud_easy3d\common // D3DDev8.h // 2006-02-18 #ifndef _WIN32API_D3DDEV_H_ #define _WIN32API_D3DDEV_H_ #include <windows.h> #include <d3d8.h> #include <d3dx8.h> /// D3Dデバイス class CD3DDev { public: /// コンストラクタ CD3DDev(); /// デストラクタ ~CD3DDev(); /// オブジェクト取得 LPDIRECT3D8 GetD3D() { return m_lpD3D; } /// オブジェクト取得 LPDIRECT3DDEVICE8 GetDevice() { return m_lpD3DDevice; } /// 初期化 HRESULT Init( HWND hWnd ); /// 解放 void Kill(); /// void BeginScene( void ); /// bool EndScene( void ); protected: /// D3Dデバイスオブジェクト LPDIRECT3DDEVICE8 m_lpD3DDevice; /// D3Dオブジェクト static LPDIRECT3D8 m_lpD3D; /// 参照カウンタ static int m_cnt; }; #endif //_WIN32API_D3DDEV_H_ // D3DDev8.cpp #include "Util.h" #include "D3DDev.h" #define FULLSCREEN (0) LPDIRECT3D8 CD3DDev::m_lpD3D = NULL; int CD3DDev::m_cnt = 0; CD3DDev::CD3DDev() { Debugout("CD3DDev"); m_lpD3DDevice = NULL; } CD3DDev::~CD3DDev() { Debugout("~CD3DDev"); if ( 0!=m_cnt ) { Error( "D3Dオブジェクトの参照カウンタが異常です。D3Dオブジェクトは解放されていません。" ); // 1ならばここでKill()を呼んでもいいだろう } } HRESULT CD3DDev::Init( HWND hWnd ) // bFullScreen { Debugout("CD3DDev::Init"); // オブジェクト初期化 if ( 0==m_cnt ) { m_lpD3D = ::Direct3DCreate8( D3D_SDK_VERSION ); // エラー処理(未) Debugout( "CD3DDev::Init D3Dオブジェクト生成しました。" ); } m_cnt++; // 現在の画面モードを取得 D3DDISPLAYMODE d3ddm; if( FAILED( m_lpD3D->GetAdapterDisplayMode( D3DADAPTER_DEFAULT, &d3ddm ) ) ) { return E_FAIL; } // デバイスのパラメータを設定 D3DPRESENT_PARAMETERS param; ::ZeroMemory( &param, sizeof(param) ); param.BackBufferCount = 1; // バックバッファの数 if (FULLSCREEN) { param.Windowed = FALSE; // フルスクリーン param.BackBufferWidth = 640; // 解像度・幅 param.BackBufferHeight = 480; // 解像度・高さ } else { param.Windowed = TRUE; // ウインドウモード } param.BackBufferFormat = d3ddm.Format; param.SwapEffect = D3DSWAPEFFECT_DISCARD; // 表示する方法 // param.Flags = D3DPRESENTFLAG_LOCKABLE_BACKBUFFER; param.hDeviceWindow = hWnd; // Z バッファの自動作成 param.EnableAutoDepthStencil = 1; param.AutoDepthStencilFormat = D3DFMT_D16; // デバイス作成 D3DDEVTYPE DeviceType = D3DDEVTYPE_HAL; DWORD BehaviorFlags = D3DCREATE_SOFTWARE_VERTEXPROCESSING; HRESULT hr = GetD3D()->CreateDevice( D3DADAPTER_DEFAULT, // プライマリディスプレイアダプタ DeviceType, hWnd, // ウインドウハンドル BehaviorFlags, &param, // パラメータ &m_lpD3DDevice ); if (FAILED(hr)) { ::MessageBox(NULL,"Direct3D の初期化に失敗しました。","エラー",MB_OK | MB_ICONSTOP); return E_FAIL; } Debugout( "CD3DDev::Init D3Dデバイス生成しました。" ); return S_OK; } void CD3DDev::Kill() { Debugout("CD3DDev::Kill"); // 解放 SAFE_RELEASE( m_lpD3DDevice ); Debugout( "CD3DDev::Kill D3Dデバイス解放しました。" ); --m_cnt; if (0>=m_cnt) { SAFE_RELEASE( m_lpD3D ); Debugout( "CD3DDev::Kill D3Dオブジェクト解放しました。" ); } } void CD3DDev::BeginScene( void ) { GetDevice()->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,127), 1.0, 0 ); GetDevice()->BeginScene(); } bool CD3DDev::EndScene( void ) { GetDevice()->EndScene(); GetDevice()->Present( NULL, NULL, NULL, NULL ); return true; }