I don't know how you're encapsulating the ball logic, but here's how I might try to do it. Using a class such as this guarantees all the internal logic of the ball is in one place so that the resulting drawing rectangle can be predicted based on the position and bounds. No more disappearing balls from using vector2's!
public class Ball
{
private Vector2 _position;
private Vector2 _velocity;
private Point _bounds;
public Vector2 Position { get { return _position; } set { _position = value; } }
public Vector2 Velocity { get { return _velocity; } set { _velocity = value; } }
public int LeftSide { get { return (int)_position.X - (_bounds.X / 2); } }
public int RightSide { get { return (int)_position.X + (_bounds.X / 2); } }
public Rectangle DrawDestination
{
get
{
return new Rectangle((int)_position.X, (int)_position.Y, _bounds.X, _bounds.Y);
}
}
public Ball(Texture2D ballTexture)
{
_position = Vector2.Zero;
_velocity = Vector2.Zero;
_bounds = new Pointer(ballTexture.Width, ballTexture.Height);
}
public void MoveToCenter()
{
_position.X = 400.0f;
_position.Y = 250.0f;
}
public void Update(GameTime gameTime)
{
_position += _velocity;
}
}
Then in your update/draw code:
class Game
{
void Update(GameTime gameTime)
{
// ...
ball.Update(gameTime);
if(ball.LeftSide < LEFT_BOUNDS)
{
score.blueScore++;
ball.MoveToCenter();
}
if(Ball.RightSide > RIGHT_BOUNDS)
{
score.greenScore++;
ball.MoveToCenter();
}
// ...
}
void Draw(GameTime gameTime)
{
// ...
_spriteBatch.Draw(ballTexture, ball.DrawDestination, Color.White);
// ...
}
}
Remember to also modulate velocity of the ball by the elapsed frame time.