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アプリ開発へ
にほんブログ村
BS blog Ranking

Bitmapを端末の画面サイズに合わせてリサイズするぜ!

今回よりガシガシ、コーディングを行っていきます。
まずは共通処理から。

Androidでは端末ごとに画面サイズと解像度が異なります。
そのため、画像の表示は一つのバイナリで対応させる必要があります。

画面レイアウトを定義するXMLファイルにdip指定でサイズを指定することもできますが、今回はプログラムで動的に画像の大きさを変更することにします。
ちなみにdipという単位は〝端末に依存しないピクセル〟です。具体的には160dpi(解像度)の1ピクセルの物理的な大きさを1dipと定義しています。つまり、320dpiのディスプレイを持つ端末では、1dip=2ピクセルという計算になります。

ではまず、端末のディスプレイ情報を格納しておくコンテナであるDTOを用意します。
ここではDisplayDtoとしました。定義する変数は以下となります。

/** density */
private float density;

/** densityDpi */
private int densityDpi;

/** scaledDensity 1pxに対する1dpの倍率 */
private float scaledDensity;

/** widthPixels 幅 */
private int widthPixels;

/** heightPixels 高さ */
private int heightPixels;

/** xdpi */
private float xdpi;

/** ydpi */
private float ydpi;

もちろんGetter/Setterの用意もお願いします。

次にUtilityクラスに端末のディスプレイ情報を取得するメソッドを用意します。

/**
* ディスプレイDTOを取得する
*
* @param displayMetrics
* @return displayDto ディスプレイDTO
*/

public static final DisplayDto getDisplayDto(DisplayMetrics displayMetrics) {

  DisplayDto displayDto = new DisplayDto();
  displayDto.setDensity(displayMetrics.density);
  displayDto.setDensityDpi(displayMetrics.densityDpi);
  displayDto.setScaledDensity(displayMetrics.scaledDensity);
  displayDto.setWidthPixels(displayMetrics.widthPixels);
  displayDto.setHeightPixels(displayMetrics.heightPixels);
  displayDto.setXdpi(displayMetrics.xdpi);
  displayDto.setYdpi(displayMetrics.ydpi);
  return displayDto;
}

最後にディスプレイ情報を格納したDTOを引数に持つ、動的に画像の大きさを変更するメソッドを用意します。
こちらもUtilityクラスです。

/**
* Bitmapを端末の画面サイズに合わせてリサイズする
*
* @param src 元画像
* @param displayDto
* @return dst リサイズした画像
*/

public static final Bitmap resizeBitmap(Bitmap src, DisplayDto displayDto) {

  // 画面サイズを取得
  float displayWidth = displayDto.getWidthPixels();
  float displayHeight = displayDto.getHeightPixels();

  // 拡大比率
  float widthScale = displayWidth / Const.DISPLAY_WIDTH;
  float heightScale = displayHeight / Const.DISPLAY_HEIGHT;
  // 比率をMatrixに設定
  Matrix matrix = new Matrix();
  matrix.postScale(widthScale, heightScale);

  int srcWidth = src.getWidth();   // 元画像の幅
  int srcHeight = src.getHeight();  // 元画像の高さ

  // リサイズ
  Bitmap dst = Bitmap.createBitmap(
      src, 0, 0, srcWidth, srcHeight, matrix, true);
  src = null;
  return dst;
}

DISPLAY_WIDTHとDISPLAY_HEIGHTですが、こちらはConstクラスに定義している定数となります。
画像はすべて480×854をベースとしますので、DISPLAY_WIDTH=480、DISPLAY_HEIGHT=854となります。

コメントに書いてある通りですが、処理の流れとしては、端末の画面サイズをベースとなる画面サイズで割り、拡大比率を出しています。そこから元画像のリサイズ処理をMatrixクラスを用いて行っています。
最終的に書き出されたBitmapであるdstを返し、元画像のBitmapであるsrcはメモリリーク防止のため、nullを代入しておきます。

以上で、元画像であるBitmapとディスプレイDTOを渡してやれば、リサイズされたBitmapが返ってくるメソッドの完成です!

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

プロジェクトを作成するぜ!

コーディングを行うため、ADTでプロジェクトを作成しましょう。

Eclipseを開いて、メニューから[新規]→[プロジェクト]をクリック。
続いてAndroidフォルダから[Android アプリケーション・プロジェクト]を選択しましょう。

アプリケーション名:7yaniv
プロジェクト名:7yaniv
パッケージ名:com.samahiko.yaniv
最小必須 SDK:API 8: Android 2.2(Froyo)
ターゲット SDK:API 13: Android 3.2(Honeycomb)
次でコンパイル:API 13: Android 3.2(Honeycomb)
テーマ:None
上記内容を入力したら[次へ]をクリック。

[カスタム・ランチャー・アイコンを作成する][アクティビティーの作成][ワークスペース内にプロジェクトを作成]にチェックを入れ、[次へ]をクリック。

ランチャー・アイコンの構成はご自由に。
アクティビティーの作成は「Blank Activity」を選択しておきましょう。

アクティビティー名:TopActivity
レイアウト名:activity_main
ナビゲーション・タイプ:None
上記内容を入力したら[完了]をクリック。

以上でプロジェクトは作成されます。

注意する点は2箇所です。

まずSDKのバージョンですが、今回のアプリはAndroid 2.2までサポートしています。
古いバージョンをサポートしない場合でも、「ターゲット SDK」をAndroid 4.0以降、「最小必須 SDK」をAndroid 2.3.3以前にしてしまうと、Android 4.0以上のバージョンでメニューにアクセスできなくなる不具合が発生します。古い端末にも対応させるため、「ターゲット SDK」は必ずAndroid 3.2にしておきましょう。

次にアクティビティー名です。デフォルトでは「MainActivity」となっていますが、トップページのActivityクラスを指すことになりますので、「TopActivity」としておきます。
尚、レイアウト名の「activity_main」は削除しますので、そのままで構いません。

さて、作成されたプロジェクトのファイル構成を見てみましょう。

プロジェクトのファイル構成

まず「src」ですが、ここにメインロジックとなるソースコードが入ります。
具体的にはActivityやViewといったクラスとなります。

srcのファイル構成

画像ではクラス別にパッケージを追加して分けています。
デフォルトではプロジェクト作成時に指定したパッケージ名である「com.samahiko.yaniv」の直下に「TopActivity.java」が入っています。
このActivityクラスがアプリ起動時にメインとして最初に表示される画面のActivityクラスとなります。
ちなみにAndroidでは基本的に、1つのActivityクラスが1枚の画面を扱っています。

次に「res」ですが、ここにはアプリで使用する画像や画面を構成するXMLファイルが入ります。

resのファイル構成

「drawable-●●」というフォルダがあります。
こちらは端末の解像度に応じて表示する画像を切り替えるためのフォルダとなっているのですが、 ローンチする際、APKとしてアップロードできる最大サイズが50MBまでですので、アプリの容量を抑えるためにも今回は「drawable-hdpi」フォルダに全ての画像を入れることにします。

また、今回のアプリ開発では、画面レイアウトを定義するXMLファイルを作成しませんので、「layout」フォルダ内の「activity_main.java」は削除しておきましょう。

最後に「AndroidManifest.xml」というファイルですが、こちらはアプリの設定ファイルとなっています。

ちなみにAndEngineのフレームワークですが、こちらは今回使用しない方向で考えています。
どうしても使用したい場合は、メニューから[プロパティー]をクリックして、左ペインから[Android]を選択、ライブラリーにAndEngineプロジェクトを追加してください。使用しませんが。

さて、次回は共通処理として、UtilityやManagerの実装から行っていきます。

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

アプリの仕様を固めるぜ!

プロジェクトを作成する前に仕様をきっちり固めておきましょう。

今回開発するアプリはゲームにします。ジャンルはテーブル(トランプ)ゲームです。
複数人プレイのゲームで、1人プレイは設けません!
売りを強調したいので、あえてです!

■タイトル
『7抜けヤニブ』

■ルール
トランプで遊ぶゲーム。
ジョーカーを除いた52枚を使用する。
エースは1ポイント、2は2ポイント……、10~キングはすべて10ポイント。
手札の合計が7以下になれば「ヤニブ」と言ってゲームから抜ける。最終的に残った1人が敗者。

まずはじめに1人5枚ずつカードを配る。
全員に配り終えたら、余ったカードを山札として中央に置き、上から1枚だけめくって、山札の隣に置く。これが捨て札となる。

