こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

ブロック崩しを作っているのですが…。

ブロック崩しを作っているのですが
ボールのあたり判定について困っています。
ソースコード→http://ameblo.jp/yuse1247/entry-11875651194.html
ソースが汚いのでコメント入れてます。見にくくてすいません。
実行結果→http://ameblo.jp/yuse1247/entry-11875652132.html

※ここからはソースコードをみた前提で話します。
ボールがfield1 field2 field3に当たった時に跳ね返るようにしたいのですが
どうすればいいでしょうか…。

投稿日時 - 2014-06-10 21:30:19

QNo.8632181

困ってます

このQ&Aは役に立ちましたか?

11人が「このQ&Aが役に立った」と投票しています

回答(1)

ANo.1

まだ動かすスレッド処理がないようなので、その部分を作ってから考えたほうがいいとは思いますが……。

衝突処理は、もっとも手っ取り早い考え方としては、「対象となる者の中心点が、衝突相手の領域内にあるか否か」でチェックできます。ボールのような小さいものなら、大きさを無視して、その中心点がブロックの領域内にあるかどうかをチェックするわけですね。領域内にあれば衝突したとみなすわけです。

ただ、この方法だとボールがブロックにめり込んだ感じで反射するので美しくないし違和感はあるでしょう。

これを少し応用して、ボールの中心点から上下左右に半径だけ離れた4点(つまり輪郭線上を90度間隔で4箇所)について、対象のブロックの領域内にあるかどうかをチェックする、というやり方が考えられます。ブロックは四角形なので、角の部分を考えなければこれで衝突したかどうかチェックできます。

更に細かく割って、45度間隔で計8箇所について調べれば、ほぼ違和感ない衝突判定ができるでしょう。斜めの輪郭地点はsin/cos関数で算出します。

もちろん、もっと細かくして16箇所、32箇所と調べるようにすれば更に正確でなめらかな衝突処理が行えるでしょうが、それだけ演算量も増えます。個人的には、簡単なゲームなら8箇所調べるだけで十分な気がします。

ちなみに「跳ね返る」というのは、移動距離(コードのvx,vyがそれに相当?)をプラスマイナス反転させるだけです。xを反転させれば横方向に、yを反転させれば縦に跳ね返ります。この際、当たった位置によって値を増減させるとよりリアルになるでしょう。

投稿日時 - 2014-06-11 08:46:44

あなたにオススメの質問