【Android Studio】ゲームアプリ開発入門 第14回「Warningの解消 -java編-」


ここまでの記事はこちら
前回は XML ファイル内の Warning を全て消すことができたので、今回は java ファイル内の Warning を消していきます。
編集するのは
- MainActivity.java
- ResultActivity.java
- SoundPlayer.java
の3つのファイルです。
それでは順番に始めて行きましょう!
解説
1. MainActivity.java
上から順番に Warning を消していきましょう。
32行目あたり
private int screenHeight;
screenHeight の上にカーソルをあわせると Field can be converted to a local variable と表示されます。

screenHeight 変数は onCreate メソッド内でしか使用していないので「onCreate メソッド内のローカル変数にしたら?」という Warning です。
screenHeight の上でクリックすると、左側に豆電球のマークが出るのでクリックします。

Convert field to local variable in method ‘onCreate’ をクリックします。「フィールドを onCreate メソッド内の変数に変換する」という意味です。

83行目あたりを確認すると
screenHeight = size.y;
だったのが
int screenHeight = size.y;
となって Warning が消えていると思います。
97行目あたり
scoreLabel.setText("Score : 0");
文字列の上にカーソルを合わせると String literal in setText can not be translated. Use Android resources instead. と表示されます。

これは「setText の文字列を翻訳できません。代わりにリソースを使ってください。」という Warning です。
リソースとは、前回使用した strings.xml ファイルのことです。
前回 strings.xml に定義した
<string name="score">Score : %d</string>
の %d の部分に、ゲーム開始時のスコアである0を入れて表示してみましょう。
scoreLabel.setText(“Score : 0”); を以下のように書き換えてください。
scoreLabel.setText(getString(R.string.score, 0));
getString メソッドを使って strings.xml に定義した文字列を取得します。文字列は R.string.名前 と書きます。
getString メソッドの第二引数には %d の部分に入れる数値を指定します。ゲーム開始時はスコアが 0 なので 0 にしました。
ここで一度アプリを実行してみて下さい。
ゲーム画面のスコアラベルが Score : 0 となっているでしょうか?

正しい名前を指定しているのに R.string.score 部分がエラーになってしまう場合は、Android Studio を再起動してみてください。
144 行目あたり
scoreLabel.setText("Score : " + score);
ここは先ほどの scoreLabel と同じ Warning です。
今回はゲームの途中なので、%d には 0 ではなく score を入れます。
scoreLabel.setText(“Score : ” + score); を以下のように書き換えてください。
scoreLabel.setText(getString(R.string.score, score));
150 行目あたり
float orangeCenterX = orangeX + orange.getWidth() / 2;
orange.getWidth() / 2 の部分に Warning が付いています。
カーソルを合わせてみると integer division in floating-point context と表示されます。

これは orangeCenterX が float 型にも関わらず orangeX + orange.getWidth() / 2 を全て int 型で計算していることが原因の Warning です。
このコードだと計算結果は float 型になりますが、123.0 のように小数点以下が切り捨てになってしまいます。
簡単な例で見てみましょう。
float a = 6 / 4;
float b = 6 / 4.0f;
この計算結果は a = 1.0, b = 1.5 となります。
どちらも計算結果は float 型になりますが、1つめは小数点以下が切り捨てられています。
このゲームの場合はどちらで計算しても大きな影響はありませんが、より正確になるように 2 を 2.0f に変えます。2f と書くこともできます。
float orangeCenterX = orangeX + orange.getWidth() / 2.0f;
float orangeCenterY = orangeY + orange.getHeight() / 2f;
どちらで書いても良いですが、個人的には小数だとすぐに認識できる 2.0f をよく使っています。
pinkCenterX, pinkCenterY, blackCenterX, blackCenterY の部分も同じ方法で Warning を消してください。
192 行目あたり

ここは can be simplified(簡略化できます)という Warning です。
このゲーム開発ではコードを分かりやすくするために「条件に一致したら true、不一致の場合は false を返す」と明記しましたが ? true : false の部分は省略することができます。
? true : false を消して、以下のようにしてください。
public boolean hitStatus(float centerX, float centerY) {
return (0 <= centerX && centerX <= boxSize &&
boxY <= centerY && centerY <= boxY + boxSize);
}
198 行目あたり
if (start_flg == false) {
これは「start_flg が false の場合」という判定式ですが、ここも can be simplified(簡略化できます)という Warning が表示されています。
簡略化すると
if (!start_flg) {
となります。
if (start_flg) は if (start_flg == true) を簡略化した書き方です。
ここに「~ではない」という意味の ! を付けることで「start_flg が true ではない」つまり false であるという判定式にすることができます。
! を使う判定式はとても良く使うので、ぜひ覚えておいて下さい。
2. ResultActivity.java
ResultActivity.java では、スコアラベルとハイスコアラベルの3箇所に Warning が出ています。修正方法は MainActivity.java のスコアラベルと同じです。
22 行目あたり
変更前:scoreLabel.setText(score + "");
変更後:scoreLabel.setText(getString(R.string.result_score, score));
28 行目あたり
変更前:highScoreLabel.setText("High Score : " + score);
変更後:highScoreLabel.setText(getString(R.string.result_high_score, score));
35 行目あたり
変更前:highScoreLabel.setText("High Score : " + highScore);
変更後:highScoreLabel.setText(getString(R.string.result_high_score, highScore));
3. SoundPlayer.java
SoundPlayer.java では、15行目あたりに書いた audioAttributes の部分に Warning が出ています。

これも MainActivity.java の screenHeight に付いていた Warning と同じく Field can be converted to a local variable と表示されます。
audioAttributes 変数はコンストラクター内でしか使用していないので「コンストラクター SoundPlayer(Context contect) 内で定義しましょう」という Warning です。
audioAttributes の上でクリックすると、左側に豆電球のマークが出るのでクリックします。

Convert field to local variable in constructor をクリックします。

21行目あたりを確認すると
audioAttributes = new AudioAttributes...
が
AudioAttributes audioAttributes = new AudioAttributes...
に修正されました。
まとめ
以上で全ての Warning を解決することができました。
はじめにも書いたように Warning がアプリの動作にすぐに影響することはないですが、全て解決しておくとコードがスッキリとして気持ちが良いですね。
AndroidStudio では Warning の横に表示される豆電球をクリックすれば解消法を丁寧に提案してくれます。今後他の Warning が表示された場合は、そちらも活用してみてください。
完成版のサンプルコード
準備中