Search code examples
visual-studiomonogame

How to make this ball spawn in the middle instead at the side? MonoGame in VisualStudio


Trying to create a simple breakout game, I've written all the code, except i dont understand why the ball is on the side of the screen boundaries instead of on top the paddle(player).

Breakout game, ball on side

class Ball
{
    int Width => texture.Width;
    int Height => texture.Height;


    public Rectangle BoundingBox =>
        new Rectangle((int)position.X, (int)position.Y, Width, Height);

    Texture2D texture;
    Vector2 position;
    Vector2 speed;

    public void SetStartBallPosition(Rectangle rec)
    {

        position.X = rec.X + (rec.Width - Width);
        position.Y = rec.Y - Height;

        if (Game1.RandomNumber.Next(0, 2) < 1)
        {
            speed = new Vector2(-200.0f, -200.0f);
        }
        else
        {
            speed = new Vector2(200.0f, -200.0f);
        }


    }

    public void Draw(SpriteBatch sb)
    {
        sb.Draw(texture, position, Color.White);
    }

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

        if (position.X + Width > Game1.ScreenBounds.Width)
            speed.X *= -1;
            position.X = Game1.ScreenBounds.Width - Width;

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

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

TL;DR.

My ball spawns at the side instead of middle.

Thanks for Help!


Solution

  • In the SetStartBallPosition(Rectangle rec), You've set the ball position at the full width of the boundary box, minus the full width of the ball:

    position.X = rec.X + (rec.Width - Width);
    

    Assuming that rec is empty, then in order to get the center, you need to divide both width's there in half. Like this:

    position.X = rec.X + (rec.Width/2 - Width/2);
    

    Be aware that when dividing, that they shouldn't have decimals.

    Let me know if it works.