OpenSiv3Dで効果音ビューアを作ろうとしている話

2018/12/22

この記事はSiv3D Advent Calendar 2018 22日目の記事です。

Advent Calendarっていうのは平たく言うと、年賀状のことです。うそです。

あと、なるべくOpenSiv3Dから使い始めた人向けの文章にしてあります。「今更何書いてるんだ」って思ったSiv3Derの方、ご容赦くださいッ!

OpenSiv3Dを使いだした

トップ絵

メリークリスマス!

……ではない。今日は冬至だ。聡明な諸兄姉には是非ともかぼちゃの煮つけを作っていただきたい。意識の高い製作者はみんな作っている。ゆず湯は入らなくていいぞ。

ここ数回Siv3D関係の雑記を(2年位かけて)書いているが、昨年よりOpenSiv3Dの機能も充実してきたというところで、OpenSiv3Dで効果音ビューアーの制作を進めている。

下図に示すOnlyPlayWav Plusの後継である。

OnlyPlayWav Plus

軽く説明すると、要するにwavファイルがリストに列挙されてクリックするとその音が聴けるというだけである。効果音ビューアというと視覚と聴覚に訴えかける新感覚アプリケーションのようにも誤解されそうだし、誤用のような気もするが、簡潔に説明しようとするとこう言わざるを得ない。

今までこのソフトでそこまで困っていなかったのだが、

といった理由により、もう少しUIを改良したくなったのだった。

特に後者の影響は大きく、こいつはだいたい

音源のファイル構造

こんな構造が多い。なので、従来以上にディレクトリ移動の機会が増えており従来型の画面だと気持ちのいい操作がしにくいのだ。もう少し快適にブラウジングできるのではないかと思っている。

OpenSiv3Dでツール作成はいけるのか

というわけで後継ツールをOpenSiv3Dで作ることにした。

ちなみにOnlyPlayWav Plusは、C++Builder5(!)で制作したものだ。ExcelのVBAのようにボタンやテキストボックスを配置して、クリック時のイベントをもっぱら記述するという制作環境であるから、こいつの生産性も侮れないくらいに高い。接戦である。

OpenSiv3Dはどちらかというとゲームなんかを作るやつなのだがファイルタイプの違いを吸収してくれ、アニメーション系統が得意で、便利な関数もC++Builder(VCL)より幅が広い感じ。

Tips

さて、この後継ツールは現在作成中だが、関連する豆知識を並べていこう。

実行ファイルのサイズはResource.rcを弄れば減らせる

OpenSiv3Dを使ってこういう簡単な何かを作ろうとすると目に留まるのはファイルサイズの巨大さである。

Debugビルドで40MB、Releaseでも20MBくらいあるのだ。

残念ながらフロッピーディスクは駆逐されてしまったし、アップロード先をOneDriveなどのストレージサービスにしておけば「海外からでは実用的な速度でダウンロードできない!」ということも少ないと思うので、ファイルサイズに悩まされる場面も減りつつはあるのだが、簡素なツールにストレージを20MBも読みに行かせるのは少々お腹いっぱい感がある。

だが安心して欲しい。OpenSiv3Dでは、リソースファイルを変更すればファイルサイズを削減できるのだ。

ソリューションエクスプローラからResource.rcを選択し右クリックでコードの表示をさせてやると、「要らないなら消していいよ」という箇所があるので、そこをコメントアウトしてしまおう。

こうじゃ!

こうすることでファイル容量をかなり削減できる。なお、この中にはフォントも入っているので文字入力をさせる場合はmplus-1p-medium.ttf.zstくらいは残しておいたほうがいいかもしれない。

注意点としては、一度Siv3Dアプリを実行するとAppDataの中にフォント等のファイルが保存されるので、リソースファイルからフォント全部取り除いても開発者の環境ではmplusフォントが入っているときと変わらないように見える点だ。一度もSiv3Dアプリを実行していない環境ではMS ゴシックなどの別のフォントで表示されてしまいレイアウトが崩れたりする可能性がある。何となく心配になってきたが言っていることがよくわからない方は、リソースをコメントアウトしたアプリを実行する前にユーザーフォルダのAppData/Local/Siv3D以下のファイルを抹消して確認してみたほうが良いかもしれない。

フォルダ(ディレクトリ)のファイル一覧を取得する方法

FileSystem::DirectoryContents(U"c:\hogehoge\",false)

だ。第2引数はサブフォルダ以下まで取得するか否かである。省略時はtrueである。

これはStringのArrayを返すので、


for(auto file_or_folder : FileSystem::DirectoryContents(U"C:\hogehoge\",false)
{
  if(FileSystem::IsDirectory(file_or_folder)) 
  {
    Print(U"こいつはフォルダだ!その名は:" + file_or_folder);
  }
  else if(FileSystem::Extension(file_or_folder) == U"wav")
  {
    Print(U"wavファイルだぞ!その名は次の通りだ:" + file_or_folder);
  }
}
        

といった感じでfor文で処理が可能である。

ちなみにFileSystem::Extension()は「hoge.wavという名のディレクトリ」には反応しないのでご安心いただきたい。

ボタンやテキストボックスはSimpleGUIで作れる

ゲームではないアプリケーションではボタンやらテキストボックスやらチェックボックスやらが必要だが、OpenSiv3Dでは簡易に作成可能である。

SimpleGUIを使用する。これらは「表示して欲しいフレームで毎回呼び出す」という使い方をする。


//ボタン          
if (SimpleGUI::Button(U"hogehoge", Vec2(100, 100), 200, true))
{
  Print(U"hogehogeボタンが今押されているぞ!");
}

//テキストボックス
TextEditState txtbox_value(U"パスワードを入力せよ。最大3333文字だ。") //Updateループの外で宣言しておく

SimpleGUI::TextBox(txtbox_value, Vec2(0,0), 200, 3333)  //こっちはUpdate内に置いておく
if(txtbox_value.text == U"3333")
{
  Print(U"そういう意味じゃない!");
}     
        

他にもラジオボタン、チェックボックスあたりが用意されている。v0.3現在はリストボックス、コンボボックスはないのでいい感じのを自作するとよいだろう。

他アプリケーションへファイルをドロップする

超簡単である。

Windows::DragDrop::MakeDragDrop(U"C:\Windows\system.ini");

これを呼べばWindowsフォルダにあるsystem.iniを他アプリケーションへ持っていける。マウスボタンの状況などはOpenSiv3D側で見てくれているらしく、マウスボタン押下時に1回呼べばあとはマウスボタンを離すまでドラッグ状態になってくれる。なおWindows限定である。

おわりに

現状ではウィンドウサイズをユーザー側で伸縮できないという制限があるが、今後のバージョンで対応の予定である。

効果音ビューアとしては、最近ではwavファイル以外のogg等のフォーマットも使われだしている。そういう部分で言えばwav以外のフォーマットも扱いやすいOpenSiv3Dは魅力的な選択肢であろう。(そもそもゲーム制作に使われるライブラリなのだから当然といえば当然だが)

なお製作中のソフトだが、まだ開発中なので未公開である。名称はOnlyPlayWav3になる予定だが、対応フォーマットは広げる予定だ。

皆さんにも色々なものを作っていただきたい。