2011-11-15 21 views
0

我當時非常困惑。圖片先加載,那不是? (XNA)

我有以下類別:(類的只是一部分):

public class GUIWindow 
{ 
    #region Static Fields 
    //The standard image for windows. 
    public static IngameImage StandardBackgroundImage; 
    #endregion 
} 

IngameImage只是我自己的一個類,但實際上它包含一個Texture2D(和其他一些東西)。 在另一個類中,我通過反序列化XML文件來加載GUIButton的列表。

public static GUI Initializazion(string pXMLPath, ContentManager pConMan) 
    { 
     GUI myGUI = pConMan.Load<GUI>(pXMLPath); 
     GUIWindow.StandardBackgroundImage = new 
     IngameImage(pConMan.Load<Texture2D>(myGUI.WindowStandardBackgroundImagePath), 
       Vector2.Zero, 1024, 600, 1, 0, Color.White, 1.0f, 
       true, false, false); 
     System.Console.WriteLine("Image loaded? " + 
           (GUIWindow.StandardBackgroundImage.ImageStrip != null)); 
     myGUI.Windows = pConMan.Load<List<GUIWindow>>(myGUI.GUIFormatXMLPath); 
     System.Console.WriteLine("Windows loaded"); 

     return myGUI; 
    } 

在這裏這條線:的System.Console.WriteLine( 「圖像加載?」 +
(GUIWindow.StandardBackgroundImage.ImageStrip = NULL)!); 打印「true」。 要加載GUIWindows我需要一個「空」構造函數,它看起來像這樣:

public GUIWindow() 
    { 
     Name = ""; 
     Buttons = new List<Button>(); 
     ImagePath = ""; 
     System.Console.WriteLine("Image loaded? (In win) " + 
           (GUIWindow.StandardBackgroundImage.ImageStrip != null)); 
     //Image = new IngameImage(StandardBackgroundImage); 
     //System.Console.WriteLine(
     //Image.IsActive = false; 
     SelectedButton = null; 
     IsActive = false; 
    } 

正如你所看到的,我在構造函數中註釋行了。因爲:否則這會崩潰。 這裏行System.Console.WriteLine(「圖片加載?(贏))」+ (GUIWindow.StandardBackgroundImage.ImageStrip!= null)); 不打印任何東西,它只是崩潰與下面的ErrorMessage:

建設內容扔的NullReferenceException:未將對象引用設置到對象的實例。

爲什麼會發生這種情況? 在程序想要加載列表之前,它會打印「true」。但是在構造函數中,所以在加載列表時打印出「false」。 任何人都可以告訴我爲什麼發生這種情況,以及如何解決它?

+5

使用你的調試器。 NullReferenceException意味着你試圖用一個設置爲null的變量來做某件事。 – doppelgreener

+0

您是否使用MSDN的[遊戲狀態管理](http://create.msdn.com/en-US/education/catalog/sample/game_state_management)代碼? –

+0

在構建內容時拋出異常,顯然,在運行應用程序時應該是一個線索。爲什麼在構建內容期間運行此代碼?你想將哪些內容編譯成可能導致它運行的內容? – 2011-11-16 01:00:12

回答

2

我在NullReferenceException中的最佳猜測是GUIWindow.StandardBackgroundImage爲空,因此當您嘗試訪問GUIWindow.StandardBackgroundImage.ImageStrip時會引發此異常。

您是否熟悉Visual Studio調試器?如果不是,你應該是。我會設置一些斷點,並通過任何代碼讀取或寫入StandardBackgroundImage

真的,你的組織可以改進。爲什麼StandardBackgroundImageGUIWindow類的靜態字段?它應該是加載它的類的字段 - 無論Initialization方法在哪裏。然後將它傳遞給GUIWindow的構造函數。

您正在將StandardBackgroundImage字段視爲全局字段,因此會感受到該決定的影響 - 有些內容正在讀取和修改它,並且您無法跟蹤它們正在執行的操作順序。

Take this advice on globals.

+0

那麼,問題不是GUIWindow.StandardBackgroundImage。這兩種情況都不爲空。這個問題真的好像是保存在StandardBackgroundImage.ImageStrip中的Texture2D。在第一個檢查中它不是null,那麼在構造函數中它是空的,並且在所有事物之後它不爲null。它在構造函數中僅爲null。由於其他:不要擔心。每個窗口都有一個圖像屬性,它擁有自己的圖像。全局的StandardBackgroundImage只是給窗口一個標準的圖像,如果它不加載任何特殊的圖像。 – M0rgenstern

+0

好吧,既然上面是錯誤的,顯然你想保持全球...這是另一個想法:我相信ContentManager使用一個單獨的線程。也許靜態的'StandardBackgroundImage'尚未複製到該線程。如果出現這種情況,可以使用['volatile'關鍵字] [2]對其進行補救。試一試,看看它是否修復。 – Ricket

+0

它似乎並不是因爲它使用不同的線程。我使用了volatile關鍵字,它拋出了和以前一樣的錯誤。我不想保持全球化,我會改變這種情況,如果我可以考慮任何其他解決方案,但我真的看不到解決方案。 – M0rgenstern