|
|
第8回の今回は、端末へのデータ保存について解説します。前回作成した弾幕避けゲームにハイスコア保存機能を追加します。ゲーム画面の左上にハイスコアを表示します。
[サンプルプログラムのダウンロード]

プログラムは、次の2つのクラスで構成されています。
- DanmakuGameクラス(DanmakuGameEx.java)
- DanmakuCanvasクラス(DanmakuCanvas.java)
プロジェクト名「DanmakuGame2」とクラス名「DanmakuGame」でプロジェクトを作成してください。
▼レコードストアとレコード
「レコードストア」とは、オープンアプリ(Java)のデータ保存領域のことです。レコードストアの領域はアプリごとに用意されており、他のアプリのレコードストアを参照することも可能です。また、レコードストアは複数の「レコード」で構成されており、各レコードは「レコードID」を持ち、これによりレコードの識別を行います。
レコードストアを操作するには「javax.microedition.rms.RecordStore」クラスを使い、
- レコードストアの接続
- レコードの書き込み・読み込み
- レコードストアの切断
の順に処理を行います。
▼レコードストアの書き込み
DanmakuCanvasクラスに追加したレコードストアの書き込み部分は次の通りです。
DanmakuCanvas.javaの一部
//ハイスコアの書き込み【追加】
private void saveHighScore(int highscore) {
RecordStore rs=null;
try {
//ハイスコアをバイトデータに変換
ByteArrayOutputStream out=new ByteArrayOutputStream();
out.write(highscore);
out.close();
byte[] w=out.toByteArray();
//レコードストアの接続
rs=RecordStore.openRecordStore("highscore",true);
//レコードの追加
if (rs.getNumRecords()==0) {
rs.addRecord(w,0,w.length);
}
//レコードの更新
else {
rs.setRecord(1,w,0,w.length);
}
//レコードストアの切断
rs.closeRecordStore();
} catch (Exception e) {
System.out.println(e.toString());
//例外処理
try {
if (rs!=null) rs.closeRecordStore();
} catch (Exception e2) {
}
}
}
|
レコードストアの接続を行うには、openRecordStore()メソッドを使います。
| [RecordStoreクラス] |
static RecordStore openRecordStore(name,create)
name レコードストアの名前(最大32バイト):String型
create 必要に応じてレコードストアを作成するか(作成するはtrue):boolean型
戻り値 レコードストア:RecordStore型 |
| レコードストアの接続を行う。 |
createにtrueを指定すると、指定した名前のレコードストアが存在しない時は新規作成し、存在する時はそれと接続します。
次に、レコードストアがレコードを保持しているか調べ、ない時はレコードを追加し、ある時はレコードを更新します。
レコード数を取得するには、getNumRecords()メソッドを使います。
| [RecordStoreクラス] |
int getNumRecords()
戻り値 レコード数:int型 |
| レコード数を取得する。 |
レコードを追加するには、addRecord()メソッドを使います。戻り値はレコードIDで、1から順番に割り当てられます。
| [RecordStoreクラス] |
int addRecord(data,offset,size)
data バイトデータ:byte[]型
offset バイトデータの書き込み開始位置:int型
size バイトデータのサイズ:int型
戻り値 レコードID:int型 |
| レコードを追加する。 |
レコードを更新するには、setRecord()メソッドを使います。
| [RecordStoreクラス] |
void setRecord(recordID,data,offset,size)
recordID レコードID:int型
data バイトデータ:byte[]型
offset バイトデータの書き込み開始位置:int型
size バイトデータのサイズ:int型 |
| レコードを更新する。 |
レコードストアの切断を行うには、closeRecordStore()メソッドを使います。
| [RecordStoreクラス] |
| void closeRecordStore() |
| レコードストアの切断を行う。 |
レコードストアを閉じないと、次回レコードストアを開けません。例外が発生した時も閉じるようにしてください。
▼レコードストアを読み込む
DanmakuCanvasクラスに追加したレコードストアの読み込み部分は次の通りです。
DanmakuCanvas.javaの一部
//ハイスコアの読み込み【追加】
private int loadHighScore() {
RecordStore rs=null;
try {
//レコードストアの接続
rs=RecordStore.openRecordStore("highscore",false);
//レコードの読み込み
byte[] w=rs.getRecord(1);
//レコードストアの切断
rs.closeRecordStore();
//バイトデータをハイスコアに変換
ByteArrayInputStream in=new ByteArrayInputStream(w);
int highscore=in.read();
in.close();
return highscore;
} catch (Exception e) {
System.out.println(e.toString());
//例外処理
try {
if (rs!=null) rs.closeRecordStore();
} catch (Exception e2) {
}
return 0;
}
}
|
レコードストアからレコードを読み込むには、getRecord()メソッドを使います。
| [RecordStoreクラス] |
byte[] getRecord(recordID)
recordID レコードID:int型
戻り値 バイトデータ:byte[] |
| レコードを読み込む。 |
各種データをバイトデータに変換するには「java.io.ByteArrayOutputStream」クラス、バイトデータを各種データに変換するには「java.io.ByteArrayInputStream」クラスを使うと便利です。
▼属性設定
レコードストアで使用できる容量は「最大32KB(32678B)」です。属性設定のオプション項目「MIDlet-Data-Size」に使用するデータサイズをバイト単位で指定できますが、指定しないと32KBとみなされます。また、この32Kの中には管理用データのサイズも含まれるため、ファイルやレコードを分割するほど、実際に保存できるデータ量は減ってしまうので注意して下さい。

▼エミュレータ実行時の注意点
エミュレータを複数起動すると、別の端末とみなされ、別のレコードストアからの読み書きを行うので注意して下さい。タイトルバーの番号(+5550000など)で同じ端末をエミュレートしているかどうかを確認できます。

また、エミュレータのレコードストアの情報消去を行うには、「KToolbar」のメニュー「ファイル⇒ユーティリティ」でユーティリティダイアログを開き、「データベースの消去」を選択します。

▼おわりに
今回はこれでおしまいです。次回は「サウンドの再生」について解説します。
|