いちおくまんえん

最近はcocos2d-xでゲームアプリ「いちおくまんえん」の制作がメインです。 あとアニメも少々・・

タイトル画面作成② 遷移してきた後にBGMを再生

タイトル画面作成①でTransitionFadeを使ってスプラッシュ→タイトルへと遷移させるまでは出来ました。

やはりゲームには音がないと面白みに欠けますよね。

なのでタイトル画面以降は何かしらのBGMを再生させようと思います。

cocos2d-xの音声周りを担当するのがSimpleAudioEngineとか、CocosDenshionとかいうやつになります。

BGMを再生したい時は以下のような感じで

#include "SimpleAudioEngine.h"

// CocosDenshion::を書くのが面倒な人用
using namespace CocosDenshion;

// BGMのプリロード
SimpleAudioEngine::getInstance()->preloadBackgroundMusic(BGM_TITLE);
// BGMのリピート再生 第二引数がリピートフラグです
SimpleAudioEngine::getInstance()->playBackgroundMusic(BGM_TITLE, true);

そして注意して欲しいのが、BGMとかを鳴らしたはいいけど止める処理を書いてないってことです。
何が問題かと言うと、ホームボタンとかを押してアプリが裏に回ったとしてもBGMが鳴り続けるってことです。
音楽再生プレイヤー的な意味で鳴り続けさせたいなら別ですが、普通のゲームを作るなら、裏に回った時に止まって、戻ってきた時に再開して欲しいですよね。

私の作る「いちおくまんえん」ではそういう仕様で作成したいのでそのように実装します。

そこでcocos2d-xには簡単に設定できるようになっています。
デフォルトで作成されたAppDelegateにコメントアウトされた状態で既にあるんです。
なので、実質コメントアウト外すだけで完了しちゃいます(o´・∀・`o)らくちん
コメントが英語で分かりづらいのでなんとなくの日本語に置き換えてます。

AppDelegate.cpp

// ホームボタン押されたりでアプリが裏に回る時に呼ばれる
void AppDelegate::applicationDidEnterBackground() {
    Director::getInstance()->stopAnimation();
    // BGM・SE一時停止
    SimpleAudioEngine::getInstance()->pauseBackgroundMusic();
    SimpleAudioEngine::getInstance()->pauseAllEffects();
}

// アプリが再開された時に呼ばれる
void AppDelegate::applicationWillEnterForeground() {
    Director::getInstance()->startAnimation();
    // BGM・SE再開
    SimpleAudioEngine::getInstance()->resumeBackgroundMusic();
    SimpleAudioEngine::getInstance()->resumeAllEffects();
}

最初から用意してくれてるのはBGMだけなので、SEも足してます。
SEを使わないならSE部分は不要ですよ(´・ω・`)

というわけでBGMの鳴らし方は以上です。


しかし!まだ問題が色々とあります。

私の場合はシーンの切り替えにTransitionFadeを使っているので、演出する時間を考慮してBGMを鳴らすタイミングを想定にいれなければなりませんでした。

なのでこんな感じで実装してみました。

// BGM再生(シーン切り替え時間分遅らせる) ※init()内でやってます
this->scheduleOnce(schedule_selector(TitleScene::playBGM), 0.5f);

void TitleScene::playBGM(float milliSecond)
{
    CCLOG("playBGM delay time: %4.4f ms", milliSecond);
    SimpleAudioEngine::getInstance()->playBackgroundMusic(BGM_TITLE, true);
}

一応これでiPhoneは想定通り動いてくれました。

ではAndroid


・・・。

おい、鳴らないぞ(; ・`д・´)

音量とかマナーとかそういうことかとか思ったけど違う!


色々と見てみたらCocosDenshion入ってないぞ!
create-multi-platform-projects.pyさんどうなってるんですか!
JavaScriptで開発しないからscriptingなんていらないものを排除して、CocosDenshionをかわりに取り入れました。
すると無事にBGMが再生されました。ε-(´∀`*)ホッ

今回のコミットログ貼っておくので詳細はそちらで確認して下さい。
https://github.com/yasuhiro-matsuda/ichi_okuman_yen/commit/ee6745e04a2da5c4b8c77f0f5eb171ff8048ccab

名前空間入れたのと混じってるので多少ノイズまじりです(;´∀`)

そして重大なお知らせ。

CocosDenshionを取り入れたAndroid君なんですが、アプリが裏に回った時はちゃんと音を止めてくれました。

えぇ、止めてくれました。

しかし、再開時には仕事をしてくれません\(^o^)/

AndroidのSimpleAudioEngine周りがversion3系でごっそり置き換わってる模様で、バグ埋め込まれてしまったのかもしれないですね。
すごい気になるので調査しようかと思っているんですが、開発を進めたい!
alphaが取れた頃には治ってることを期待して見なかったことに!

でもどんな実装になっているのかは興味あるのでチラッと覗くだけ覗いてみようかな・・。
抜け出せなくなりそうでこわいな(・ω・`)