2012-05-12 70 views
1

我想爲XNA和C#製作一個簡單的3D遊戲。我試圖創建視圖矩陣,如每個教程,甚至MSDN建議的,但我得到一個NullReferenceException錯誤。XNA中的NullReferenceException與C#

錯誤顯示爲:對象引用未設置爲對象的實例。 它指向投影矩陣的定義:

projectionMatrix = Matrix.CreatePerspectiveFieldOfView(MathHelper.PiOver4, device.Viewport.AspectRatio, 1.0f, 300.0f); 

這裏是我的代碼:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using Microsoft.Xna.Framework; 
using Microsoft.Xna.Framework.Audio; 
using Microsoft.Xna.Framework.Content; 
using Microsoft.Xna.Framework.GamerServices; 
using Microsoft.Xna.Framework.Graphics; 
using Microsoft.Xna.Framework.Input; 
using Microsoft.Xna.Framework.Media; 

namespace Series3D1 
{ 
    public class Game1 : Microsoft.Xna.Framework.Game 
    { 
     Effect effect; 

     VertexPositionColor[] vertices; 

     Matrix viewMatrix; 
     Matrix projectionMatrix; 

     GraphicsDeviceManager graphics; 
     SpriteBatch spriteBatch; 

     GraphicsDevice device; 

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

     protected override void Initialize() 
     { 
      graphics.PreferredBackBufferWidth = 500; 
      graphics.PreferredBackBufferHeight = 500; 
      graphics.IsFullScreen = false; 
      graphics.ApplyChanges(); 

      Window.Title = "Riemer's XNA Tutorials -- Series 1"; 

      base.Initialize(); 
     } 

     protected override void LoadContent() 
     { 
      spriteBatch = new SpriteBatch(GraphicsDevice); 

      SetUpCamera(); 

      effect = Content.Load<Effect>("effects"); 

      SetUpVerticies(); 

      device = graphics.GraphicsDevice; 
     } 

     protected override void UnloadContent() 
     { 

     } 

     protected override void Update(GameTime gameTime) 
     { 
      if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed) 
       this.Exit(); 

      base.Update(gameTime); 
     } 

     protected override void Draw(GameTime gameTime) 
     { 
      GraphicsDevice.Clear(Color.CornflowerBlue); 

      effect.CurrentTechnique = effect.Techniques["ColoredNoShading"]; 

      effect.Parameters["xView"].SetValue(viewMatrix); 
      effect.Parameters["xProjection"].SetValue(projectionMatrix); 
      effect.Parameters["xWorld"].SetValue(Matrix.Identity); 

      foreach (EffectPass pass in effect.CurrentTechnique.Passes) 
      { 
       pass.Apply(); 
      } 

      device.DrawUserPrimitives(PrimitiveType.TriangleList, vertices, 0, 1, VertexPositionColor.VertexDeclaration); 

      base.Draw(gameTime); 
     } 

     private void SetUpVerticies() 
     { 
      vertices = new VertexPositionColor[3]; 

      vertices[0].Position = new Vector3(0f, 0f, 0f); 
      vertices[0].Color = Color.Red; 
      vertices[1].Position = new Vector3(10f, 10f, 0f); 
      vertices[1].Color = Color.Green; 
      vertices[2].Position = new Vector3(10f, 0f, -5f); 
      vertices[2].Color = Color.Yellow; 
     } 

     private void SetUpCamera() 
     { 
      viewMatrix = Matrix.CreateLookAt(new Vector3(0, 0, 50), new Vector3(0, 0, 0), new Vector3(0, 1, 0)); 
      projectionMatrix = Matrix.CreatePerspectiveFieldOfView(MathHelper.PiOver4, device.Viewport.AspectRatio, 1.0f, 300.0f); 
     } 
    } 
} 
+0

您是否檢查過device.Viewport或device.Viewport.AspectRatio是否爲空值? – ivowiblo

+0

檢查我的答案的底部,以便調試提示,以便更輕鬆地解決這些類型的錯誤。 –

+0

請答應我你會學習如何做基本的調試 –

回答

5

你需要設置你的device = graphics.GraphicsDevice調用SetUpCamera()之前。 SetUpCamera方法要求device字段已被分配,它沒有按照您當前的順序。

+0

甜,非常感謝。 – Figitaki

2
protected override void LoadContent() 
{ 
    spriteBatch = new SpriteBatch(GraphicsDevice); 

    SetUpCamera(); 

    effect = Content.Load<Effect>("effects"); 

    SetUpVerticies(); 

    device = graphics.GraphicsDevice; 
} 

必須是

protected override void LoadContent() 
{ 
    device = graphics.GraphicsDevice; 

    spriteBatch = new SpriteBatch(GraphicsDevice); 

    SetUpCamera(); 

    effect = Content.Load<Effect>("effects"); 

    SetUpVerticies(); 
} 

使得device被設置(這是由SetUpCameraSetUpVerticies需要)。

調試提示:退房的當地人來驗證你的假設,你會看到devicenull。您也可以通過將變量懸停在您的行中來執行此操作...