0

私はPongクローンを作成しており、変数を次のように処理しています。

direction = a value from 0 to 2*pi 
distX = cos(direction)*speed of the ball
distY = sin(direction)*speed of the ball

on update:
ball's x position += distX
ball's y position += distY

ボールが壁に当たったとき(90度で反射するだけ)、方向の反転を正しく処理できますが、パドルはどうですか?ボールが接続された後、ボールの角度と速度を最適に処理する方法がわかりません。

パドルのどこに当たるかによりますか?パドルが動いているかどうかは重要ですか?等

ここで数学を処理する合理的な方法がわかりません。

4

2 に答える 2

1

これを行う「正しい」方法はありません。コードを書いているのはあなたです。厳密な仕様がない限り、好きなように処理できます。

基本的に、ボールとパドルの衝突は、ボールと壁の衝突を処理するのと同じ方法で処理できます。つまり、反射角度を計算して、に割り当てるだけdirectionです。

パドルの速度に比例して反射角度を大きくしたい場合は、新しいに何らかの重みを適用するだけですdirection

しかし、それは本当にあなた次第です。

とにかく、たとえば、パドル速度を処理するコードを提供すると、誰かがさらに指示を与える可能性があります。

于 2012-01-24T16:19:16.997 に答える
0

あなたのパドルは長方形だと思いますか?簡単にするために、ボールがパドルの面にのみ当たる可能性があると仮定します(つまり、コーナーや側面には当たらない)。

Q:パドルのどこに当たるかによって異なりますか?A:パドルが軸に沿った長方形で、ボールがその表面にしか当たらない場合は、できません。

Q:パドルが動いているかどうかは重要ですか?A:これはあなたの選択です。ゲームの物理学は実際の物理学ではないため、ゲームを最高の状態でプレイするために何でも自由に行うことができます。

まず、ボールの方向を90度回転しても、ボールが壁から正確にたわむことはありません。ボールが壁にぶつかって死んでしまう極端なケースを考えてみましょう。ボールを90度回転させると、ボールは壁の横を平行に移動します。

あなたが現在していることを信じていますが、少し紛らわしいことに、ボールが垂直の壁に当たると、ボールの水平方向が逆になります。もちろん、これはボールの方向を90度回転させることと同じではありません。

パドルからボールに速度を与えたい場合は、ボールの動きをベクトルとして扱い、パドルの動きをベクトルとして扱います。次に、これら2つのベクトルを足し合わせます。ボールに与えられる速度を制御するために、係数を使用し(これを呼びますk)、ボールが一定の速度を維持する必要がある場合は、ボールの最終的な速度ベクトルを正規化します(ただし、速度を保存しているため) x、yコンポーネントの代わりに、それは必要ありません)。

if (ball hits paddle):
  k = 0.5;
  // paddle only moves horizontally, which simplifies the math
  paddle_vx = paddle_speed * paddle_xdirection;
  ball_vx = cos(ball_direction) * speed + k*paddle_vx; 
  ball_vy = - sin(ball_direction) * speed // flips from the collision
  ball_direction = atan2(ball_vy, ball_vx);
  ball_speed = 100; // always constant
于 2012-01-24T17:10:09.540 に答える