2017-01-17 6 views
0

私はブレークアウトクローンの反射を扱う方法を見つけようとしています。ボールの反射角度Xna c#

私は次の段落の代わりに投稿に画像をアップロードしますが、私はまだまだその特権を得ていません。

ボールが左手と交差する場合は、左に跳ね返りたいと思います。 ボールが右手と交差する場合、右に跳ね返りたいと思う。ボールが中央のセクションと交差する場合、私はそれが途中で跳ね返りたいと思う。私はそれがどのように左、右、または中央のセクションのどの側面が交差していたかに応じて、さまざまな方向にバウンスさせる方法を学びたい

私はこれに3つの別々の矩形を使用しないと思います。 1人でやってください。

私はそれが位置だボールの速度、projVel.

のためのベクトル2を使用し、私はできないので、私は場合の始まりのためproj.collRectを使用lightRect.

理由があるパドルのためprojPos.

長方形でありますVector2でintersectメソッドを使用します。

これは現在の私の一時的な衝突ハンドラですが、動作しますが、速度はゲームを再生できない程度に変化させます。スピードクランプ私はそれを少し遅く思った。私はprojSpeedの変数を持っています。私はそれをクランプすることはできません、または停止することはできません。

if (proj.collRect.Intersects(lightSaber.lightRect)) 
    { 
       proj.projPos.Y = lightSaber.lightRect.Y - proj.projTxr.Height; 
       proj.projVel.Y *= -1; 

     proj.projVel.X = 10 * (proj.projPos.X - lightSaber.lightRect.Center.X)/(lightSaber.lightRect.Center.X); 
    } 

      proj.projVel.X = Math.Max(-4, Math.Min(proj.projVel.X, 4)); 
      proj.projVel.Y = Math.Max(-4, Math.Min(proj.projVel.Y, 4)); 

私がこれをやり遂げる方法を教えてもらえたら助かります。メソッド、または.Intersectsの代わりに、私はcollRectの代わりにprojPosを使用できます。

どこから始めたらいいかわかりませんが、別の方法があれば、その例は素晴らしいでしょう。

+0

、ゲーム開発スタック交換で男の上には、助けることができるかもしれません! –

+0

ありがとうございました! – LawrenceB

答えて

0

XとYの速度を別々に操作する代わりに、位置に基づいて反射角を計算し、衝突前の角度と速度から速度を導き出すことをお勧めします。

例:あなたがここに答えが得られない場合は

// NOTE: this code assumes that positive Y is down 
if (proj.collRect.Intersects(lightSaber.lightRect) && projPos.projVel.Y > 0.0f) // only bounce if projectile is moving downward 
{ 
    // remember current speed for when we calculate new velocity 
    var projSpeed = projVel.Length(); 

    // make sure the projectile no longer intersects the bar 
    proj.projPos = lightRect.Y - proj.projTxr.Height; 

    // interpolate reflection angle 
    var t = (proj.projPos.X - lightSaber.lightRect.X)/lightSaber.lightRect.Width; 
    var reflectDegrees = 150.0f - t * 120f; // straight up +/- 60 degrees 
    var reflectRadians = reflectDegrees * (float)Math.PI/180.0f; 

    // final velocity determined by angle and original projectile speed 
    proj.projVel = new Vector2((float)Math.Cos(reflectRadians) * projSpeed, -(float)Math.Sin(reflectRadians) * projSpeed); 
} 
+0

これは興味深いことですが、これは完全に機能しません。打ち上げ後に戻ってくると、やや右に動いているパドルの上に止まります。私がパドルをそれに沿って動かすと、プロは基本的に2D飛行機のように見えます。私の講師はそれをどうやって行うのか拒否し、それを正しくしようとすると15時間以上も費やしてしまった。私はあなたが私に見せたものを修正しようとしましたが、私はそれをすることはできません。プロジエクトがバーと交差しないようにするには、最後に.Yを入れなければならないか、それを完了できなくてもいいです。 – LawrenceB

+0

申し訳ありませんが、正のYがダウンしているので、速度計算を間違えたと思います。 Y成分は無効にする必要があります(90度の正弦は1ですが、-1を取得したい)。私はこれを反映するために私の答えを編集します。 – RogerN

+0

途中でありがとうございました。プロジは左側のパドルと交差するとパドルの右端に向かって進行し、反射します。私はvar t行のコードに問題があると思います。しかし、私は確信することはできません。 – LawrenceB