• Dマスコットアクション

    2011年04月03日 23時52分
    D言語スレを見ている限り要するにこういうのを作ればいいんだな!

    タイトル画面

    わかったやってみよう。



    にわかにやる気出てきたので追加した。

    ステージセレクト画面

    よしぷろぐらむかこう。
  • OpenSL ES での複数音源再生

    2011年03月23日 04時56分
    以前の記事で、MIDIを複数再生するとおかしくなると書きましたが、使い方が悪かったようです。

    EngineとOutput Mixが1対1で、Output MixとPlayerが1対Nだと思っていましたが、
    正しくはEngineとOutput Mixが1対Nで、Output MixとPlayerが1対1のようです。

    リファレンスにもきちんと書いてありました。
    7.9 Output Mix
    Description
    The output mix object represents a set of audio output devices to which one audio output
    stream is sent. The application retrieves an output mix object from the engine and may
    specify that output mix as the sink for a media object. The engine must support at least
    one output mix, though it may support more. The API does not provide a direct audio
    output IO-device as a sink for media objects.

    実際そのように修正したところ、エミュレータ上の動作は正常になりました。

    ただ、Output Mixの数は最低1つが保証されているのみで、
    それ以上もたぶんあるんじゃないの的な記述なのが少々気になります。

    実際に使える数の上限は不明です。
    とりあえずエミュレータ上で2音まで確認しました。

    ランタイムの実装依存だとは思いますが、もしかしたら実機依存かもしれません。
  • D言語でDirectX 補足情報

    2011年03月20日 12時21分
    前回のD言語用DirectXモジュールについての補足です。

    このモジュールを使用する場合の開発環境ですが、必要なものはdmdのみです。

    DirectXのSDKは特に必要ありません。
    サンプルやリファレンスが欲しい時にインストールすれば良いです。

    libファイルも用意してませんので、リンクする必要はありません。


    DirectXをD言語から使用する方法ですが、基本的にC++から使用する場合と同じです。

    何か調べる時にはC++からの使用を解説しているサイトなどを探してください。
    APIは同一となっています。(なっていなかったら私の作成ミスです。)


    基本的にCOMのオブジェクトはC++と同様に取れますが、
    ルートとなるオブジェクトの取得には注意が必要です。

    インポートライブラリを同梱していませんので、
    例えば「DirectSoundCreate8」のような関数ではなく、CoCreateInstanceを使うことをお勧めします。

    つまり、IDirectSound8やIDirectInput8等は次の様にCOM標準の方法で取得します。
    1IDirectSound8 directSound;
    2CoCreateInstance(&CLSID_DirectSound8, null, CLSCTX.CLSCTX_INPROC_SERVER, &IID_IDirectSound8, cast(void**)&directSound);


    1IDirectInput8 directInput;
    2CoCreateInstance(&CLSID_DirectInput8, null, CLSCTX.CLSCTX_INPROC_SERVER, &IID_IDirectInput8, cast(VOID**)&directInput);



    同じようにしてDirect3Dのオブジェクトも取りたいところですが、
    Direct3Dに限ってはCoCreateInstanceでは取れません。
    「Direct3DCreate9」のような専用関数を使用する必要があります。

    この関数の実体はDLLに含まれています。
    「Direct3DCreate9」ならば「d3d9.dll」です。

    よって、次の様にDLLから関数を取得して使用します。
    1HMODULE d3d9Dll = LoadLibrary("d3d9.dll\0".ptr);
    2
    3Direct3DCreate9Function Direct3DCreate9 = cast(Direct3DCreate9Function)GetProcAddress(d3d9Dll, "Direct3DCreate9\0".ptr);
    4
    5IDirect3D9 direct3D = Direct3DCreate9(D3D_SDK_VERSION);



    Direct3D 11の場合はこうです。
    1HMODULE d3d11Dll = LoadLibrary("d3d11.dll\0".ptr);
    2
    3PFN_D3D11_CREATE_DEVICE_AND_SWAP_CHAIN D3D11CreateDeviceAndSwapChain = cast(PFN_D3D11_CREATE_DEVICE_AND_SWAP_CHAIN)GetProcAddress(d3d11Dll, "D3D11CreateDeviceAndSwapChain\0".ptr);
    4
    5IDXGISwapChain swapChain;
    6ID3D11Device device;
    7ID3D11DeviceContext immediateContext;
    8D3D_FEATURE_LEVEL featureLevel;
    9DXGI_SWAP_CHAIN_DESC swapChainDesc; // 設定略
    10D3D11CreateDeviceAndSwapChain(null, D3D_DRIVER_TYPE.D3D_DRIVER_TYPE_HARDWARE, null, 0, null, 0, D3D11_SDK_VERSION, &swapChainDesc, &swapChain, &device, &featureLevel, &immediateContext);

  • D言語でDirectX

    2011年03月17日 22時38分
    いつものように手持ちのソースの再アップです。


    D言語からはCOMが扱えるようになっているので、
    DirectXのヘッダ情報さえD言語モジュールとして作ってしまえば割と簡単にDirectXが扱えます。

    ただ、そのD言語モジュールを作るのが激しく面倒です。
    使う人がそれぞれでこんな作業をしていたら宇宙のエントロピーが増大してしまうと思うのです。
    そうすると魔法少女的なところにも影響があると思うのでよろしくありません。


    なので私がせっせと作ったモジュールを置いておきます。
    D言語(D2)用 DirectX モジュール


    例によって手作業でやっている部分が多いので
    何かおかしなところがあればこのモジュールが原因の可能性が高いです。

    可能な限り正しく動く状態にしたいと思いますので、
    そういった場合には情報をいただければと思います。


    また、上記モジュールの使用例として
    簡単なプログラムを作成しました。

    サンプルプログラム

    2011年3月21日 追記

    上記のサンプルプログラムがdmd2.052でビルド出来なかったため、修正版を置いておきます。
    winmain.dで一箇所Objectをcatchしている箇所があったので、そこをThrowableに直しただけです。
    サンプルプログラム
  • D言語でOgg vorbis

    2011年03月16日 19時47分
    Android関連で使ったときにバージョンバップしているのに気づいたのと、
    前にアップしたのが消えてしまっているので再アップです。

    oggvorbis 1.0.0