cocos2d-x サウンド・音を鳴らす
2017/10/25
サウンド・音を鳴らします。
サウンドにはBGMとEFFECTがあります。
BGMはバックで流れている音楽。
EFFECTはボタンを押したときにでる音。
くらいに考えておけば良いと思います。
androidの場合はwavファイルで鳴らします。
iPhoneの場合はm4aファイルで鳴らします。
mp3ファイルだとどちらも鳴らせるようです。
サウンドを鳴らすための流れです。
●SimpleAudioEngine.hをinclude
#include "SimpleAudioEngine.h"
●サウンドをプリロードする。
// BGMの場合 SimpleAudioEngine::sharedEngine() ->preloadBackgroundMusic(SOUND_BGM); // EFFECTの場合 SimpleAudioEngine::sharedEngine() ->preloadEffect(SOUND_EFFECT);
●サウンドを鳴らす。
// 第二引数はループ再生する(true)かしない(false)か // BGMの場合 SimpleAudioEngine::sharedEngine() ->playBackgroundMusic(SOUND_BGM,true); // EFFECTの場合 SimpleAudioEngine::sharedEngine() ->playEffect(SOUND_BGM,true);
●サウンドを止める。
// BGMの場合 SimpleAudioEngine::sharedEngine() ->stopBackgroundMusic(true); // EFFECTの場合 SimpleAudioEngine::sharedEngine() ->stopEffect(true);
●サウンド一時停止
stopBackgroundMusicよりも早くサウンドを再開することができます。
// BGMの場合 SimpleAudioEngine::sharedEngine() ->pauseBackgroundMusic(); // EFFECTの場合 SimpleAudioEngine::sharedEngine() ->pauseEffect();
●サウンドの再開
// BGMの場合 SimpleAudioEngine::sharedEngine() ->resumeBackgroundMusic(); // EFFECTの場合 SimpleAudioEngine::sharedEngine() ->resumeEffect();
●サウンドの再生位置を先頭に戻す
// BGMの場合 SimpleAudioEngine::sharedEngine() ->rewindBackgroundMusic();
●音量を変更する
// BGMの場合 SimpleAudioEngine::sharedEngine() ->setBackgroundMusicVolume(0.5); // EFFECTの場合 SimpleAudioEngine::sharedEngine() ->setEffectsVolume(0.5);
●音のOn/Offをタイトル画面でボタンで制御する場合の例
TilteScene.cpp
// TilteScene.cpp // 音を出すにはSimpleAudioEngine.hをincludeしておきます。 #include "SimpleAudioEngine.h" // 音を出すファイルを定義しておくと良いです。 #define SOUND_BGM "bgm.wav" #define SOUND_EFFECT "efect.wav" // SimpleAudioEngine用にこれも。 using namespace CocosDenshion; bool TitleScene::init() { bool bRet = false; do { //~省略~ // まずBGMのプリロードをしておきます。 SimpleAudioEngine::sharedEngine() ->setBackgroundMusicVolume(0.5); SimpleAudioEngine::sharedEngine() ->preloadBackgroundMusic(SOUND_BGM); // 効果音のプリロードもしておきます。 SimpleAudioEngine::sharedEngine() ->setEffectsVolume(0.5); SimpleAudioEngine::sharedEngine() ->preloadEffect(SOUND_EFFECT); // サウンドのOn/Offは内部に // 保存しておくと良いと思います。 // 自分はそうしたので、 // とりあえずOn/Offどちらになっているかを抽出 musicOnOff = CCUserDefault::sharedUserDefault() ->getIntegerForKey("musicOnOff", 0); // サウンドの設定がOnになっている場合 if(musicOnOff==0){ // 実際にBGMを再生します。 // 第二引数はループ再生する場合はture。 // ループ再生しない場合はfalse。 SimpleAudioEngine::sharedEngine() ->playBackgroundMusic(SOUND_BGM,true); } // ボタンの実装方法は // 「cocos2d-x ボタンを設置する」の記事を参照。 // ●音符ONボタンを実装 MenuItemImage *onpuonItem = MenuItemImage::create( "btnonpuon.png", "btnonpuonaft.png", CC_CALLBACK_1 (TitleScene::menuOnpuOnCallback,this)); CC_BREAK_IF(! onpuonItem); onpuonItem->setPosition( Point(origin.x + visibleSize.width/4 , origin.y + visibleSize.height/2)); menuOnpuOn = Menu::create(onpuonItem, NULL); menuOnpuOn->setPosition(Point::ZERO); CC_BREAK_IF(! menuOnpuOn); this->addChild(menuOnpuOn, 1); // サウンドOffの設定の場合 // サウンドOnボタンはタイトルで見せない。 if(musicOnOff==1){ menuOnpuOn->setVisible(false); menuOnpuOn->setEnabled(false); } // ●音符OFFボタンを実装 MenuItemImage *onpuoffItem = MenuItemImage::create( "btnonpuoff.png", "btnonpuoffaft.png", CC_CALLBACK_1 (TitleScene::menuOnpuOffCallback,this)); CC_BREAK_IF(! onpuoffItem); onpuoffItem->setPosition( Point(origin.x + visibleSize.width/4 , origin.y + visibleSize.height/2)); menuOnpuOff = Menu::create(onpuoffItem, NULL); menuOnpuOff->setPosition(Point::ZERO); CC_BREAK_IF(! menuOnpuOff); this->addChild(menuOnpuOff, 1); // サウンドOnの設定の場合 // サウンドOffボタンはタイトルで見せない。 if(musicOnOff==0){ menuOnpuOff->setVisible(false); menuOnpuOff->setEnabled(false); } //~省略~ bRet = true; } while (0); return bRet; } // サウンドOnボタン押下時の処理 void TitleScene::menuOnpuOnCallback(Object* sender) { // サウンドを止める SimpleAudioEngine::sharedEngine() ->stopBackgroundMusic(true); // サウンドOn/Offの設定を保存 musicOnOff = 1; CCUserDefault::sharedUserDefault() ->setIntegerForKey("musicOnOff", musicOnOff); CCUserDefault::sharedUserDefault()->flush(); // タイトルではOnボタンを隠してOffボタンを見せる。 menuOnpuOn->setVisible(false); menuOnpuOn->setEnabled(false); menuOnpuOff->setVisible(true); menuOnpuOff->setEnabled(true); } // サウンドOffボタン押下時の処理 void TitleScene::menuOnpuOffCallback(Object* sender) { // サウンドを再生する SimpleAudioEngine::sharedEngine() ->playBackgroundMusic(SOUND_BGM,true); // サウンドOn/Offの設定を保存 musicOnOff = 0; CCUserDefault::sharedUserDefault() ->setIntegerForKey("musicOnOff", musicOnOff); CCUserDefault::sharedUserDefault()->flush(); // タイトルではOnボタンを見せてOffボタンを隠す。 menuOnpuOn->setVisible(true); menuOnpuOn->setEnabled(true); menuOnpuOff->setVisible(false); menuOnpuOff->setEnabled(false); }
●アプリがバックグラウンドに回ったときやアプリ起動中に電話がかかってきた場合などにサウンドのOn/Offを切り替える場合の例
これはcocos2d-xの標準である、AppDelegate.cppに記載があるので、それを利用します。ほぼそのままです。
AppDelegate.cpp
// AppDelegate.cpp // 音を出すにはSimpleAudioEngine.hをincludeしておきます。 #include "SimpleAudioEngine.h" // SimpleAudioEngine用にこれも。 using namespace CocosDenshion; // アプリが非アクティブになったら呼ばれる。 // 電話がかかってきたなども同様。 void AppDelegate::applicationDidEnterBackground() { // if you use SimpleAudioEngine, it must be pause CocosDenshion::SimpleAudioEngine::sharedEngine() ->pauseBackgroundMusic(); } // アプリが再度アクティブになったら呼ばれる。 void AppDelegate::applicationWillEnterForeground() { // if you use SimpleAudioEngine, it must resume here CocosDenshion::SimpleAudioEngine::sharedEngine() ->resumeBackgroundMusic(); }