简体   繁体   中英

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

So I'm trying to figure out how to split the rectangle of my paddle up so i can define different points on the paddle at which the ball can be hit. I want to make it so that if the ball is hit on either the left or right side of the paddle, then the ball direction will change slightly rather than following the exact same path every time.

Here is my paddle class (I started writing the code I would need in the isboxcolliding method but got stuck and confused):

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;
        }
    }
}

}

any help would be greatly apreciated!

You do not necessarily need to split the collision rectangle up. You can check if the collision is on the left or right side by having the following information.

  • The collision point or the centre position of the ball when the collision occurs, lets call it Vector2 collisionPoint
  • Centre position of the paddle, lets call it Vector2 paddleCentrePosition

This only works if the paddle does not rotate.

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*/
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM