2013-07-27 41 views
1

我正在打乒乓球比賽,因爲我對XNA相當陌生,而且我遇到了問題... 我有3個課程,"Game1.cs","Ball.cs""GreenPaddle.cs"XNA - 「球」這個名字在當前的情況下不存在

GreenPaddle.cs包含Rectangle gpRectTexture2D gPtextureVector2 position

我有運動等,在球類中我有一個相交布爾值。 但是,當我嘗試初始化它在game1.cs我得到的錯誤。下面是類:

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

完蛋了,我不知道如何處理初始化部分:/

回答

4

仔細看看你如何初始化你的球,你在方法的範圍內(大括號之間)聲明它。這意味着您無法在其他任何地方訪問它,您在UpdateDraw方法中嘗試執行此操作。

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

此外,一旦函數結束,您的Ball對象被刪除。

這可以通過將Ball ball到您的類範圍是固定的,這樣它可在類的所有成員,就像這樣:

Ball ball; //In the class scope 

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

如果你不熟悉的領域,看看this文章(沒有MSDN上確實不錯)

+0

非常感謝你告訴我,並解釋:) 我討厭當人們只給出了最終的代碼,而無需進一步解釋,GJ人:DD –

+0

@UffePuffe沒問題:) – Cyral

+0

現在,我得到另一個錯誤..:/ 在我的Game1中.cs我在gPaddle.Update(gameTime)上得到錯誤;' 「NullReferenceExecption was unhandled」。對不起,如果我討厭..:/// –

相關問題