【Android Studio】ゲームアプリ開発入門 第8回「スコアの表示とハイスコアの保存」
ここまでの記事はこちら
今回は
- 結果画面への画面遷移
- スコアの表示
- ハイスコアの保存
を実装していきます。
画面遷移には intent(インテント)、ハイスコアの保存には SharedPreferences(シェアードプレファレンシズ)というものを使っていきます。
2つとも画面遷移とデータ保存には欠かせないもので、アプリ開発でとてもよく使われます。
いつでもサクッと実装できるようになっておきましょう。
解説
1. スコアをResultActivityに渡す
まずはスコアを結果画面で表示するために、MainActivity(ゲーム画面)からResultActivity(結果画面)に score を渡します。
MainActivity.java を開いて、9~11行目を追加してください。
必要なimport
import android.content.Intent;
Intent(インテント)とは?
新しいアクティビティ(ResultActivity)を開くには Intent(インテント)を使います。
Step 1
Intent intent = new Intent(getApplicationContext(), ResultActivity.class);
Intent オブジェクトを初期化します。
1つ目の引数には現在のアクティビティの Context(コンテキスト)、2つ目の引数には表示するアクティビティの Class オブジェクトを書きます。
Step 2
intent.putExtra("SCORE", score);
ResultActivity(結果画面)に渡したい値を putExtra メソッドを使ってセットします。
渡す値がない場合はこの手順は省略できます。
intent.putExtra("キー", 値);
キーは結果画面で値を受け取る時に使う名前です。文字列で指定します。
値には String 型と基本型の、値と配列を使うことができます。
Step 3
startActivity(intent);
Intent オブジェクトを startActivity メソッドに渡して結果画面を表示します。
2. スコアの表示
結果画面にスコアを表示します。
ResultActivity.java を開いて、6~10行目を追加してください。
Warning が出ている箇所があると思いますが、最後に修正するのでそのままにしておいて下さい。
9行目:スコアを取得
int score = getIntent().getIntExtra("SCORE", 0);
先ほど MainActivity.java で設定したキーを使って、スコアを取得します。
スコアは int 型なので getIntExtra メソッドを使います。
書き方は getIntExtra(キー, 値が取得できなかった場合の値)となります。
10行目:スコアを表示
scoreLabel.setText(score + "");
setText には文字列を指定する必要がありますが、score は int 型です。
このような場合は「 + “”」 をつけるだけで文字列として扱えるようになります。
3. ハイスコアの表示・保存
アプリにデータを保存するには
- SharedPreferences
- SQLiteデータベース
- テキストファイル
を使う方法がありますが、今回は一番手軽に使える SharedPreferences を紹介します。
12~24行目を追加します。
Warning が出ている箇所があると思いますが、最後に修正するのでそのままにしておいて下さい。
必要なImport
import android.content.SharedPreferences;
12行目:SharedPreferencesの準備
まずは SharedPreferences を使えるようにします。
SharedPreferences sharedPreferences = getSharedPreferences("GAME_DATA", MODE_PRIVATE);
getSharedPreferences(データの名前, モード)のように書きます。
モードには、他のアプリからも読み書きできる
- MODE_WORLD_READABLE
- MODE_WORLD_WRITEABLE
- MODE_MULTI_PROCESS
がありますが、今回はこのクイズアプリでのみ使用できれば良いので MODE_PRIVATE にします。
13行目:ハイコアを取り出す
int highScore = sharedPreferences.getInt("HIGH_SCORE", 0);
getInt(キー, データが無かった場合の数値) のように書きます。
16・23行目:ハイスコアを表示する
16行目 highScoreLabel.setText("High Score : " + score);
23行目 highScoreLabel.setText("High Score : " + highScore);
最新スコアがハイスコアを超えた場合は、最新スコアがハイスコアになるので score を表示します。
最新スコアがハイスコアを超えなかった場合は、そのまま highScore を表示します。
18~20行目:ハイスコアを保存する
最新スコアがハイスコアを超えた場合は、ハイスコアを更新します。
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putInt("HIGH_SCORE", score);
editor.apply();
putInt(キー, 保存する値) のようにデータをセットします。
注意するのが、読み出し時・書き込み時のキーを必ず一致させることです。
読み出し時 sharedPreferences.getInt("HIGH_SCORE", 0);
書き込み時 editor.putInt("HIGH_SCORE", score);
ここが一致していないと、保存できても読み出せなくなってしまうのでご注意ください。
最後に apply() で保存します。
SharedPreferences 使い方のヒント
今回はハイスコアを保存しましたが、複数のスコアやユーザー名、最後にゲームに挑戦した日など色々な使い方ができると思います。
ハイスコア以外にもデータを保存したい場合は、キーを変えることで複数のデータを保存することもできます。
例えばハイスコアに加えて、以下のようにユーザー名を読み書きすることもできます。
読み出し時 String userName = prefs.getString("KEY_NAME", "名無しさん");
書き込み時 editor.putString("KEY_NAME", userName);
ぜひ工夫して使ってみてください。
4. 「もう一度プレイ」ボタンの実装
前回 activity_result.xml に「もう一度プレイ」ボタンを用意しました。
文字が赤くなっている tryAgain メソッドを用意して、このボタンが押されたらゲーム画面を表示する処理を書いていきましょう。
6~8行目を追加します。
必要な import は2つです。
import android.content.Intent;
import android.view.View;
画面遷移は MainActivity からスコアを渡した時と同じようにインテントを使用します。
今回は渡すデータがないので、インテントを作成して startActivity に渡すだけです。
5. アプリを実行する
ここでアプリを実行してみます。
何回かゲームをプレイして、ハイスコアが正しく更新されるかをご確認下さい。
次に行うこと
ゲーム画面と結果画面は完成です!次回からはスタート画面を作成していきましょう。
ここまでのコード
- ResultActivity.java