FC2ブログ
BS blog Ranking

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

アプリ開発 ブログランキングへ
にほんブログ村 IT技術ブログ Androidアプリ開発へ
にほんブログ村
BS blog Ranking

BGMや効果音を再生するManagerクラスを作るぜ!

今回から2回に渡って、BGMを再生したり効果音を鳴らすManagerクラスの実装と、Managerを使用するためのBaseActivityの実装を行います。

構想としては、ManagerクラスをBaseActivityでスタティッククラスとしてインスタンス生成を行い、例えば、画面を遷移してもBGMが途切れることのないロジックを考えています。
各画面のActivityでは、BaseActivityを継承して使用することになります。

では、Managerクラスから取り掛かります。

AndroidではMediaPlayerというクラスが用意されています。このクラスを使ってBGMや効果音を再生することができます。

まずコンストラクタで使用する音楽をMapに取り込みましょう。ちなみにMapはプライベート変数です。

/**
* コンストラクタ
*
* @param context コンテキスト
*/
public SoundManager(Context context) {

  mSoundMap = new HashMap();

  // BGM
  mSoundMap.put("bgm_top", MediaPlayer.create(context, R.raw.bgm_top));
  mSoundMap.put("bgm_game", MediaPlayer.create(context, R.raw.bgm_game));

  // 効果音
  mSoundMap.put("se_touch", MediaPlayer.create(context, R.raw.se_touch));
  mSoundMap.put("se_card", MediaPlayer.create(context, R.raw.se_card));
  mSoundMap.put("se_win", MediaPlayer.create(context, R.raw.se_win));
  mSoundMap.put("se_lose", MediaPlayer.create(context, R.raw.se_lose));
}

次にBGMを再生するメソッドです。こちらは引数にBGMの名前を指定して再生する仕組みです。
setLooping(boolean)によりループさせるか、start()で再生、setVolume(float, float)でボリュームを調整しています。
最後のsoundNameを代入しているmPlayBgmはプライベート変数で、画面遷移時に再生しているBGMの名前を保持するためのものです。

/**
* BGMを再生する
*
* @param soundName サウンド名
*/
public void startSoundBgm(String soundName) {

  stopAllSoundExceptOne(soundName);
  for (String key : mSoundMap.keySet()) {
    if (key.equals(soundName)) {
      mSoundMap.get(key).setLooping(true);
      mSoundMap.get(key).start();
      mSoundMap.get(key).setVolume(0.7F, 0.7F);
      mPlayBgm = soundName;
    }
  }
}

効果音も同様です。

/**
* 効果音を鳴らす
*
* @param soundName サウンド名
*/
public void startSoundEffect(String soundName) {

  for (String key : mSoundMap.keySet()) {
    if (key.equals(soundName)) {
      mSoundMap.get(key).setLooping(false);
      mSoundMap.get(key).start();
    }
  }
}

次にインスタンス解放のメソッドも用意しておきます。
Androidアプリではメモリリーク防止のためにも、使わなくなったインスタンスを解放する必要があります。
引数でサウンド名を指定することもできますし、nullを引数で渡してやると、全てのサウンドのインスタンスを解放する仕組みです。

/**
* MediaPlayerのインスタンスを解放する
*
* @param soundName サウンド名
*/
public void releaseInstance(String soundName) {

  for (String key : mSoundMap.keySet()) {
    if (soundName != null) {
      if (key.equals(soundName)) {
        MediaPlayer mediaPlayer = mSoundMap.get(key);
        mediaPlayer.reset();
        mediaPlayer.release();
        mediaPlayer = null;
      }
    } else {
      MediaPlayer mediaPlayer = mSoundMap.get(key);
      mediaPlayer.reset();
      mediaPlayer.release();
      mediaPlayer = null;
    }
  }
}

どんどんいきましょう。BGMの一時停止メソッドです。

/**
* BGMを一時停止する
*
* @param soundName サウンド名
*/
public void pauseSoundBgm(String soundName) {

  for (String key : mSoundMap.keySet()) {
    if (key.equals(soundName)) {
      mSoundMap.get(key).pause();
    }
  }
}

startSoundBgm(String)でセットしたプライベート変数mPlayBgmのGetterです。

/**
* 再生中のBGM名を取得する
*
* @return
*/
public String getPlayBgm() {
  return mPlayBgm;
}

画面遷移した際のフラグもプライベート変数として定義しておきます。
そのGetter/Setterです。

/**
* 画面遷移フラグを取得する
*
* @return
*/
public boolean isChangeScreenFlag() {
  return mChangeScreenFlag;
}

/**
* 画面遷移フラグを設定する
*
* @param changeScreenFlag
*/
public void setChangeScreenFlag(boolean changeScreenFlag) {
  mChangeScreenFlag = changeScreenFlag;
}

最後に、startSoundBgm(String)で呼び出しているプライベートメソッドです。
今回のアプリでは、どの画面でもBGMが再生される仕様となりますので、全サウンド停止処理の実装は行いません・・・現時点では。

/**
* 指定されたサウンドを除いた全てのサウンドを停止する
*
* @param soundName サウンド名
*/
private void stopAllSoundExceptOne(String soundName) {

  for (String key : mSoundMap.keySet()) {
    if (!key.equals(soundName)) {
      mSoundMap.get(key).stop();
    }
  }
}

SoundManagerは以上です。
次回はSoundManagerのインスタンスを生成するBaseActivityクラスの実装を行います。
スポンサーサイト

アプリ開発 ブログランキングへ
にほんブログ村 IT技術ブログ Androidアプリ開発へ
にほんブログ村

コメントの投稿

非公開コメント

承認待ちコメント

このコメントは管理者の承認待ちです

承認待ちコメント

このコメントは管理者の承認待ちです

承認待ちコメント

このコメントは管理者の承認待ちです

承認待ちコメント

このコメントは管理者の承認待ちです

承認待ちコメント

このコメントは管理者の承認待ちです
プロフィール

samahiko

Author:samahiko
Androidアプリ開発の備忘録へようこそ!
開発環境→仕様→コーディング→ローンチという流れをリアルタイムで記録していきますので応援よろしくです!

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。