cocos2d-x 3.5ではAudioEngineを使えますが、くまのがっこう神経衰弱バトルではSimpleAudioEngineを使いました。全てのケースにあてはまるかわかりませんが苦労した点をご紹介します。
バックグラウンドに落としてからフォアグラウンドに復帰したときに「BGMが再生されない」「効果音が一切再生されなくなる」といった不具合が100回に1回くらいの割合で発生しました。iOSでもAndroidでも症状が確認されました。
ネットを調べてもあまり情報がありませんでしたが数人ほど同じ症状で苦しんでいる方がいて、一旦オーディオの処理を完全に停止して再開すれば症状が出なくなるとのことだったので以下の実装を行ったところ症状は出なくなりました。
AppDelegate.cpp
1 2 3 4 5 |
void AppDelegate::applicationWillEnterForeground() { // ファオグラウンド復帰の通知を発行 NotificationCenter::getInstance()->postNotification("enterForeground"); } |
HelloWorldScene.h
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
#ifndef __HELLOWORLD_SCENE_H__ #define __HELLOWORLD_SCENE_H__ #include "cocos2d.h" #include "SimpleAudioEngine.h" USING_NS_CC; using namespace CocosDenshion; class HelloWorld : public cocos2d::Layer { private: // フォアグランドへ入ったときの処理 void enterForeground(Ref* obj) { // オーディオを停止する SimpleAudioEngine::getInstance()->stopAllEffects(); SimpleAudioEngine::getInstance()->stopBackgroundMusic(); SimpleAudioEngine::getInstance()->end(); // BGMを再開する SimpleAudioEngine::getInstance()->playBackgroundMusic("bgm.mp3", true); // 効果音を読み直す SimpleAudioEngine::getInstance()->preloadEffect("effect.mp3"); SimpleAudioEngine::getInstance()->resumeAllEffects(); } public: static cocos2d::Scene* createScene(); virtual bool init(); CREATE_FUNC(HelloWorld); HelloWorld() { // フォアグラウンドの通知オブザーバーを生成 NotificationCenter::getInstance()->addObserver(this, CC_CALLFUNCO_SELECTOR(HelloWorld::enterForeground), "enterForeground", nullptr); } ~HelloWorld() { // フォアグラウンドの通知オブザーバーを削除 NotificationCenter::getInstance()->removeObserver(this, "enterForeground"); } }; #endif // __HELLOWORLD_SCENE_H__ |
HelloWorldScene.cpp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
#include "HelloWorldScene.h" Scene* HelloWorld::createScene() { auto scene = Scene::create(); auto layer = HelloWorld::create(); scene->addChild(layer); return scene; } bool HelloWorld::init() { if ( !Layer::init() ) { return false; } // bgm再生 SimpleAudioEngine::getInstance()->playBackgroundMusic("bgm.mp3"); SimpleAudioEngine::getInstance()->setBackgroundMusicVolume(1.0); // 効果音再生 SimpleAudioEngine::getInstance()->playEffect("effect.mp3"); return true; } |
くまのがっこう神経衰弱バトルを遊んでいただくとわかるのですが、バックグラウンドからフォアグラウンドに復帰したときにBGMが停止してまた最初から再生されるのでちょっとカッコ悪いです。Androidはそんなに気になりませんが、iOSはよくわかります。
もうひとつ、効果音をIDを指定して停止しているところで100回に1回くらいの割合で効果音が停止しないという症状が出ました。いろいろ調べましたが全く原因がわからなかったので、効果音の停止をstopEffect(id)からstopAllEffects()へ変更したところその症状は出なくなりました。効果音が全て停止するので停止したくない効果音と重なっているときは使えない方法です。
1 2 3 4 5 6 7 8 |
// 効果音を再生する int id = SimpleAudioEngine::getInstance()->playEffect("effect.mp3"); // 100回に1回の割合で停止に失敗する SimpleAudioEngine::getInstance()->stopEffect(id); // 必ず停止する SimpleAudioEngine::getInstance()->stopAllEffects(); |
次のゲームではAudioEngineやネイティブでの実装を試してまたここで結果をご紹介したいと思います。