このモジュールを使用する場合の開発環境ですが、必要なものはdmdのみです。
DirectXのSDKは特に必要ありません。
サンプルやリファレンスが欲しい時にインストールすれば良いです。
libファイルも用意してませんので、リンクする必要はありません。
DirectXをD言語から使用する方法ですが、基本的にC++から使用する場合と同じです。
何か調べる時にはC++からの使用を解説しているサイトなどを探してください。
APIは同一となっています。(なっていなかったら私の作成ミスです。)
基本的にCOMのオブジェクトはC++と同様に取れますが、
ルートとなるオブジェクトの取得には注意が必要です。
インポートライブラリを同梱していませんので、
例えば「DirectSoundCreate8」のような関数ではなく、CoCreateInstanceを使うことをお勧めします。
つまり、IDirectSound8やIDirectInput8等は次の様にCOM標準の方法で取得します。
1 | IDirectSound8 directSound; |
---|---|
2 | CoCreateInstance(&CLSID_DirectSound8, null, CLSCTX.CLSCTX_INPROC_SERVER, &IID_IDirectSound8, cast(void**)&directSound); |
1 | IDirectInput8 directInput; |
---|---|
2 | CoCreateInstance(&CLSID_DirectInput8, null, CLSCTX.CLSCTX_INPROC_SERVER, &IID_IDirectInput8, cast(VOID**)&directInput); |
同じようにしてDirect3Dのオブジェクトも取りたいところですが、
Direct3Dに限ってはCoCreateInstanceでは取れません。
「Direct3DCreate9」のような専用関数を使用する必要があります。
この関数の実体はDLLに含まれています。
「Direct3DCreate9」ならば「d3d9.dll」です。
よって、次の様にDLLから関数を取得して使用します。
1 | HMODULE d3d9Dll = LoadLibrary("d3d9.dll\0".ptr); |
---|---|
2 | |
3 | Direct3DCreate9Function Direct3DCreate9 = cast(Direct3DCreate9Function)GetProcAddress(d3d9Dll, "Direct3DCreate9\0".ptr); |
4 | |
5 | IDirect3D9 direct3D = Direct3DCreate9(D3D_SDK_VERSION); |
Direct3D 11の場合はこうです。
1 | HMODULE d3d11Dll = LoadLibrary("d3d11.dll\0".ptr); |
---|---|
2 | |
3 | PFN_D3D11_CREATE_DEVICE_AND_SWAP_CHAIN D3D11CreateDeviceAndSwapChain = cast(PFN_D3D11_CREATE_DEVICE_AND_SWAP_CHAIN)GetProcAddress(d3d11Dll, "D3D11CreateDeviceAndSwapChain\0".ptr); |
4 | |
5 | IDXGISwapChain swapChain; |
6 | ID3D11Device device; |
7 | ID3D11DeviceContext immediateContext; |
8 | D3D_FEATURE_LEVEL featureLevel; |
9 | DXGI_SWAP_CHAIN_DESC swapChainDesc; // 設定略 |
10 | D3D11CreateDeviceAndSwapChain(null, D3D_DRIVER_TYPE.D3D_DRIVER_TYPE_HARDWARE, null, 0, null, 0, D3D11_SDK_VERSION, &swapChainDesc, &swapChain, &device, &featureLevel, &immediateContext); |
ビルドといってもdmdにオプション指定しているだけなので、
dmdにパスが通っていればいけると思っていたのですが・・・
前回の記事に修正版もアップしておきました。よろしければお使いください。
dmd2.052は不具合が多いため、2.051と切り替えながら使用していたのですが、
そのせいで2.052を使っているつもりが実は2.051という状態になっていました。
情報ありがとうございました。