プログラム « L.T.SOFTWARE

‘プログラム’ カテゴリーのアーカイブ

スリープから回復させると効果音が再生されなくなるんですが

2014 年 1 月 16 日 木曜日

という不具合。iOSとCocos2d−xです。
HOMEボタンでアプリを閉じてから復帰させるときは大丈夫なんですよ。

どちらもapplicationWillEnterForegroundとapplicationDidEnterBackgroundが動いてるので、
ロジックは同じところ通ってるんですよね。
毎回起きるわけじゃなくて何回かに一回おきる。
スリープのまま長めに放置してると起きやすかったりするかも。
散々悩んでもうこれ仕様でいいんじゃね?ってゴリ押しする事まで考えたんですが、解決策が出ました。
ちなみにiPhone限定かもしれないです。iPadで何回かやったけど出ませんでした。

applicationDidEnterBackground(スリープ時)には次の処理が入っています
データのシリアライズ
cocos2d-xのDirector他色々止める
効果音を止める
BGMを止める

applicationWillEnterForeground(スリープ復帰時)には次の処理が入っています
データのデシリアライズ(変わってない筈だけどまぁ念のため)
cocos2d-xのDirector他色々再開させる
効果音再開させる
BGM再開させる

で、なぜか効果音だけ鳴らなくなる。
ゲームも再開してるしBGMも鳴ってるから、ロジックそのものスキップされてる感じではないんですよ。
散々悩んで出てきた結論が、
「そもそもスリープ時に効果音止めなくてよくね?」
でした。

シンプルにSimpleAudioEngine::sharedEngine()->pauseAllEffects();とresumeAllEffects();をコメントアウト。
ゲームそのものが止まってるから、バックグラウンドでは何も進行しないので、
スリープ中に何かが再生されることはあり得ません。
(そもそもスリープ中に効果音流せるのかは分かりませんが)

おそらく、スリープ復帰中に止めていた効果音を復活させようとすると、
何かしらに失敗して停止したままになってしまうようです。

で、終わらないのが今回の話。
低確率になったけどやっぱり同じ現象が起きる。

こちらの方が同じ現象に遭遇していました!
http://blog.fspm.jp/2013_09_01_archive.html
解決方法は、

  1. スリープ時にendメソッドでサウンドエンジンを終了させる。
  2. 復帰時にBGM再生と効果音のpreloadを行う。

というものでした。

今のところこれで再現しないようなので様子見。

うーん、何が原因なのかさっぱりわからないところが怖いな。

openALのバグだったりするのかしら。

コメントはまだありません »