質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.32%

android Rect intersects 配列のRectとの当たり判定

受付中

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 2,379

androidでブロック崩しを作っています。
Rectとintersectsを使って当たり判定を書いています。

ボールとバー(ラケット)

//barとボールの交差判定 Rectを使った場合
        public boolean collideWidth(Ball ball2) {
            RectF rectCheck = new RectF();//判定用
            RectF rect_bar = new RectF(bar.x - bar.halfBar , bar.y - bar.height , bar.x + bar.halfBar , bar.y + bar.height);//当たり判定用rect bar
            RectF rect_ball=new RectF(ball.x - ball.size , ball.y - ball.size , ball.x + ball.size, ball.y + ball.size );//当たり判定用のrect ball
            return rectCheck.intersects(rect_bar,rect_ball);//intersect=交差メソッド ボールが交差したらtrue
        }


ブロックとボールの当たり判定を書いている途中です。
下記のような感じで合ってますか?

前提
ブロックを配列で書いているので、RectFでも配列を使って初期化しています。
ブロック 横個数は画面のサイズによって変えている
立て個数は10段(block10[])

考え方としては、どれかのブロックに当たった時に真を返す
つまり 偽 偽 偽 偽 真 偽 偽 偽……
と、一つ以上の真があれば、return trueにする
というので合ってるでしょうか。

ブロックとボール(こんなかんじ?)

//ブロックとボールの当たり判定
        public boolean collideWidth2(Ball ball3) {
            RectF rectCheck2 = new RectF();//判定用

            RectF rect_block[] = new RectF[num];
            RectF rect_block2[] = new RectF[num];
            RectF rect_block3[] = new RectF[num];
            RectF rect_block4[] = new RectF[num];
            RectF rect_block5[] = new RectF[num];
            RectF rect_block6[] = new RectF[num];
            RectF rect_block7[] = new RectF[num];
            RectF rect_block8[] = new RectF[num];
            RectF rect_block9[] = new RectF[num];
            RectF rect_block10[] = new RectF[num];

            for(int i = 0;i<num;i++)
            {
                rect_block[i] = new RectF(block[i].x -blockWidth,block[i].y -blockHeight, block[i].x +blockWidth, block[i].y + blockHeight);
                rect_block2[i] = new RectF(block2[i].x -blockWidth,block2[i].y -blockHeight, block2[i].x +blockWidth, block2[i].y + blockHeight);
                rect_block3[i] = new RectF(block3[i].x -blockWidth,block3[i].y -blockHeight, block3[i].x +blockWidth, block3[i].y + blockHeight);
                rect_block4[i] = new RectF(block4[i].x -blockWidth,block4[i].y -blockHeight, block4[i].x +blockWidth, block4[i].y + blockHeight);
                rect_block5[i] = new RectF(block5[i].x -blockWidth,block5[i].y -blockHeight, block5[i].x +blockWidth, block5[i].y + blockHeight);
                rect_block6[i] = new RectF(block6[i].x -blockWidth,block6[i].y -blockHeight, block6[i].x +blockWidth, block6[i].y + blockHeight);
                rect_block7[i] = new RectF(block7[i].x -blockWidth,block7[i].y -blockHeight, block7[i].x +blockWidth, block7[i].y + blockHeight);
                rect_block8[i] = new RectF(block8[i].x -blockWidth,block8[i].y -blockHeight, block8[i].x +blockWidth, block8[i].y + blockHeight);
                rect_block9[i] = new RectF(block9[i].x -blockWidth,block9[i].y -blockHeight, block9[i].x +blockWidth, block9[i].y + blockHeight);
                rect_block10[i] = new RectF(block10[i].x -blockWidth,block10[i].y -blockHeight, block10[i].x +blockWidth, block10[i].y + blockHeight);
            }

            RectF rect_ball= new RectF(ball.x - ball.size , ball.y - ball.size , ball.x + ball.size, ball.y + ball.size );//当たり判定用のrect ball

            boolean blockFlag[] = for(int i = 0;i<num;i++) {

                rectCheck2.intersects(rect_ball, rect_block[i]);//intersect=交差メソッド ボールが交差したらtrue
                rectCheck2.intersects(rect_ball, rect_block2[i]);
                rectCheck2.intersects(rect_ball, rect_block3[i]);
                rectCheck2.intersects(rect_ball, rect_block4[i]);
                rectCheck2.intersects(rect_ball, rect_block5[i]);
                rectCheck2.intersects(rect_ball, rect_block6[i]);
                rectCheck2.intersects(rect_ball, rect_block7[i]);
                rectCheck2.intersects(rect_ball, rect_block8[i]);
                rectCheck2.intersects(rect_ball, rect_block9[i]);
                rectCheck2.intersects(rect_ball, rect_block10[i]);

            }

           return if (blockFlag[]) {true}
            else false;
        }
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

0

そもそも、当たったかどうかではなく、どのブロックに当たったかを判定しないと意味ないですよね。

すべてのブロックを保持しているフィールド変数に対してintersectsを行い、該当のブロックを返却するメソッドを作るべきです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.32%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る