ゲームアプリ (Catch the Ball)

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

ここまでの記事はこちら
 

前回は XML ファイル内の Warning を全て消すことができたので、今回は java ファイル内の Warning を消していきます。

編集するのは

  • MainActivity.java
  • ResultActivity.java
  • SoundPlayer.java

の3つのファイルです。

それでは順番に始めて行きましょう!
 


 

動画

準備中

 

解説

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 であるという判定式にすることができます。

! を使う判定式はとても良く使うので、ぜひ覚えておいて下さい
 
 

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));

 

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

完成版のサンプルコード

完成版のサンプルコードは GitHub からダウンロードできます。
GitHub : https://github.com/codeforfun-jp/catch-the-ball-version1
参考:GitHubからAndroid Studio プロジェクトをダウンロード・実行する方法
 

ABOUT ME
Sara
Sara
「わかりやすく・シンプル」をモットーに、スマホアプリ・ウェブアプリの作り方を紹介します。 独学でプログラミングを勉強をしている方、基礎は勉強したけれど次に何をすれば良いか分からない...という方のお役に立てるサイトを目指しています🙂
独学は難しそうと感じたら

 
独学でプログラミングを勉強するのは難しそう、効率的にプログラミングを学びたいという方はオンラインスクールがオススメです。

オンラインスクールを選ぶときのポイント

  • 無料体験があること
  • 個別サポートがあること

自分にあったスタイルを見つけるために、無料体験のご利用をオススメします。(無料体験後に自分には合わないなと感じたらハッキリ断ってしまって問題ありません。)
 
個別サポートもプログラミング学習に挫折しないために重要なポイントです。エラーや困った時にすぐに個別対応をしてくれるスクールを利用して下さい。

ここでは3つのオンラインスクールを紹介します。
全て無料体験がありますので、ぜひ自分に合ったスクールを見つけてみて下さい????
 

1. TechAcademy(テックアカデミー)

オンライン完結で勉強できるスクールで、コースがとても充実しています。チャットで質問すればすぐに回答を得られるのが一番のおすすめポイントです。
オリジナルのサービスやアプリの開発もサポートしてくれるので、開発したいものが決まっている人にもオススメです。

無料体験はこちら

2. CodeCamp(コードキャンプ)

一対一で受講できる個別指導のプログラミングスクールです。
Webデザイン・Webサービス開発・アプリ開発などを幅広く学習することができます。
マンツーマンなので自分のペースで学習できて、質問もその都度できるのがメリットです。

無料体験レッスンはこちら

3. Treehouse

英語でも良い、英語とプログラミングを同時に勉強したいという方は Treehouse がオススメです。月25ドルで始めることができて、たくさんのプログラミング言語を学ぶことができます。
個別サポートはありませんが、掲示板が充実しています。ほとんどの場合、質問してから30分程度で回答を得ることができます。

7日間の無料体験はこちら

COMMENT

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA