ゲームアプリ (Catch the Ball)

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

Sara

2023年11月 Android Studio Giraffe | 2022.3.1 で動作確認済み。

ここまでの記事はこちら

前回は 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 が表示された場合は、そちらも活用してみてください。

完成版のサンプルコード

準備中

Subscribe
Notify of
0 Comments
古い順
新しい順 人気順
Inline Feedbacks
View all comments
ABOUT ME
Sara
Sara
運営者
書籍やオンライン講座でプログラミングを勉強してフリーランスのプログラマーになりました。
このサイトでは「わかりやすく・シンプル」をモットーに、プログラミングの基礎からアプリ開発まで紹介します。
独学でプログラミングを勉強をしている方、基礎は勉強したけれど次に何をすれば良いか分からない...という方のお役に立てるサイトを目指しています。
主な使用言語:Java / Kotlin / PHP
>> 詳しいプロフィール
>> お問い合わせ
>> 書籍を出版しました!
本格的に学びたい方へ

Code for Fun プログラミング講座

POINT 01

動くコード

プログラミングの文法を学んでも、そこからどのようにアプリ開発ができるのかイメージが湧きにくいものです。

Code for Fun のプログラミング講座では、ゲームやカレンダーなどアプリとして機能するものを作りながらプログラミングを学ぶことができます。

POINT 02

自分のペースで

オンライン講座なので、ご自身のペースで学習を進めて頂けます。

受講期限もないので、いつでも前のレッスンに戻ることができるので安心です。

お申し込みしたその日からすぐに始めることができます。

POINT 03

個別サポート

プログラミング学習では、エラーが起きることはよくあります。そんな時はお気軽にお問い合わせください!

コメント欄またはメールによるサポートを回数無制限でご利用頂けます。(*講座に関連するご質問のみ対応)

今すぐ無料でお試し

0
この記事にコメントするx
記事URLをコピーしました