MediaElementで効果音 ― 2015年07月26日 14:19
ゲームには、効果音があったほうがいい。と、XAMLにMediaElementの定義を行う。
ところが、鳴らない。いや、鳴るときもある。ページを切り替えるとまた鳴らなくなる。しばらく経つと、ページ切替を伴わない処理では安定して鳴る。音声ファイルの形式を疑うも、MSのゲームに添付されているものに合わせても症状は変わらない。
MediaElement.CurrentStateの変化をイベントハンドラーで捉まえ、Debug.WriteLine()で追いかける。ページ起動後、一斉にOpeningになり、PausedやClosedになるが、少々時間を要す。
MediaElementはUI要素なので、ページ切替で都度初期化される。初期化されてしばらくは、音声ファイルの読み込みなどが非同期で行われ、完了するまでは鳴らない、と考えられる。音声の準備が出来てから、ゲーム画面をReadyにしたい。
そこで、MediaElementをページのXAMLに記述しないで、コードで作ってみる。効果音を司るclassを設け、ページ切替の度に初期化されるのを防ぐ。主たる処理はSetSndSource()に任せる。
ここでは、音声ファイルの読み込みに時間を要していると考え、awaitで完了を待ってみる。
ただし、バッファリングを待つ術がない。Play()は、voidなので、awaitで待てない。
※他にも苦労している人はいるようで。
http://blogs.msdn.com/b/lucian/archive/2012/11/28/how-to-await-a-mediaelement.aspx
http://blogs.msdn.com/b/lucian/archive/2012/11/28/how-to-await-a-mediaelement.aspx
これで、ほとんどは鳴るようになった。それでも、一番最初のゲーム開始を告げる効果音は鳴らない。2回目からは鳴る。
ただし、副作用が生じる。イベントハンドラがイベントを拾わなくなる。先のDebug.WriteLine()の出力もない。デバッガでブレークポイントを設定しても止まらないので、そもそもイベントが通知されていない。MediaElementはUI要素なので、ページのUI構造(ツリー)に登録しないと、イベントが降りてこないのだろう。
試しに、XAMLにダミーのGridを用意して、コードで登録すると(3つ前の図の末尾のコメント)、イベントを拾える。反面、ページ切替の度の初期化から逃れられず、鳴らない率が増える。
これ以上は、別のサウンドライブラリを使うなり、Unityで開発する方がよさそう。
コメント
トラックバック
このエントリのトラックバックURL: http://c5d5e5.asablo.jp/blog/2015/07/26/7716912/tb
※なお、送られたトラックバックはブログの管理者が確認するまで公開されません。
コメントをどうぞ
※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。
※なお、送られたコメントはブログの管理者が確認するまで公開されません。