反射角


11

私はこの「ブレイクアウトスタイル」のゲームを持っています。

中央に大砲、大砲の周りにブロック、ブロックの周りにパッドがあります。これはゲームがどのように見えるかです:

円形のブレイクアウトゲーム

ピクセルあたりの衝突を取得することができ、ボールはブロックとの接触時に次の計算で「反射」します。

Ball.Direction = 2 * (Block.Direction - Ball.Direction) + 180;

反射角の計算を表す画像

青い線はボールの方向、黒い線(ベースライン)はブロックの表面です。

方向はラジアンで表された角度です(もちろん度に変換できます)。
ボールは次のように動かされます:

// Event.ENTER_FRAME
x += Math.sin(Direction) * Velocity;
y -= Math.cos(Direction) * Velocity;

ここまでは順調ですね。

私の問題は、パッド(小さな色のブロックの周りにある3つの暗いブロックと大きなブロック)で発生します。

向きを変えると、表面の角度が変化します。
それ以上に、ボールも側面に当たるはずなので、打球の方向と新しいボールの移動方向をどのように測定できますか?

ps:必要に応じて、コードと再生可能なswfを提供できます。


編集

OK、角度の問題はVectorsで解決されましたが、側面と後方衝突の問題はまだ残っています。

そのための別の質問を開き、ここにリンクします。


3
アカウントを再度関連付けると、+ 100の評判ボーナスが得られます。プロファイルの[アカウント]タブのオプションにする必要があります。それまでの間、それらの画像を投稿します。
猶予ノート

私はあなたの方向を0と360の間の角度で収集し、三角法を使用しているボールを動かすには?
ジョナサンコネル2011年

@Grace、画像をありがとうございました... @ 3nixios、角度とモーションに関する詳細を追加しました。
NemoStein

ブロックごとに「方向」を1つだけ保存する場合、各黒のブロックを、「方向」の面が常に外側を向く4つの個別のブロックのグループとして再想像するかもしれません。おそらく四隅にエッジケースがあるでしょう。
horatio

回答:


8

あなたの問題を正しく理解したかどうかはわかりませんが、あなたがしたいのは、衝突後のボールの方向を見つけることだと思いました。

これは、可能な解決策を示す私のホワイトボードの簡単な描画です。

ここに画像の説明を入力してください

緑の矢印はボールの速度を(ベクトルとして)表し、青いブロックは大きな黒いブロックを表し、赤い矢印は結果のベクトルです。

最初のケースでは、青いブロックの傾きは30度です。衝突の問題を修正する方法の1つは、すべてを水平軸に戻すことです。すべてを30度(ブロックの傾斜)だけ回転させる必要があります(そのために行列を使用できます)。

次に、衝突の発生元確認します。衝突が水平であった場合、速度のx成分を逆にします。垂直な場合(この場合のように)、yコンポーネント(ball.Velocity.Y = -ball.Velocity.Y)。これにより、ボールがコーナーに当たったときにボールが正しく動作します(両方のコンポーネントが反転します)。その後、回転させるだけで実際の状況に戻ることができます(図面にはありません)。

2番目の場合も同じですが、ボールの速度がブロックに対して垂直ではありません。70度回転し、衝突の発生元を確認し、適切なコンポーネントを反転します。その後、実際の状況に戻ります。

注:ベクトルではなく角度を使用して方向を表していることに気付きました。これらの計算用のベクトルを作成するか、同じ一般的な考え方を維持しながら角度を操作することができます。

これは確かに最善の方法ではありません。何らかの方法で計算できると思いますが、問題の解決策になると思います。


ありがとう...ボードを追加しました。私はすぐに試してみる...ああ、あなたはベクトルが維持/作業する方が良いと思いますか?
NemoStein

ははは、私の下手な描画スキルを許してください。
ジェシーエモンド2011年

おっと、私は実際に描画中に重要なステップを忘れました。-block inclination angle適切な衝突応答を得るには、で回転し直す必要があります。
ジェシーエモンド2011年

個人的な好みだと思いますが、ベクターの方が好きです。ほとんどの場合、背後にある数学について考える必要はなく、通常はコードがよりクリーンになります。したがって、Direction(ベクトルとして)を保持し、ボールの位置を次のように更新できますball.Position += ball.Direction * ball.Speed;
Jesse Emond、2011年

@ジェシー、今までこれができなかった。あなたの方法は完全に理解できましたが、実装できませんでした。これを行うには、ラジアン角度を使用する部分全体を書き直してベクトルを使用する必要があります(これは実際にはそれほど多くありません)。とりあえず、他の代替案を試してみます。別の代替案があれば、喜んで試してみます。ありがとう。
NemoStein
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.