ゲームアプリ (Catch the Ball)

【Android Studio】 ゲームアプリ開発入門 第6回 「衝突判定とスコアラベル更新」

ここまでの記事はこちら
 

今回は「ボックスとボールの衝突判定」と「スコアラベルの更新」です。

衝突判定というと複雑そうに見えるかもしれませんが、ここではできる限りシンプルな方法をご紹介します。

それでは始めていきましょう!
 


 

動画

動画では Android Studio 3.1.4 を使用していますが 3.6 / 4.0 でも動作確認済みです。

【Android Studio】ゲームアプリ開発入門 #6 衝突判定とスコアラベルの更新

 
 

解説

hitCheck メソッド

衝突判定は hitCheck メソッドを用意して書いていきます。

3、11~13行目を追加します。

 

changePos メソッド内でボックスとボールを動かす前に、毎回 hitCheck メソッドを呼ぶことで衝突判定を行います。
 

オレンジボールの衝突判定

まずはオレンジボールの衝突判定をします。

hitCheck メソッド内の3~11行目を追加します。

Warning が出ている箇所があると思いますが、最後に修正するのでそのままにしておいて下さい。

 

衝突判定の書き方はどれほど厳密に判定するかで変わりますが、このゲームでは

ボールの中心座標が青いボックスの中に入ったら衝突(ヒット)

と判定します。
 

 

Step 1

まずは、オレンジボールの中心座標を取得します。

float orangeCenterX = orangeX + orange.getWidth() / 2;
float orangeCenterY = orangeY + orange.getHeight() / 2;


 

Step 2

次に書いている if 文がボールの中心座標が青いボックスの中に入ったかの条件式です。

if (0 <= orangeCenterX && orangeCenterX <= boxSize &&
    boxY <= orangeCenterY && orangeCenterY <= boxY + boxSize) {

条件は

  1. オレンジの中心 X 座標が 0 と boxSize の間にある
  2. オレンジの中心 Y 座標が boxY と boxY + boxSize の間にある

の2つです。

この2つの条件を満たしていると、ボールの中心がボックスの中にある状態なので「ヒット」とします。

 
 

Step 3

orangeX = -10.0f;
score += 10;

ヒットと判定されたら orangeX をマイナスの値にします。

マイナスにすることで changePos メソッドに書いた if (orangeX < 0) { の条件式に一致して、新しい位置から再びボールが出てくるようになります。

スコアもここで加算します。
 
 

スコアラベルの更新

次に、スコアラベルに最新のスコアが表示されるようにしていきます。

4行目を追加します。

 

10行目を追加します。

 

7行目を追加します。

Warning が出ている箇所があると思いますが、最後に修正するのでそのままにしておいて下さい。

 
 

アプリを実行する

ここでアプリを実行してください。

オレンジボールを取ったときに、スコアが 10 ポイントずつ加算されていれば成功です。

 
 

ピンクボールの衝突判定

オレンジボールの衝突判定の下に、以下のコードを追加します。

Warning が出ている箇所があると思いますが、最後に修正するのでそのままにしておいて下さい。

 

オレンジボールと同じように、中心座標を取得して衝突判定を行なっています。
スコアは 30 ポイント加算しています。

 
 

黒いトゲトゲの衝突判定

ピンクボールの衝突判定の下に、以下のコードを追加します。

Warning が出ている箇所があると思いますが、最後に修正するのでそのままにしておいて下さい。

 

黒いトゲトゲに当たった場合はゲームオーバーです。

タイマーをキャンセル(停止)して、結果画面を表示します。(結果画面は次回書いていきます。)
 
 

アプリを実行する

アプリを実行してください。

スコアが加算され、黒いトゲトゲに当たってタイマーが止まれば成功です。

 
 

補足:処理をまとめる

衝突判定を3つ書きましたが、 if 文はどれも似ていて何度も書くのが面倒ですよね。

ここでは、関数を用意して処理をまとめる方法を紹介したいと思います。
 

hitStatus 関数を追加して、衝突判定の if 文を書き換えます。

追加・変更するのは7・16・25・36~39行目です。

 

hitStatus 関数では、衝突した場合は true を、衝突しなかった場合は false を返しています。

1行で書きましたが、以下のコードをまとめているだけです。

if (0 <= centerX && centerX <= boxSize &&
        boxY <= centerY && centerY <= boxY + boxSize) {
    return true;
} else {
    return false;
}

 

さらに簡略化して、このように書くこともできます。

public boolean hitStatus(float centerX, float centerY) {
    return (0 <= centerX && centerX <= boxSize &&
            boxY <= centerY && centerY <= boxY + boxSize);
}

 
 

前回、ボールの Y 座標を Math.random() を使って作成しましたが、この処理も同じように共通化することができそうです。

orangeY = (float)Math.floor(Math.random() * (frameHeight – orange.getHeight()));

ぜひ挑戦してみてください
 
 

次に行うこと

これでゲーム画面は全て完成です!
次回からは結果画面を作成していきます。

第7回 「結果画面の作成」に進む
 

ここまでのコード

 

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

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

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

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

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

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

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

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

無料体験はこちら

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

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

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

3. Treehouse

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

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

POSTED COMMENT

  1. アバター hiroshimaeasy より:

    java学習初学者です。
    androidゲーム開発に興味があり、参考にさせていただいております。

    ヒントをいただきたく質問です。
    今回の記事の最後に、ボールのY座標のランダム化のコーディングのリファクタリングについて投げかけられていますが、自分で試してみたところ当初と違う動きをしてしまい要因がわかりません…
    もしよろしければコードを添削していただけませんでしょうか?
    よろしくお願いいたします。

    • Sara Sara より:

      hiroshimaeasyさん

      記事をお読みいただきありがとうございます。
      コードをこちらのコメント欄に貼り付け、または codeforfun.jp@gmail.com まで送っていただけますか?
      確認させて頂きます????

      Sara より

COMMENT

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

CAPTCHA