Android携帯ゲームを作って世界に配信してみよう(3) ―― 効果音の入れ方とデータの保存処理を学ぶ

山田 元康

tag: 組み込み

エレキ系DIY 2011年12月 7日

●ファイルの読み書きの使用例:ハイスコアの保存と読み込み

 それでは,実際の使用例として,今回のゲームにおけるハイスコアの保存(書き込み)と読み込みについて説明します.まず書き込みですが,ハイスコアを達成すると,プレイ記録を管理するPlayLogクラスのsaveメソッドを呼び出します(リスト8).このメソッド内で,Activityクラスの基底クラスであるContextクラスのopenFileOutputメソッドを使い,書き込み用にファイルを開きます.

 

リスト8 ハイスコアを書き込む(PlayLog.javaより抜粋)

  public static void save()
  {
    try {
      final FileOutputStream fos = context.openFileOutput(FILENAME_PLAYLOG, Context.MODE_PRIVATE);
      final DataOutputStream dos = new DataOutputStream(fos);
      dos.writeInt(bestScore);
      dos.writeUTF(DateFormat.getDateInstance().format(bestPlayedAt));
      dos.flush();
      fos.close();
    } catch (IOException e) {
      Log.e("Dribble", "PlayLog.save: bestScore=" + bestScore + ",bestPlayedAt=" + bestPlayedAt, e);
    }
  }

 

 ハイスコアのドリブル回数を表すInt型の値と,ハイスコアを記録した日時を表すDate型の値を書き込むために,DataOutputStreamというクラスを利用して,Java内部のInt型やString型をバイナリ型に変換します.そして,FileOutputStreamにそのバイナリ・データを書き込みます.なお,Date型を直接書き込むメソッドは用意されていないので,まず文字列に変換して,その後その文字列を書き込んでいます.

 次に,ファイルの読み込みですが,アプリを起動したタイミングでの初期化中に,PlayLogクラスのloadメソッドを呼び出し,過去のハイスコア・データを読み込みます(リスト9).以降のプレイ中は,メモリ内に最新のハイスコア・データを持っているので,読み込みは行いません.loadメソッド内では,Activityクラスの基底クラスであるContextクラスのopenFileInputメソッドを呼び出し,読み込み用にファイルを開きます.ファイルが存在しない場合は,FileNotFoundException例外が発生します.

 

リスト9 ハイスコアを読み込む(PlayLog.javaより抜粋)

  public static void load()
  {
    FileInputStream fis;
    try {
      fis = context.openFileInput(FILENAME_PLAYLOG);

    } catch(final FileNotFoundException e) {
      :
      return;
    }
   
    int tempLastScore;
    Date tempLastScorePlayed;
    try {
      final DataInputStream dis = new DataInputStream(fis);
      tempLastScore = dis.readInt();
      tempLastScorePlayed = DateFormat.getDateInstance().parse(dis.readUTF());
      fis.close();
    } catch(final Exception e) {
    :
      return;
    }
    bestScore = tempLastScore;
    bestPlayedAt = tempLastScorePlayed;
  }
}

 

 openFileInputメソッドで返されるFileInputStreamでは,1バイト単位の読み込み,もしくは,バイト単位でデータを一括読み込みすることしかできず,Javaの型に対応した読み込みはできません.Javaの型に対応した読み込みをするためには,書き込みのときと似たようなやり方ですが,DataInputStreamという,バイナリをJavaの型に変換しながら読み込むクラスを使います.今回のプログラムでは,readIntやreadUTFといった,Int型,文字列型の読み込み用メソッドを使って,必要なデータを読み込んでいます.Date型のデータを読み込む機能はないので,いったん文字列を読み込み,文字列をDate型に変換するという処理を行っています.

 

*     *     *

 

 今回は,音声の再生や,データの読み込み・保存について紹介しました.これで,Androidアプリでゲームを作るにあたって最低限必要な,ゲームの基本的な処理と,画像の表示,音声の再生やタッチの処理をマスタしたことになります.次回は,スマートフォンらしく,インターネットと連携させたアプリを作ってみます.

 なお,今回のゲームで利用したBGM(タイトル画面,ゲーム中画面)と効果音素材(ボールのバウンド音,壁への衝突音,タップ音)は,「Flash Kit」というWebサイトのフリー音源を利用させていただいています.

 

やまだ・もとやす
スパイシーソフト(株) 代表取締役

 

※本記事の補足情報として,「番外編 Androidアプリのライフサイクル」を掲載しています.

 

 

組み込みキャッチアップ

お知らせ 一覧を見る

電子書籍の最新刊! FPGAマガジン No.12『ARMコアFPGA×Linux初体験』好評発売中

FPGAマガジン No.11『性能UP! アルゴリズム×手仕上げHDL』好評発売中! PDF版もあります

PICK UP用語

EV(電気自動車)

関連記事

EnOcean

関連記事

Android

関連記事

ニュース 一覧を見る
Tech Villageブログ

渡辺のぼるのロボコン・プロモータ日記

2年ぶりのブログ更新w

2016年10月 9日

Hamana Project

Hamana-8最終打ち上げ報告(その2)

2012年6月26日