2009-06-18 5 views
1

ボールをパドルに当たる場所に応じてある角度でボールを振りたい。今は、y座標を変更しているだけなので、面倒な偏向があります。それは角度をつけますが、パドルに対する衝突場所とは独立しています。私は何かもっと楽しいです。速度、運動量、質量などの要素を考慮する必要はありません。パドルの着弾位置に応じて角度を変えます。私はこのNot a number error (NAN) doing collision detection in an iphone appを読んだことがありますが、私が探しているものはあまりにも複雑です。たわみを計算する簡単な方法はありますか?ボールがパドルに当たったときの角度を変える

オブジェクトは2つのUIImageViewです。

答えて

4

実際、何もすることはできませんが、アウトバウンドの角度はパドルのどこに当たるかによって決まります。

私は決して擬似/ 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; 

だろう。

+0

優秀!これは立ち上げて実行するのが簡単でした。私はimpactX値を格納しません。私はボールがパドルの矩形内にあるかどうかを確認し、ball.center.yを反転させます。私はimpactXのためにball.center.xを使ってみましたが、時にはボールがエッジに当たってまっすぐにバウンスします。どのようにimpactXを計算していますか? – 4thSpace

0

あなたは必ずしも現実的にしたいとは限りません。楽しみたいです。それらは常に同じではありません。あなたが現実的にしたい場合は、速度、勢い、質量などを捨てることはできません。ピンポンの通常のゲームでは、それがパドルに当たるポイントは本当に問題ではない、テニスラケットのようなスイートスポットではありません。

ボールの出力角度と速度を表す出力ベクトル、ベロシティと単位ベクトルを返す数学関数を作成し、入力角度、速度、パドル上のインパクトポイント、およびパドル。

出力角度= -1 *入力角度が既に期待されます。出力速度もまた、入力速度の-1倍であると予想される。あなたがそれを混ぜたい場合は、それらを調整します。パドルの中心からの距離に比例して出力角度を大きくすることができます。ヒットしたときのパドルの速度に比例した角度または速度を増やすこともできます。

あなたはそれを行うことができる方法がたくさんあるので、どの機能を使用するのか正確には分かりません。テストと再生でそれを理解しなければなりません。あなたがまだもっと多くの情報を必要とする場合は、あなたの質問に詳細を追加してください。

+0

おかげで動作します。私はあなたが正しい現実的ではなく「楽しい」を反映するように質問を編集しました。しかし、まだコードを設定するためのアドバイスが好きです。 OPで触れたように、私は計算を行う上でより簡単な道を歩みたいと思っています。 – 4thSpace

0

次のコード(ObjCに変換するのに十分簡単ですが)は、着信する2Dベクトルを取り込み、サーフェス法線(あなたのポンバットの顔)に基づいてそれを反映します。

「スカラー」に適用するオフセットをランダム化することで、ランダムな「楽しい要素」を追加して、反射角度を変更するためにベロシティを変更したり、サーフェスの法線に追加することができます。

私は私のiPhoneのプロジェクトでこれを使用していて、それが正常に:)

void vec2ReflectScalar(vec2& vResult, const vec2& v1, const vec2& normal, float scalar) 
{ 
    vec2 _2ndotvn; 
    float dotVal = vec2DotProduct(v1, normal); 

    vec2Scale(_2ndotvn, normal, scalar * 2.f * dotVal); 
    vec2Subtract(vResult, v1, _2ndotvn); 
} 

void vec2Reflect(vec2& vResult, const vec2& v1, const vec2& normal) 
{ 
    vec2ReflectScalar(vResult, v1, normal, 1.f); 
}