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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

1回答

4335閲覧

配列のブロックとボールの当たり判定

masaakitsuyoshi

総合スコア102

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2016/05/26 08:28

配列型の短形(ブロック)と、動き回るボールの当たり判定について質問です。

ブロック個数
横 画面幅に合わせて変動するnum
縦 10段

の2次元配列でブロックを描画しています。

下記collisionDetectionメソッドをSurfaceViewを継承したCustomView内のrunループで呼んでいます。

collidewidth(バーとボールの当たり判定)はうまく動作しています。

下の、ブロック(配列)とボールの当たり判定ができず、ボールがすり抜けてしまいます。

ifの条件式は、ball+ball幅が、blockの中心座標(x,y)+高さ or 幅 を超えるか超えないかで判定しています。
ブロックの上下左右の辺に、ボールが侵入しているかどうか、です。

countはスコア表示用のメソッド

エラーは出てませんが、どこか変なところはありますでしょうか?

GameControl.java

Java

1public void collisionDetection(){ 2 if (bar.collideWidth(ball,bar)){ 3 4 if ( ball.x + ball.size >= bar.x - bar.halfBar && ball.x - ball.size <= bar.x + bar.halfBar ) { 5 6 ball.vy *= -1; 7 count.count(50); 8 } else if ( ball.y + ball.size >= bar.y - bar.height && ball.y - ball.size <= bar.y + bar.height) { 9 10 ball.vx *= -1; 11 12 } 13 14 }//ここまでバーの当たり判定 15 16 //ここからブロックとボールの当たり判定 17 for( int i = 0;i< num ;i++ ) { 18 for (int j = 0; j< 10 ;j++ ) { 19 20 if (ball.y + ball.size >= block[i][j].y - height && ball.x - ball.size <= block[i][j].x + Block.WIDTH && ball.x + ball.size >= block[i][j].x - width) { 21 ball.vy *= -1;//上の反発 22 Points count = new Points(); 23 count.count(50); 24 } 25 if (ball.y - ball.size <= block[i][j].y + height && ball.x - ball.size <= block[i][j].x + width && ball.x + ball.size >= block[i][j].x - width) { 26 ball.vy *= -1;//下の反発 27 Points count = new Points(); 28 count.count(50); 29 } 30 if (ball.x + ball.size >= block[i][j].x - width && ball.y - ball.size <= block[i][j].y + height && ball.y - ball.size >= block[i][j].y - height) { 31 ball.vx *= -1;//左 32 Points count = new Points(); 33 count.count(50); 34 } 35 if (ball.x - ball.size <= block[i][j].x + width && ball.y - ball.size <= block[i][j].y + height && ball.y - ball.size >= block[i][j].y - height) { 36 ball.vx *= -1;//右 37 Points count = new Points(); 38 count.count(50); 39 } 40 } 41 42 } 43 44 45 46 47 }

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

coco_bauer

2016/05/26 08:48

「ball+ball幅が、blockの中心座標(x,y)+高さ or 幅を超えるか超えないか」のところですが、「ballの中心座標±ballの半径が、blockの中心座標(x,y)±"高さの半分" or "幅の半分”を超えるか超えないか」が接触したかどうかの判断ではないでしょうか? blockは .heightで、barは.halfBarとなっているなど混乱がみられるので、定義を見直しては如何でしょうか?
masaakitsuyoshi

2016/05/27 03:32

大変失礼いたしました。「blockの中心座標(x,y)±"高さの半分" or "幅の半分”を超えるか超えないか」で定義しております。変数名がおかしかったのと、説明が間違っていました。
guest

回答1

0

どれか1つでも条件を満たしたらbreakする必要があると思いますよ。
他にもcountが毎回インスタンス化しているのでポイントを集計できていないんじゃ無いですか?

挙動がおかしい時にログ出力やデバッグ実行等で
「想定した処理ルートと値」と「実際の処理ルートと値」を比較するぐらいはして自力で考えるくらいはしましたか?

投稿2016/05/26 11:29

yona

総合スコア18155

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問