Question

I'm working on a pong game since I'm pretty new to XNA, and I've ran into a problem... i have 3 classes, "Game1.cs", "Ball.cs", and "GreenPaddle.cs".

The GreenPaddle.cs contains Rectangle gpRect, Texture2D gPtexture, Vector2 position.

I have movement and such, and in the ball class I have an intersect boolean. But when i try to initialize it in game1.cs i get errors. Here are the classes:

GreenPaddle.cs:

public class GreenPaddle
{
    Texture2D gPtexture;
    public Vector2 position;
    public Rectangle gpRect;
    public Vector2 origin;
    public int speed = 2;

    public GreenPaddle()
    {

    }

    public void LoadContent(ContentManager Content)
    {
        gPtexture = Content.Load<Texture2D>("greenpaddle");
        position = new Vector2(20, 200);
        gpRect = new Rectangle((int)position.X, (int)position.Y,
            gPtexture.Width, gPtexture.Height);
    }

    public void Update(GameTime gameTime)
    {
        KeyboardState keyState = Keyboard.GetState();

        //Movement
        PaddleMovement();

        //Border Collision
        isCollidingWithBorders();
      }

    public void Draw(SpriteBatch spriteBatch)
    {
        spriteBatch.Draw(gPtexture, position, gpRect, Color.LawnGreen);
    }
    public Boolean isCollidingWithBorders()
    {
        if (position.Y < 83 && gpRect.Y < 83)
        {
            position.Y = 83;
            gpRect.Y = 83;
            return true;
        }

        if (position.Y > 400 && gpRect.Y > 400)
        {
            position.Y = 400;
            gpRect.Y = 400;
            return true;
        }

        else { return false; }

    }

    public void PaddleMovement()
    {
        KeyboardState keyState = Keyboard.GetState();
        if (keyState.IsKeyDown(Keys.W))
        {
            position.Y -= speed;
            gpRect.Y -= speed;
        }
        if (keyState.IsKeyDown(Keys.S))
        {
            position.Y += speed;
            gpRect.Y += speed;
        }
    }
}

Ball.cs:

public class Ball
{
    GreenPaddle gPaddle;


    Texture2D ballTexture;
    Vector2 ballPosition;
    Rectangle ballRect;
    int speed = 2;
    bool movingUp, movingLeft;

    public Ball(GreenPaddle paddle)
    {
        this.gPaddle = paddle;
        movingLeft = true;
        movingUp = true;
    }

    public void LoadContent(ContentManager Content)
    {
        ballTexture = Content.Load<Texture2D>("ball");
        ballPosition = new Vector2(380, 225);
        ballRect = new Rectangle((int)ballPosition.X, (int)ballPosition.Y,
            ballTexture.Width, ballTexture.Height);

    }

    public void Update(GameTime gameTime)
    {
        BallMovement();

    }

    public void Draw(SpriteBatch spriteBatch)
    {
        spriteBatch.Draw(ballTexture, ballPosition, ballRect, Color.White);
    }

    public void BallMovement()
    {
        if (movingUp) { ballPosition.Y -= speed; }
        if (!movingUp) { ballPosition.Y += speed; }
        if (movingLeft) { ballPosition.X -= speed; }
        if (!movingLeft) { ballPosition.X += speed; }

        if (ballRect.Intersects(gPaddle.gpRect))
            movingLeft = !movingLeft;
                movingUp = !movingUp;

        if (ballPosition.Y < 85)
        {
            movingUp = false;
        }
    }
}

Game1.cs:

 public class Game1 : Microsoft.Xna.Framework.Game
{
    GraphicsDeviceManager graphics;
    SpriteBatch spriteBatch;

    GreenPaddle gPaddle = new GreenPaddle();


    Texture2D BackGround;

    public Game1()
    {
        graphics = new GraphicsDeviceManager(this);
        Content.RootDirectory = "Content";
        graphics.PreferredBackBufferHeight = 500;
    }

    protected override void Initialize()
    {

    Ball ball = new Ball(gPaddle);
        base.Initialize();
    }

    /// <summary>
    /// LoadContent will be called once per game and is the place to load
    /// all of your content.
    /// </summary>
    protected override void LoadContent()
    {
        // Create a new SpriteBatch, which can be used to draw textures.
        spriteBatch = new SpriteBatch(GraphicsDevice);

        BackGround = Content.Load<Texture2D>("pongBG");
        gPaddle.LoadContent(Content);
        //ball.LoadContent(Content);
    }

    /// <summary>
    /// UnloadContent will be called once per game and is the place to unload
    /// all content.
    /// </summary>
    protected override void UnloadContent()
    {
        // TODO: Unload any non ContentManager content here
    }

    /// <summary>
    /// Allows the game to run logic such as updating the world,
    /// checking for collisions, gathering input, and playing audio.
    /// </summary>
    /// <param name="gameTime">Provides a snapshot of timing values.</param>
    protected override void Update(GameTime gameTime)
    {
        // Allows the game to exit
        if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
            this.Exit();

        gPaddle.Update(gameTime);
        ball.Update(gameTime);//Error Line

        base.Update(gameTime);
    }

    /// <summary>
    /// This is called when the game should draw itself.
    /// </summary>
    /// <param name="gameTime">Provides a snapshot of timing values.</param>
    protected override void Draw(GameTime gameTime)
    {
        GraphicsDevice.Clear(Color.CornflowerBlue);

        spriteBatch.Begin();
        spriteBatch.Draw(BackGround, new Vector2(0f, 0f), Color.White);
        gPaddle.Draw(spriteBatch);
        ball.Draw(spriteBatch);//Error Line
        spriteBatch.End();

        base.Draw(gameTime);
    }
}

Thats it, I don't know what to do with the initialize part :/

Was it helpful?

Solution

Look carefully how you initialize your ball, you declare it in the scope of the method (Between the braces). This means you cannot access it anywhere else, which you are trying to do in the Update and Draw methods.

protected override void Initialize()
{
    Ball ball = new Ball(gPaddle);
    base.Initialize();
}

Additionally, as soon as the function ends your Ball object is deleted.

This can be fixed by putting Ball ball into your class scope so that it is available to all members of the class, like so:

Ball ball;  //In the class scope

protected override void Initialize()
{
    ball = new Ball(gPaddle);
    base.Initialize();
}

If your not familiar with scopes, check out this article (Nothing really good on MSDN)

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top