トピック

ブロック崩しゲームの当たり判定

上、下、右、左でボールの軌道が変わるので、どうすればいいんだろうか。orz
7そうだね
プレイ済み
返信[1]
親投稿
ΖΕΧ ZEX256
判定は移動先でブロックや壁に接触したらでいいと思う ボールの反射は左右方向に接触したらR=-R 上下方向ならR=PI()-R
1そうだね
プレイ済み
返信[2]
親投稿
どうすれば上下左右の区別が出来ますか?
0そうだね
プレイ済み
返信[3]
親投稿
ΖΕΧ ZEX256
方法はいろいろあるでしょうが、私なら ボールがブロックに接触したとき ブロック中心座標から見たボール座標の角度を求め、 角度がブロックの左右側面方向なら左右とかかな
1そうだね
プレイ済み
返信[4]
親投稿
STiNGER STiNGER8901
縦の壁に当たったら、角度=360-角度 横の壁に当たったら、角度=180-角度 だったかな。
1そうだね
プレイ済み
返信[5]
親投稿
角度も取得することが出来るんですね!参考にさせていただきます!
0そうだね
プレイ済み
返信[6]
親投稿
ブロック崩しのブロックをスプライトにしてるので、、。
0そうだね
プレイ済み
返信[7]
親投稿
Mc mc014483
ATANは便利です。というか他の三角関数を使ったことがない。それぞれの違いや使い方をよく知らないので全部ATANでどうにかしてます。
1そうだね
プレイ済み
返信[8]
親投稿
ラジアン?????
0そうだね
プレイ済み
返信[9]
親投稿
ラジアンを理解してからまた来ます
0そうだね
プレイ済み
返信[10]
親投稿
ATAN()の使い方を教えて下さい。
0そうだね
プレイ済み
返信[11]
親投稿
ΖΕΧ ZEX256
HELPに載ってるよ ATANと入力して[?]を押すの
0そうだね
プレイ済み
返信[12]
親投稿
アークタンジェントが分からないのです
0そうだね
プレイ済み
返信[13]
親投稿
ΖΕΧ ZEX256
逆三角関数は高校生になれば習うと思うけど、意味とかはネット検索すれば数万件出てくるので勝手に調べればいい。 それより使い方を知った方が役に立つ 原点(0,0)を中心に、他点座標X,Yの角度を求めることができるのがATANです。 R=ATAN(Y,X)とすると原点から見た他点座標の角度Rが求まる。 それからプログラムで扱う座標系は、数学で扱う座標系と違ってY座標が±逆なのも注意
0そうだね
プレイ済み
返信[14]
親投稿
段々理解してきました。スプライトとの相対角度はどうやって得る事が出来ますか?何度もすいません。
0そうだね
プレイ済み
返信[15]
親投稿
三角関数を使わない場合は、「衝突したブロックの管理番号を調べてそのスプライトの座標から自分とブロックとの相対角度を出す」みたいな感じで良いんですかね?
0そうだね
プレイ済み
返信[16]
親投稿
かなり簡易的な作りになっており甘い部分もありますが、 私が作った作品に「鉄壁(TEPPEKI):キーEKX8V5DF」というのがあります。 最初はブロックが1個しかないですが、壊れる確率は1/64という鬼畜ブロック崩し 参考になれば。
1そうだね
プレイ済み
返信[17]
親投稿
頑張って三角関数使わない方のテストプログラムを作って見ます。
0そうだね
プレイ済み
返信[18]
親投稿
出来たらスクショ貼ります
0そうだね
プレイ済み
返信[19]
親投稿
意地悪してるなんて思って無いですからね。もし僕のコメントで嫌な気持ちになってたら申し訳ありません。頑張ってテストプログラム書きます。
0そうだね
プレイ済み
返信[20]
親投稿
はい。
0そうだね
プレイ済み
返信[21]
親投稿
ΖΕΧ ZEX256
相対角度?ってどういうことですか?何のために 相対座標のことだったらご自分でお考え下さい。 自分で考え発想しプログラムにしていくのがプログラマの役目ですよ
0そうだね
プレイ済み
返信[22]
親投稿
おちゃめ ochame_nako
ブロック崩しにおいてボールがパドルに当たった時の挙動ではなくボールがブロックに当たった時の挙動であるならば特殊なことをしない限りは縦壁ではX方向の移動を反転、横壁ではY方向の移動を反転だけで問題ありません。(わざわざ角度を求める必要はない) 難しいのはブロックの縦側に当たったのか横側に当たったのかの判定だと思います。 当たり判定の方法には角度を元にした判定方法、ベクトルの外積を使った判定方法など様々なものがあります。「正確に求めたい」「簡単に求めたい」「速く求めたい」などの用途によって使い分けると良いかもしれません。
0そうだね
プレイ済み
返信[23]
親投稿
おちゃめ ochame_nako
ベクトルの外積を使った方法はポピュラーな方法の1つです。 これはボールの角度とブロックの角度を求めてその大小を比較するのと同じことですが、ATANで2つの角度を求めるのではなくベクトルA=(Ax,Ay)、ベクトルB=(Bx,By)の外積A×Bは|A||B|sinθ(θはAから見たBの相対角度を示す)となりますが、これはAx*By-Ay*Bxとなります。 つまり、Ax*By-Ay*Bxを求めれば相対角度が分かるということです。 縦横判定はどちら側にボールがあるのかだけ分かれば良いのでAx*By-Ay*Bxの正負だけ分かれば問題ありません。 つまり単純な減算と乗算だけで済むというわけです。 これがATANを使った方法であれば単純に差分を取ればOKということはなく場合分けも必要となるためベクトルの外積を使った相対角度による判定はかなり有用な方法だと思います。
0そうだね
プレイ済み
返信[24]
親投稿
おちゃめ ochame_nako
ブロックの中心を原点(0,0)とした時のブロックの頂点の座標を(AX,AY)、ボールの座標を(BX,BY)とすればAX*BY-AX*BYが正か負かでブロックの中心と頂点を結んだラインを境にしてどちら側にボールがあるかが分かります。これを利用すれば縦横どちらに当たったのかの判定は可能ということです。 あとは、先日の坂道の当たり判定のようにGRPを使って縦横判定を行うという方法もあります。 ブロックやボールがスプライトであってもGRPの上に描画するなり透明色のGRPを使えば何ら問題はありません。 方法は1つではなく無数にあるので用途などに応じて選択すると良いと思います。
0そうだね
プレイ済み
返信[25]
親投稿
おちゃめ ochame_nako
一部訂正 ベクトルの外積において「Ax*By-Ay*Bxを求めれば相対角度が分かる」は正しくは「Ax*By-Ay*Bxを求めればsinθの値が分かる」です。 角度をちゃんと求めようとするならばarc sin(ASIN関数)を使う必要があります。
0そうだね
プレイ済み
返信[26]
親投稿
ありがとうございます。テストプログラムで、判定の際に左と上に当たっているという意味がわからないことになってたんです。そんな簡単な乗除の計算で縦横どっちに当たったかが分かるんですね。当たった際にx座標とy座標どちらが原点に近いかで求めるんですか、、。
0そうだね
プレイ済み
返信[27]
親投稿
おちゃめ ochame_nako
線を挟んでどちら側にあるかを知りたい(相対角度が0~180度か0~ー180度かを知りたい)場合はベクトルの外積、相対角度が鈍角か鋭角かを知りたい場合はベクトルの内積、絶対角度を求めたい場合はATANという感じで使い分けると良いと思います。 単純に座標の大小比較だけで判断しても縦横判定は可能なのですが、難しいのは角の付近にボールがある場合です。 そういう場合でもベクトルの外積を使えばどちら側にあるのかが分かるということです。 坂道のように基準とする直線を一次関数として考えて座標を元に傾きや切片を求めるとベクトルの外積を使わなくても判定は可能になります。 こんな感じで正解は1つではなく無数にあるわけです。
0そうだね
プレイ済み