スポンサーサイト

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

データ画面の実装~完~

だいぶ前にちょこっとだけ紹介したような気がする"データ画面の実装"です。

前回の段階ではハイスコアを獲得した時にしかスコアは保存されませんでしたが、それだけだとちょっと物足りないので5位までのスコアを記録できるようにしました。

~前回の画面~

Screenshot_2014-02-11-08-16-13.png

↓↓↓↓↓

~実装後の画面~

Screenshot_2014-10-06-09-10-38.jpg

今回は少しコードを解説していきますね。

if (一位データ.getInstance(getBaseActivity()).get一位() == 0) {
一位テキスト = new Text(352, 96, font, "- - - - -",
20, new TextOptions(HorizontalAlign.LEFT),
getBaseActivity().getVertexBufferObjectManager());
一位テキスト.setColor(1, 1, 1);
一位テキスト.setScale(1);
attachChild(一位テキスト);
} else {
一位テキスト = new Text(352, 96, font, ""
+ 一位データ.getInstance(getBaseActivity()).get一位(),
20, new TextOptions(HorizontalAlign.LEFT),
getBaseActivity().getVertexBufferObjectManager());
一位テキスト.setColor(1, 1, 1);
一位テキスト.setScale(1);
attachChild(一位テキスト);
}

ここはゲームのタイトル画面全般を管理する"InitialSceneクラス"です。
普段は"MainSceneクラス"内のゲームのメイン部分のコードを解説していたため、タイトルシーンに関してはあまり触れることはありませんでした。
今回はここでAndengineが持つテキスト型の変数"一位テキスト"に文字データを代入してやります。
ちなみに、ここでifとelseに分岐させ、スコアの値が0のときにわざわざ"ハイフン(-)"を表示させているのは、単に"0"と表示させるのはカッコ悪いと思ったからです。

…それより重要なのがこの"一位データ"というクラス。
(1行目で呼び出してる"if (一位データ.getInstance(getBaseActivity()).get一位() == 0) {"の部分。)
ここでスコアの保存データを管理しています。(ちょっとのぞいてみましょう!)

public class 一位データ {

// 自身のインスタンス
private static 一位データ instance;
// シングルトン
public static synchronized 一位データ getInstance(Context context) {
if (instance == null) {
instance = new 一位データ(context);
}
return instance;
}

private static SharedPreferences settings;
private static SharedPreferences.Editor editor;

private 一位データ(Context context) {
settings = context.getSharedPreferences("shared_preference_1.0", 0);
editor = settings.edit();
}

public int get一位() {
return settings.getInt("一位", 0);
}

public void set一位(int value) {
editor.putInt("一位", value);
editor.commit();
}
}

…失礼ながら例のテキストのサンプル(元SPUtilクラス)をそのままコピペしたものです。
まだ良く分からないのでテキストを使って解説してしたいと思います。

例のテキストによると…「基本的なクラスですので解説は不要ですね。」



…^^;



…た、確かに基本的過ぎる内容ですね;
というわけで次に行きましょうか;

ここはゲームの大元となっている"MainSceneクラス"の内部です。

public void GameOver() {
ゲームオーバーかどうか = true;
// Sceneのタッチリスナーを解除
setOnSceneTouchListener(null);
// 距離を更新時は保存
if (現在のスコア > 一位データ.getInstance(getBaseActivity()).get一位()) {
// 四位の記録を五位に…
五位データ.getInstance(getBaseActivity()).set五位(
四位データ.getInstance(getBaseActivity()).get四位());
// 三位の記録を四位に…
四位データ.getInstance(getBaseActivity()).set四位(
三位データ.getInstance(getBaseActivity()).get三位());
// 二位の記録を三位に…
三位データ.getInstance(getBaseActivity()).set三位(
二位データ.getInstance(getBaseActivity()).get二位());
// 一位の記録を二位に…
二位データ.getInstance(getBaseActivity()).set二位(
一位データ.getInstance(getBaseActivity()).get一位());
// ここで一位の距離を保存
一位データ.getInstance(getBaseActivity()).set一位(現在のスコア);
} else if (現在のスコア > 二位データ.getInstance(getBaseActivity()).get二位()) {
// 四位の記録を五位に…
五位データ.getInstance(getBaseActivity()).set五位(
四位データ.getInstance(getBaseActivity()).get四位());
// 三位の記録を四位に…
四位データ.getInstance(getBaseActivity()).set四位(
三位データ.getInstance(getBaseActivity()).get三位());
// 二位の記録を三位に…
三位データ.getInstance(getBaseActivity()).set三位(
二位データ.getInstance(getBaseActivity()).get二位());
// ここで二位の距離を保存
二位データ.getInstance(getBaseActivity()).set二位(現在のスコア);
} else if (現在のスコア > 三位データ.getInstance(getBaseActivity()).get三位()) {
// 四位の記録を五位に…
五位データ.getInstance(getBaseActivity()).set五位(
四位データ.getInstance(getBaseActivity()).get四位());
// 三位の記録を四位に…
四位データ.getInstance(getBaseActivity()).set四位(
三位データ.getInstance(getBaseActivity()).get三位());
// ここで三位の距離を保存
三位データ.getInstance(getBaseActivity()).set三位(現在のスコア);
} else if (現在のスコア > 四位データ.getInstance(getBaseActivity()).get四位()) {
// 四位の記録を五位に…
五位データ.getInstance(getBaseActivity()).set五位(
四位データ.getInstance(getBaseActivity()).get四位());
// ここで四位の距離を保存
四位データ.getInstance(getBaseActivity()).set四位(現在のスコア);
} else if (現在のスコア > 五位データ.getInstance(getBaseActivity()).get五位()) {
// ここで五位の距離を保存
五位データ.getInstance(getBaseActivity()).set五位(現在のスコア);
}
// 解説範囲外のため省略…
}

1行目にある"GameOver()メソッド"は文字通り、プレイヤーがゲームオーバーになったときに呼び出されるメソッドです。
…つまり、ゲームが終了したタイミングでスコアを保存しているというわけですね!

では、6行目から見ていってください。
"if (現在のスコア > 一位データ.getInstance(getBaseActivity()).get一位()) {"とありますがこれはゲーム内で獲得したスコアがハイスコアよりも大きいかを調べています。

既に登録済みのハイスコアよりもゲーム中で獲得したスコアの方が大きい場合は…、
20行目の処理"一位データ.getInstance(getBaseActivity()).set一位(現在のスコア);"で先ほどの"一位データクラス"に獲得したスコア値を代入してあげます。
もちろんスコアが登録されていない場合も同じですね。

あ…!待ってください!
それだけだと、ただスコアが保存されるだけの処理になってしまい、以前に獲得したスコアはそのまま上書きされ消えてしまうので7行目~18行目の処理を行い、古いハイスコアは下位のランクに落としてあげるようにします。

これで一件落着ですね!
スポンサーサイト

コメント

非公開コメント

プロフィール

岡本 賢治

Author:岡本 賢治
 
☆☆☆☆☆☆☆☆☆☆☆☆
 
Android専用アクションゲーム
「スーパーけんじラン」好評配信中!
 
↓↓↓↓↓↓↓↓↓↓↓↓

 
・公式サイトはこちらから
http://okamotodo.jimdo.com/

最新トラックバック

アクセスカウンター

オンラインカウンター

現在の閲覧者数:

検索フォーム

ブロとも申請フォーム

QRコード

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