2011-07-22 74 views
1

我正在搞一些三角形,並做了這個。起初,我想,我寫的所有「方法」都是實例化的,但是這些「方法」:設備,內容和效果;實際上都是空值。代碼幾乎沒問題,我應該寫些什麼而不是那些?XNA nullreferenceexception,框架類

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using Microsoft.Xna.Framework; 
using Microsoft.Xna.Framework.Content; 
using Microsoft.Xna.Framework.Graphics; 

namespace Learning_Test1 
{ 
class Triangle 
{ 
    GraphicsDevice device; 
    ContentManager content; 
    Effect effect; 

    VertexPositionColor[] vertices; 

    public void bob() 
    { 
     content.RootDirectory = "Content"; 
     content.Load<Effect>("effects"); 
    } 

    public void Initialize() 
    { 
     vertices = new VertexPositionColor[3]; 

     vertices[0].Position = new Vector3(1, 0, 0); 
     vertices[0].Color = Color.Red; 

     vertices[1].Position = new Vector3(0, 0, 1); 
     vertices[1].Color = Color.Green; 

     vertices[1].Position = new Vector3(-1, 0, 0); 
     vertices[1].Color = Color.Blue; 
    } 

    public void Update() 
    { 
    } 

    public void Draw() 
    { 
     effect.CurrentTechnique = effect.Techniques["PretransformedPS"]; 

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

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

}

回答

0

那麼你實際上是初始化的唯一的事情就是你的「頂點」陣列。我不明白,你實際上是試圖初始化其他變量,除非你沒有包含在你的問題的一些代碼,例如,當你居然打電話給你

Triangle testTriangle = new Triangle(); 

你應該初始化的類變量,設備,內容,其餘,除非你計劃在其他地方設置它們,並且影響你的類的初始化函數。自從我上次使用XNA之後已經有一段時間了,但如果我沒有記錯的話,當您創建新遊戲模板時Device和Content可能會初始化,因此您只需將它們設置爲等於testTriangle.Device和testTriangle.Content。如果沒有,我會強烈建議您在XNA網站上查看教程,因爲它們非常棒,我確信您將能夠弄清楚如何從那裏初始化它們。

1

這些(設備,內容和效果)不是「方法」,它們是字段(又名變量或成員)。你需要在使用它們之前分配它們。內容和設備應該可以在類的構造函數中進行分配。您可以在Game類中找到現有的ContentManager實例。效果可以在構造函數中分配或加載。

此外,你只是分配給兩個頂點 - 這將導致沒有任何東西被繪製。

1

您尚未實例化對象ContentDeviceEffect。當你使用你自己的類我想補充一個constructor它,需要在這些對象中,例如:

triangle(GraphicsDevice _device, ContentManager _content) 
{ 
    device = _device; 
    content = _content; 
    content.RootDirectory = "Content"; 
} 

而且,在你的bob方法,你應該做到以下幾點:

public void bob() 
{ 
    effect = content.Load<Effect>("effects"); 
}