2012-02-25 15 views
0

私はXNAのスターターで、私はポンゲームを作ろうとしています。
私はポンゲームを作ることができましたが、すべてのコードは1つのクラスに含まれていました。だから私は少しOOPを追加しようと思っていました。ボールのクラスとパッドのクラスを作りました。XNA/Cで矩形を移動する最善の方法#

ボールは完全に動きますが、ボールをパッドからバウンスさせることができないようです。かどうかを確認するにはパッド
Game1.cs

#region left 
    if (_KBS.IsKeyDown(Keys.W) || _KBS.IsKeyDown(Keys.Z)) 
     Left.MoveUp(); 
    else if (_KBS.IsKeyDown(Keys.S)) 
     Left.MoveDown(); 
#endregion 

#region right 
    if (_KBS.IsKeyDown(Keys.Up)) 
     Right.MoveUp(); 
    else if (_KBS.IsKeyDown(Keys.Down)) 
     Right.MoveDown(); 
#endregion 

pad.cs

public void MoveUp() { 
    if (!paused) 
     RecPad.Offset(0, -speed); 

    CheckBorders(); 
} 

public void MoveDown() { 
    if (!paused) 
     RecPad.Offset(0, speed); 

    CheckBorders(); 
} 

private void CheckBorders() { 
    MathHelper.Clamp(recPad.Y, borders.Top, borders.Bottom - recPad.Height); 
} 

を移動するには

これらは私が使用しているコードボールバウンス 01私は 0を仕事に戻って、パッドを得るように見えた ball.cs

public void CheckBounce() { 
    if ((myBounds.Intersects(left) && movement.X < 0) || (myBounds.Intersects(right) && movement.X > 0)) 
      movement.X *= -1; 
} 

public void Draw(SpriteBatch sBatch, Texture2D texture, Color color, Rectangle left, Rectangle right) { 
    this.left = left; 
    this.right = right; 

    Move(); 

    sBatch.Begin(); 
    sBatch.Draw(texture, myBounds, color); 
    sBatch.End(); 
} 

pad.cs

public Rectangle RecPad { 
    get { return recPad; } 
    private set { recPad = value; } 
} 

Game1.cs

Ball.Draw(spriteBatch, ball, Color.White, Left.RecPad, Right.RecPad); 

MathHelper.Clampは詳細

ためmy codeを参照してください
を動作するようには思えないので、 問題は、RecPad は今、私は私のboundries作業を取得する必要があります
コンストラクタの代わりにoriginelのrecPadを使用することによって解決しているように見えます

このコードは、現在

private void CheckBorders() { 
     if (recPad.Top < borders.Top) 
      recPad.Location = new Point(recPad.X, borders.Top); 
     if (recPad.Bottom > borders.Bottom) 
      recPad.Location = new Point(recPad.X, borders.Bottom - recPad.Height); 
    } 

答えて

2

私の国境問題を修正これは、すぐに(CheckBounceから)私には際立っ:

movement.X *= 1; 

コピーエラー、または ' - 'を入れるのを忘れた可能性があります。

また、いくつかのコリジョンコードを効率化するためにRectangle.Contains/Intersectsメソッドを使用し、パドルを境界内に保つためにMathHelper.Clampを使用することを検討してください。これは、あなたのメソッドが機能するので、将来の参照のためのものですが、XNAの便利なツールを利用するといいです。

編集:

Rectangleクラスはメソッドが交差していると含まれ、その長方形はそれぞれ、別の長方形と交差するか、特定のポイントを含むされている場合を伝えることができます。これらの「便利なツール」をに関して。あなたのボールは左上の位置とテクスチャですが、ボールの半径もチェックしていますかどうかを確認しています。私はあなたのボールのための四角形の境界領域を定義し、衝突をチェックするために交差点メソッドを使用すると、より簡単な時間を持つと思います。それはにあなたの衝突コードを簡素化:

public void CheckBounce() 
{ 
    if (myBounds.Intersects(LeftPaddle.Bounds) || myBounds.Intersects(RightPaddle.Bounds)) 
     movement.X *= -1; 
} 

かなり単純ではなく、完全にsafe--ボールが動きの1つのフレームがそのパドルの境界からそれを解放しないであろうと、パドルに十分に移動する管理している場合、あなた永遠にXの速度を逆転させて、「つっかくボール」効果を生み出します。だから我々はそれを避けるために、もう少しチェックするコードを追加することができますインライン条件文は少しも密集している場合、私は謝罪

public void CheckBounce() 
{ 
    if ((myBounds.Intersects(LeftPaddle.Bounds) && movement.X < 0) || 
    (myBounds.Intersects(RightPaddle.Bounds) && movement.X > 0)) 
     movement.X *= -1; 
} 

。これが意味することは、ボールが左に移動して右のパドルに当たった場合は、Xを反転させます。同様に、右に移動して左のパドルに当たった場合は、Xを反転します。

MathHelper.Clampについては、あなたの状況ではパドルの移動を制限するために使用します。 MathHelper.Clampは、上限と下限の間の値を単にクランプします。これは、Math.Min、Math.Maxを使用するのと同じです。

private void CheckBorders() 
{ 
    //clamps a  value to a min and a   max 
    MathHelper.Clamp(recPad.Y, borders.Top, borders.Bottom - recPad.Height); 
} 

これはあなたの国境のトップ、そしてあなたの国境の下のマイナス矩形の高さとの間に、あなたの長方形のY位置をクランプ。その最後のビットは、高さを考慮に入れて、四角形の下端が境界の下端を切り取るのを防ぎます。

+0

+1パドルが常に垂直に整列されている古典的なポンの場合、Xの速度を反転するだけでうまくいくはずです。 –

+0

迅速な対応をありがとう!あなたが言及したテクニックの詳細を教えていただけますか? BTW:ボールは長方形ではなく、ちょうどVector2が上の左の位置にあるTexture2D – GroundZero

+0

くそー!私のパッドはもう動かないようですね?私はそれが_RecPad.Offset(0、スピード)によって引き起こされたと信じています_しかし、私は確信していません – GroundZero

関連する問題