尝试为突破游戏定义桨上的位置以创建更好的球碰撞物理

trying to define location on paddle for breakout game to create better ball collision physics

所以我想弄清楚如何将球拍的矩形分开,这样我就可以在球拍上定义可以击球的不同点。我想做的是,如果球被击中球拍的左侧或右侧,那么球的方向将略有变化,而不是每次都遵循完全相同的路径。

这是我的桨 class(我开始编写我在 isboxcolliding 方法中需要的代码,但卡住了并感到困惑):

class Ball
{
    Texture2D texture;
    Vector2 position;
    Vector2 speed;
    Rectangle bounds;
    Rectangle screenBounds;
    Random rnd = new Random();
    bool collisionWithBrick; // Prevents rapid brick removal.



    public Ball(Texture2D texture, Rectangle screenbounds) // Constructor
    {
        this.texture = texture;
        this.screenBounds = screenbounds;
    }

    public int Width
    {
        get { return texture.Width; }
    }

    public int Height
    {
        get { return texture.Height; }
    }

    public Rectangle Bounds
    {
        get
        {
            bounds = new Rectangle((int)position.X, (int)position.Y,
                Width, Height);

            return bounds;
        }
    }

    public void SetStartBallPosition(Rectangle paddle)
    {
        position.X = paddle.X + (paddle.Width - Width) / 2;
        position.Y = paddle.Y = paddle.Y - Height;
        bounds = Bounds;

        if (rnd.Next(0, 2) < 1)
            speed = new Vector2(-200.0f, 200.0f); // Move ball left.
        else
            speed = new Vector2(200.0f, -200.0f); // Move Ball Right.
    }

    internal void Deflection(MultiBallBrick multiBallBrick)
    {
        if (!collisionWithBrick)
        {
            speed.Y *= -1;
            collisionWithBrick = true;
        }
    }

    internal void Deflection(ReinforcedBrick reinforcedBrick)
    {
        if (!collisionWithBrick)
        {
            speed.Y *= -1;
            collisionWithBrick = true;
        }
    }


    public void Draw(SpriteBatch spriteBatch)
    {
        spriteBatch.Draw(texture, position, Color.Silver);
    }


    // Check if our ball collides with the right paddle.
    public void IsBoxColliding(Rectangle paddle)
    {

        if (bounds.Intersects(paddle))
        {
            int center = paddle.Center.X - bounds.Center.X;


            if (center > )
            {
                speed.Y *= -1;



                speed.X = speed.X * 1.5f;
            }
        }

        /*if (paddle.Intersects(bounds)) // Bounds = our ball
        {
            position.Y = paddle.Y - Height;
            speed.Y *= - 1; // Reverse the direction of the ball.
        }*/
    }

    public void Update(GameTime gameTime)
    {
        collisionWithBrick = false;
        position += speed * (float)gameTime.ElapsedGameTime.TotalSeconds;


        // Check to see if the ball goes of the screen.
        if (position.X + Width > screenBounds.Width) // Right side
        {
            speed.X *= -1;
            position.X = screenBounds.Width - Width;
        }

        if (position.X < 0) // Left side
        {
            speed.X *= -1;
            position.X = 0;
        }

        if (position.Y < 0) // Top
        {
            speed.Y *= -1;
            position.Y = 0;
        }
    }

    public bool OffBottom()
    {
        if (position.Y > screenBounds.Height)
            return true;

        return false;
    }

    public void Deflection(Brick brick)
    {
        if (!collisionWithBrick)
        {
            speed.Y *= -1;
            collisionWithBrick = true;
        }
    }
}

}

如有任何帮助,我们将不胜感激!

您不一定需要拆分碰撞矩形。您可以通过以下信息来检查碰撞是在左侧还是右侧。

  • 碰撞发生时的碰撞点或球的中心位置,姑且称之为Vector2 collisionPoint
  • 桨的中心位置,我们称之为Vector2 paddleCentrePosition

只有在球拍不旋转的情况下才有效。

Vector2 difference = collisionPoint - paddleCentrePosition;
if(difference.x > 0) {
    /*Right side of the paddle*/
}
else if(difference.x < 0) {
    /*Left side of the paddle*/
}
else{
    /*The exact same position*/
}