複数の効果音・画像を1つのDLLに

  • 概要

    ScenarioModでは、複数の効果音や画像をバラバラのファイルでも扱うことが出来ますが、
    「配布をする」といった事態になった場合には、バラバラのファイルよりも1つのdllにパック化するのがスマートです。

    一度やり方をしってしまえば、誰でも出来る程度のことですので、
    やり方の流れをみていきましょう。

  • パック化の手順

    • さて、では、VC++のメニューより、「新規作成」=>「プロジェクト」を選択しましょう。


    • 引き続いて、「Win32」=>「Win32プロジェクト」となります。
      プロジェクト名に「MyResPack」などと入力し、OKしましょう。
      名前はなんでも良いのですが、リソースのパックであることを感じとれる名前がよいでしょう。


    • 「次へ」と続けて

    • 「DLL」と「空のプロジェクト」にチェックを入れ、他はチェックをはずします。「完了」を押しましょう。


    • そうすると、ソリューションエキスプローラーは下図のようなツリーとなります。


    • 「ソースファイル」のところを右クリックで「追加」->「新しい項目」と進み、
      以下のように「dllmain.cpp」というソースをくっつけましょう。


    • 以上で下図のように、「dllmain.cpp」だけくっついた状態となります。


    • この段階では、「dllmain.cpp」のソースの中身は空っぽです。
      1行も何も書かれていない状態。

    • さて、少し話を変えて、
      メニューのちょっと下あたりに「Release」もしくは「Debug」と見えている下図のようなところがあるはずです。
      「Release」を一度選択しましょう。


    • シンプルなDLLにふさわしい設定にするために、プロジェクトの設定を変更する必要があります。
      下図のようにソリューションエキスプローラの「MyResPack」を右クリックして、「プロパティー」に入ります。


    • 構成プロパティの「全般」の項目に「文字セット」という項目がありますので、「Unicode文字セットを使用する」というのを変えて、「マルチバイト文字セットを使用する」にしましょう。
      天翔記では、元々がShiftJIS(正確にはCP932)ですので、DLLをUnicode文字で管理するより、通常のマルチバイト文字セットの方が、はるかに扱いやすいためです。


    • 同様に、構成プロパティの「C/C++」の項目に「ランタイムライブラリ」という項目がありますので、「マルチスレッド DLL(/MD)」ではなく、「マルチスレッド (/MT)」へと変更します。

      これは、このDLL内に必要なものを内包するか、それとも、できるだけ外部のDLLに頼りサイズを減らすかの選択です。
      両者はファイルサイズがかなり異なりまずが、どのみちファイルサイズは小さいため、
      特に問題がなければ、 トラブル防止のため、「マルチスレッド (/MT)」を選択しておきましょう。


    • 「適用」=>「OK」を押して、全てを反映させましょう。

    • さて、それでは、dllmain.cpp を選択して、話を戻しましょう。


    • 「呼び出されるだけで機能的には何もしないdll」というものを作成します。


      あってるかどうか、コピペが可能なソース

      #include <windows.h>
      
      BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) {
          return TRUE;
      }
          
    • さて、ソースは以上です。

    • それでは、いよいよリソースを埋め込みます。

      「リソースファイル」のところで右クリックを選びます。


      「resource.rc」というファイルをくっつけましょう。
      拡張子が「.rc」であれば、名前は自由です。



    • それでは、リソースをテキストで編集します。

      「resource.rc」のところで、右クリックして、コード表示。


      以下のようにテキスト入力してみましょう。


    • 青線が「シンボル名」、IMAGEやWAVEが「グループ名」、"abc.png"や"mylove.wav"がファイル名という理解をしておきましょう。

    • Windowsのエキスプローラー上で、「resource.rc」と同じフォルダに、"mylove.wav"と"abc.png"というファイルを適当に用意してコピーなどして入れましょう。


    • 準備は全て終わりました。プロジェクトをビルドしましょう。


    • ちゃんとエラーも出ずにdllファイルは出来ましたか?

    • これでdllファイルそれ自体に、wav相当のバイナリデータや、png相当のバイナリデータが「埋め込まれた」形となります。


    • では、「このMyResPack.dll」を天翔記フォルダにコピーしましょう。

  • ScenarioModからの利用

    先ほどパック化したdllを利用して、ScenarioModで利用してみましょう。

    • ScenarioModでこのMyResPack.dllの画像リソースや効果音リソースを利用してみましょう。

      先ほどの話を思い出してください、MyResPack.dllに埋め込んだ「シンボル名」やリソースデータは下記のように定義しました。
      この「シンボル名」を指定することとなります。
      (「IMAGE」や「WAVE」といったグループ名はTSMod側が処理しています。)


    • ScenarioMod上で、「On_起動時」あたりに、以下のようにすることで「dllを読み込む」ことができます。

      void カスタム::On_起動時() {
        Set_効果音DLL追加("MyResPack.dll");
        Set_画像DLL追加("MyResPack.dll");
      }
      
          
    • そして効果音用関数や、画像用関数で以下のように利用します。

      void カスタム::On_プレイヤ担当ターン《メイン画面》() {
      
        // "Image01"という文字は大文字小文字は問わない
        画像ダイアログ表示("Image01", "MyResPack.dll");
      
        // 上と合わせるなら、本来は "101" と数字文字列にて指定するべきところ。
        // しかし、ScenarioModでは特別に天翔記の「効果音は全部番号」という仕様を踏まえ、「数字文字列」ではなく「数値」で指定する。
        効果音再生(101, "MyResPack.dll");
      }