ピエールの日記 by pierre 長尾和美

ピエールです。SamuraiTraditional(サムトラ)、たけしを(逸見泰典とのユニット)でギターやってます♪思いつきをブログに! ^^v by pierre

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();
}

 - cocos2d-x, アプリ ,