プレイヤーはまず手札からカードを捨てる。捨て札は次のいずれか。
①1枚のカード。どれでも。
②同じランクの2枚以上のカード。(キングを2枚、2を3枚など)
③同じスートの3枚以上の続き札(ダイヤの8-9-10など)エースはA-2-3のようにしか使えず、Q-K-Aのようには使えない。順番どおりに捨てなければならない。

次にカードを1枚取る。カードを何枚捨てても取るのは1枚だけ。取れるカードは次のいずれか。
①山札の一番上のカード
②直前のプレイヤーが捨てたカードの1枚。2枚以上捨てていた場合、その内の一番上のカードか一番下のカードを取ることができる。

■画面
・タイトル画面
・ルール画面
・設定画面
 →2人から5人までのプレーヤー人数の選択、罰ゲームON/OFF機能、制限時間ON/OFF機能
・ゲーム画面

■売り
デートでちょっとしたゲームをしたいとき、みんなでワイワイしたいときに最適です。
簡単なルールで、すぐに覚えられるので、みんなの注目の的になることでしょう。
居酒屋やバーなど、お酒を飲む場で、負けたら罰ゲームといった感覚で遊ぶのがベストです。
2人はもちろん、5人まで一緒に遊ぶことができます。

イスラエル発祥のゲームです。本来はポイントにより勝敗を決めますが、シンプル且つ早いゲーム展開にしたかったため、「7抜け」という独自のルールにしています。

罰ゲームは何が出るかわからないので、絶対負けないようにしましょう。

以上!

仕様書は大事です。チームはもちろん、個人での開発においても、方向性を間違えることのないよう、きっちり固める必要があります。
ただ、完璧な仕様書を用意する必要はありません。今回のようなアプリ開発において大事なことは、「モノを上げる」ことだからです。

そうそう、言い忘れてましたが、今回のアプリはネイティブアプリにします。サーバは一切使用しませんので。ネットワーク接続があるとしたらAD広告くらいでしょうか。

次回はプロジェクトを作成して、本格的にコーディングに移ります。

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

まずは開発環境だぜ!

さてさて、本日よりAndroidアプリの開発過程における備忘録として、その手順を記録していこうと思います。
まずは、Androidアプリの開発環境。

開発言語はJavaなので、最新のJDKをダウンロード・インストールして、パスを通しておきます。

基本的にエディターはEclipseを使用します。Androidアプリ開発における参考書でもお馴染みのIDEです。
Pleiadesのサイトから最新のEclipse(Standard Edition)をダウンロードします。

Eclipseを開いたら今度はADTのインストールを行います。
メニューから[ヘルプ]→[新規ソフトウェアのインストール]をクリックします。
作業対象に「http://dl-ssl.google.com/android/eclipse/」と入力し[追加]をクリック。
リポジトリーの追加画面が表示されたら、名前は空欄のままでも良いので[OK]をクリック。
表示される[開発ツール]にチェックを入れてインストールします。

最後にAndroid SDKをインストールします。
Android SDKのサイトからSDKをダウンロードしたら任意の場所に解凍しておきます。
Eclipseの設定画面を開き、左ペインから[Android]を選択、[SDKロケーション]に解凍したフォルダを設定します。
SDK Managerを開くよう促されますので、指示通り開いて、Android2.2(APIレベル8)以降全てにチェックを入れ、ダウンロードしてください。

テスト端末はAVDを使用せず、実機(REGZA、Android2.3.4)で行うこととします。

ついでにAndEngineというゲームエンジン(Javaのライブラリ)の利用準備もしておきましょう。
AndEngineはAndroidの2Dゲームに特化したエンジンで、簡単・便利・無料の3拍子が揃ったフレームワークです。
まず、AndEngineのサイトから最新のプロジェクトをダウンロード・解凍します。
Eclipseを開いて、メニューから[ファイル]→[インポート]をクリック、解凍した最新のAndEngineプロジェクトをインポート([プロジェクトをワークスペースにコピー]にチェックを入れておく)します。

※コンソールに下記エラーログが表示される場合
Android requires compiler compliance level 5.0 or 6.0. Found '1.4' instead. Please use Android Tools > Fix Project Properties.
指示通り[Android ツール]→[プロジェクト・プロパティーを修正]をクリックします。

以上で開発環境は整いました。
次回はプロジェクトの作成…の前にアプリの仕様を固めることにします。

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

samahiko

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

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

この人とブロともになる

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