2013年9月1日日曜日

[tips : cocos2d-x 2.1.5] 停止したBGMがバックグラウンドタスクからの復帰で再生される

■現象
  • 停止したはずのBGMが鳴り始める

■環境
  • cocos2d-x 2.1.5
  • SimpleAudioEngine
  • iOS5.1.1(iPod touch 3G)、iOS5.1(iPod touch 4G)、iOS6.0.1(iPod touch 5G)
※.iOS4.3.3(for iPad)では未解決

■手順
  • SimpleAudioEngine::playBackgroundMusicでBGMを再生する
  • SimpleAudioEngine::stopBackgroundMusicでBGMを停止する
  • ホームボタンを押しタスクをバックグラウンドに移行する
  • タスクを選択し再度フォアグラウンドに移行する

■原因
  AppDelegate::applicationDidEnterBackgroundで呼び出されるSimpleAudioEngine::pauseBackgroundMusicおよびAppDelegate::applicationWillEnterForegroundで呼び出されるSimpleAudioEngine::resumeBackgroundMusicの挙動が原因。

 SimpleAudioEngine::resume最終的にAVAudioPlayer::playするだけであるためSimpleAudioEngine::stopBackgroundMusicで停止したはずのBGMが再生される。

■対応
 サウンドヘルパークラスで吸収。主な処理は以下の通り。

  • BGM再生フラグを持たせ、playでtrue、stopでfalseにする
  • resumeされた場合、BGM再生フラグをみてSimpleAudioEngine::resumeを呼び出すかを決定する

 SimpleAudioEngine.mm/hを直接変更する場合は以下の通り。

 SimpleAudioEngine::stopBackgroundMusicの代わりに無音のBGMを再生する、もしくはミュートするという強引な解決法も存在するが少なくともライブラリとして実装することはオススメできない。

■その他
 ゲームの一時停止機能でpause / resumeを利用したいとして、AppDelegate::applicationWillEnterForegroundresumeBackgroundMusicが強制的に呼び出されてしまう件に関してはまた別の機会にでも。

0 件のコメント:

コメントを投稿