Android携帯ゲームを作って世界に配信してみよう(3) ―― 効果音の入れ方とデータの保存処理を学ぶ
●ファイルの読み書きの使用例:ハイスコアの保存と読み込み
それでは,実際の使用例として,今回のゲームにおけるハイスコアの保存(書き込み)と読み込みについて説明します.まず書き込みですが,ハイスコアを達成すると,プレイ記録を管理する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サイトのフリー音源を利用させていただいています.
- BGM(タイトル画面):.::Smooth::.(bgm_title.mp3,作:calpomatt)
- BGM(ゲーム中画面):* Sexy House - 01 *(bgm_play.mp3,作:DJ Atari)
- バウンド音,壁への衝突音:Free Basketball Bounce wav download from www.sfxsource.com(sfx_bounce1.mp3,sfx_bounce2.mp3,作:www.sfxsource.com)
※こちらはファイルを分割して二つの効果音に分解しています. - タップ音:Mouse Click - Slow(sfx_touch.mp3,作:MBD123)
やまだ・もとやす
スパイシーソフト(株) 代表取締役
※本記事の補足情報として,「番外編 Androidアプリのライフサイクル」を掲載しています.