実際、何もすることはできませんが、アウトバウンドの角度はパドルのどこに当たるかによって決まります。
私は決して擬似/ Cコードで何かを書くつもりですので、私はiPhoneや目的Cのコードを行ったことがない。
まず私は、速度ベクトルの長さである速度を、計算、またはたい:
double speed = sqrt(velX * velX + velY * velY); // trigonometry, a^2 + o^2 = h^2
その後、我々は、我々は、パドルを打つ場所に基づいて、新しい角度を計算します。 impact XのX衝突とpaddleLengthのパドルの長さを格納すると仮定します。そうすることで、アウトバウンドの角度を計算することができます。まず、我々は-1と1の間の値を取得するようにそれ以来、
double proportionOfPaddle = impactX/(double) paddleLength; // between 0 and 1
double impactRange = proportionOfPaddle * 2 - 1; // adjust to -1 and 1
が90度を我々は側に完全にボールをそらすためにしたくないと仮定しましょう、または範囲を計算する方法を見つけ出すてみましょう回復するのはかなり難しいでしょう。私はimpactRangeを新しいvelYとして使うつもりなので、私はそれを-0.9から0.9にスケールダウンします。
ここでvelXは速度が一定になるように計算する必要があります。
double newVelX = impactRange;
double newVelY = sqrt(speed * speed - newVelX * newVelX); // trigonometry again
これで、newVelXとnewVelYが返され、影響と速度に依存するバウンスが発生しました。
幸運を祈る!
(ここではバグが多いかもしれませんが、私はXまたはYを反転させているかもしれませんが、一般的な考えを得ることを望みます)。
EDIT:impactXを取得することについての考えを追加してください。
あなたはball.center.xとpaddle.center.xを持っているとしましょう(あなたが何を呼んでいるのかわからないが、paddle.center.xがパドルの中心を与えると仮定しよう)それからimpactRangeを計算できるはずです。
ボールの半径(ball.widthは直径と見なします)とパドルのサイズ(paddle.width?)も必要です。
ballPaddleDiffの最小値は、ボールがパドルの側面にちょうど接触しているときです。そのballPaddleDiffはpaddle.width/2 + ball.width/2になります。だから、新しいimpactRangeしたがって、ボールが星や何かにオフに撮影しないように、それは実際の間-1と1になるように、あなたはおそらくimpactRangeをチェックする必要があります
double impactRange = ballPaddleDiff/(double) totalRange/2;
だろう。
優秀!これは立ち上げて実行するのが簡単でした。私はimpactX値を格納しません。私はボールがパドルの矩形内にあるかどうかを確認し、ball.center.yを反転させます。私はimpactXのためにball.center.xを使ってみましたが、時にはボールがエッジに当たってまっすぐにバウンスします。どのようにimpactXを計算していますか? – 4thSpace