Andengine小ネタ > AndengineでのBGM追加

目次


概要

AndengineでのアプリにBGMを追加します。

BGMの追加

以下の手順で行います。

音声ファイルの用意

フォーマットはoggが良いそうです。
自作するか、素材サイトを探すなどして手に入れて下さい。
素材サイトのものを利用する場合は利用規約を守りましょう。
動画サイトから抜き出しとかはもってのほかです。

で、そのファイルをプロジェクトのassets/mfxフォルダにコピーします。

EngineOptionの設定

Andengineの〇〇GameActivityを継承したアクティビティを作っていると思います。
そのアクティビティのonCreateEngineOptionsで
EngineOptions.getAudioOptions().setNeedsMusic(true)の一文を追加して下さい。
該当箇所はこんな感じ。
@Override
	public EngineOptions onCreateEngineOptions() {
		camera = new Camera(0, 0, CAMERA_WIDTH, CAMERA_HEIGHT);
		EngineOptions engineOptions = new EngineOptions(true,
				ScreenOrientation.PORTRAIT_FIXED, new FillResolutionPolicy(),
				camera);
		//音楽を利用する場合
		engineOptions.getAudioOptions().setNeedsMusic(true);
 
		return engineOptions;
	}
 

音声ファイルの読み込み

アクティビティのonCreateResources内で音声ファイルを読み込みます。該当箇所はこんな感じ。
//フィールド
	private Music mMusic;
 
	//略
 
	@Override
	public void onCreateResources() {
		BitmapTextureAtlasTextureRegionFactory.setAssetBasePath("gfx/");
 
		//画像の読み込み
		//(略)
 
		//音声の読み込み
		MusicFactory.setAssetBasePath("mfx/");
		try {
			this.mMusic = MusicFactory.createMusicFromAsset(this.mEngine.getMusicManager(), this, "bgm.ogg");
			//ループ再生を有効にする
			this.mMusic.setLooping(true);
		} catch (final IOException e) {
			Debug.e(e);
		}
 
	}
 
Andengine公式のMusicExampleとほぼ同じですね。
MusicFactoryで作成したMusicオブジェクトに対してsetLooping(boolean)でループ再生するかどうか設定します。

再生、停止、BGMの切り替え

再生

MusicFactoryで作成したMusicオブジェクトに対してplay()をするとBGMが再生できます。
mMusic.play();

一時停止

Musicオブジェクトに対してpause()をすると一時停止できます。
mMusic.pause();

一時停止したMusicオブジェクトに対してresume()をすると一時停止したところから音声を再開できます。
mMusic.resume();
resume()でなくplay()でも同じ挙動のようです。なんでだろ?

停止

停止は一時停止pause()と再生位置を最初に戻すseekTo(int)の合わせ技で行います。
seekToの引数は開始位置からの経過時間(ミリ秒つまり1000分の1秒)です。
mMusic.pause();
mMusic.seekTo(0);

注意点

Musicクラスにstopという停止機能のメソッドがありますが、これを使うとその後そのMusicオブジェクトが再生できない問題があります。

どうも、Andengineの音声再生機能のベースになっているAndroidのMediaPlayerの仕様のようです。
MediaPlayer機能では、stop()を行った音声オブジェクトはその後prepare()というメソッドを行わないと次回再生できません。
なのにAndengine内ではそのprepare()を実行している部分が無いので、stopがうまく働かないようです。


BGMの切り替え

2つのMusicオブジェクトmusic1とmusic2があるとします。
music1の再生中にmusic2のplay()をすると音声が重なります。
なので、music1からmusic2に切り替えるときはmusic1を止めてからmusic2を再生する必要があります。
music1.pause();
music1.seekTo(0);
music2.play();

ホームボタンや画面オフの時にBGMを止めて復帰時に再生する

このままでは、BGMの再生中にホームボタンを押してホーム画面に戻ったり、電源ボタンで画面をオフにしてもBGMは鳴りっぱなしになります。
アプリが表示されている時だけ音声を再生するようにするには、通常はActivityのライフサイクルというものを考えて
  • ホームボタン
  • ホームボタン押してからの復帰
  • 電源ボタンなどの省電力モード
  • 電源ボタンを押した後のロック画面からの復帰
の時にActivityに何が起こるのかを理解した上で適切な処理を行う必要があります。それぞれ微妙に処理が異なるので通常は面倒です。

ですが、Andengineでは、それらをひとまとめにして「アプリが表示される」「アプリが表示されなくなる」の時に呼ばれるメソッドがあるのでここに、BGMの一時停止、再生の処理を追加すれば簡単です。
「アプリが表示される」ときにはAndengineのアクティビティのonResumeGame()
「アプリが表示されなくなる」ときにはAndengineのアクティビティのonPauseGame()
が呼ばれるので、個々に処理を書きます。
該当箇所はこんな感じ

@Override
	public synchronized void onPauseGame() {
		super.onPauseGame();
		mMusic.pause();
	}
 
	@Override
	public synchronized void onResumeGame() {
		super.onResumeGame();
		mMusic.play();
	}
 

複数のMusicオブジェクトがある場合はonResumeGame()で、再生されていたMusicオブジェクトを残しておくなどの工夫が必要です。

音量の設定

ゲーム内の設定でBGMのオンオフや音量の調整をしたい場合、AndengineのアクティビティのgetMusicManager().setMasterVolume(float)
を行うことで、そのアプリ内のBGMの音量を設定できます。
setMasterVolumeの引数は0から1のfloat実数です。0で完全に消音、1で最大です。

1で最大と言っても、多分オリジナルの音量が1なので、普通に再生する場合は1にすれば良いと思います。

音量の設定を次回起動にも引き継ぎたい場合はSharedPreferenceなどで設定を永続化する必要があります。


合計: -
今日: -
昨日: -
最終更新:2014年09月17日 06:22