2017-12-11 31 views
0

私はmonogameと私のヒット検出にいくつかの問題を抱えて私はポンゲームを作成しようとしています。私はボールが左のパドルに当たったときにボールを方向転換させたいが、何らかの理由で衝突が唯一のものではなく上で検出されるので、ボールはパドルの側面を通過するが、トップに当たるとバウンスする私は間違って何をしていますか? HERESに私のコードMonogame衝突検出が正しく動作しません

バットクラスの一部

public class Bat : DrawableGameComponent 
{ 
    private SpriteBatch spriteBatch; 
    private Texture2D tex; 
    private Vector2 speed; 
    private Vector2 position; 
    private Vector2 stage; 
    public Rectangle Rectangle 
    { 
     get 
     { 
      return new Rectangle((int)position.X, (int)position.Y, tex.Width, tex.Height); 
     } 
    } 

    public Bat(Game game, 
     SpriteBatch spriteBatch, 
     Texture2D tex, 
     Vector2 position, 
     Vector2 speed, 
     Vector2 stage): base(game) 
    { 
     this.spriteBatch = spriteBatch; 
     this.tex = tex; 
     this.position = position; 
     this.speed = speed; 
     this.stage = stage; 
    } 

衝突クラス更新方法

public override void Update(GameTime gameTime) 
{ 
    if (ball.Rectangle.Intersects(bat.Rectangle)) 
    { 

     ball.speed.Y = -Math.Abs(ball.speed.Y); 
     hitSound.Play(); 
    } 

    base.Update(gameTime); 
} 

とBATと衝突検出

Texture2D batTex = this.Content.Load<Texture2D>("Images/BatLeft"); 
Vector2 batPos = new Vector2(100,100); 
Vector2 batSpeed = new Vector2(4, 0); 
bat = new Bat(this, spriteBatch, batTex, batPos, batSpeed, stage); 
this.Components.Add(bat); 

SoundEffect dingSound = this.Content.Load<SoundEffect>("Music/ding"); 

CollisionDetection cd = new CollisionDetection(this, ball, bat, dingSound); 
this.Components.Add(cd); 
+0

、バットとボールの矩形が(あなたが 'Rectangle'クラスの代わりに、独自の変数を使用している)に定義されていない、標準として長方形を使用してみてくださいgetメソッドを持たない変数。すぐに公共の変数から呼び出します。 – Steven

+0

ここでも円と四角形の衝突が必要で​​す。 –

答えて

0

たびを追加するゲームクラスボールの矩形がパドルの矩形と交差し、あなたがボールの方向を反転させている私は速度です。このメソッドは、オブジェクトの上または下にのみ衝突するときに正常に機能します。

ボールがパドルの上端に衝突すると、そのパドルの長方形に矩形が侵入します。ボールの現在の下向きの速度を上向きの速度に戻すことによって、ボールの長方形をパドルの長方形から完全に取り除くことができます。あなたのボールは、側面に衝突するたび

は、
{0, ballspeed}
から
{0, -ballSpeed}
へのボールの速度変化は、最も可能性の高いパドルの長方形からボールの四角形を解放するのに十分ではありません。この。そして、長方形から自由でないならば、次の更新は方向を再び逆転させて、前の更新を取り消します。ボールは、パドルが動くまで長方形にくっついたままになります。

問題を解決するには、ボールがパドルの上面、側面、または底面に影響を与えるかどうかを確認する必要があります。それに応じて、ボールの動きを調整します。私は助けることができる

// Moves and checks for collision on the Y-axis 

position.Y += ball.speed.Y; 
if (Hitbox().Intersects(obstacle)) 
{ 
    position.Y -= ball.speed.Y; 
    ball.speed.Y = -ball.speed.Y; 
} 

// Moves and checks for collision on the X-axis 

position.X += ball.speed.X; 
if (Hitbox().Intersects(obstacle)) 
{ 
    position.X -= ball.speed.X; 
    ball.speed.X = -ball.speed.X; 
} 

希望:

あなたがここに始めるためには、私の古い衝突検出方法の一つの例です。私の説明やコードについてご質問がありましたら、お気軽にお問い合わせください。その様子から

-GHC

関連する問題