× [PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。 |
cocos2d-xでandroidで、同じBGMが2度目以降再生されないバグがある。
(cocos2d-xトップディレクトリ)/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxMusic.java の中。 stopBackgroundMusic() のあと、同じファイルで playBackgroundMusic() すると音が鳴らない。 結論言うと、 prepare()をしていないから。 cocosの音声周りの実装は、SimpleAudioEngineを介して、Cocos2dxMusic.java を呼び出している。 Cocos2dxMusic は、メンバにAndroidSDKのMediaPlayerを保持し、これを操作している。 初回のplayBackgroundMusicは、createMediaPlayerメソッドを実行し、内部で mediaPlayerのインスタンス化、 setDataSource prepare setVolume を行っている。 その後playを実行し、音が鳴り始める。 さて、2回目にplayBackgroundMusicが呼ばれたとき。 直前に鳴らした音声の情報はmediaPlayerの中に残っており、(stopBackgroundMusicを実行しても、stopするだけでreleaseはしていない)、同ファイルだった場合は初期化処理を丸ごと飛ばす。 ここが問題。 このとき、本来実行すべきprepare()が抜けているのだ。 そこで、同ファイルのplayBackgroundMusicのとき、 prepare seekTo(0)…曲の先頭に移動 を行うようにした。
try{ this.mBackgroundMediaPlayer.prepare(); this.mBackgroundMediaPlayer.seekTo(0); } catch (final Exception e) { Log.e(Cocos2dxMusic.TAG, "error: " + e.getMessage(), e); } } : これでOK。 ちなみにlibcocos2dxプロジェクトのjavaファイルを書き換えてビルドすれば ゲームプロジェクトにもちゃんと反映される。 PR |
|