首先加载图像,然后是n't?(XNA)

本文关键字:XNA 加载 图像 然后 | 更新日期: 2023-09-27 18:14:57

我现在很困惑。

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

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

IngameImage只是我自己的一个类,但实际上它包含一个Texture2D(和其他一些东西)。在另一个类中,我通过反序列化XML文件加载一个GUIButtons列表。

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。= 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。= null));不打印任何东西,它只崩溃并显示以下错误消息:

构建内容抛出NullReferenceException:对象引用未设置为对象实例。

为什么会发生这种情况?在程序想要加载List之前,它打印"true"。但是在构造函数中,在加载列表时它打印"false"有人能告诉我为什么会发生这种情况以及如何解决它吗?

首先加载图像,然后是n't?(XNA)

我对NullReferenceException的最佳猜测是GUIWindow.StandardBackgroundImage为空,因此当您尝试访问GUIWindow.StandardBackgroundImage.ImageStrip时,它会抛出此异常。

你熟悉Visual Studio调试器吗?如果没有,你应该有。我设置了一些断点,并逐步通过读取或写入StandardBackgroundImage的任何代码。

说真的,你的组织是可以改进的。为什么StandardBackgroundImageGUIWindow类的静态字段?它应该是加载它的类的一个字段-无论Initialization方法在哪里。然后将它传递给GUIWindow的构造函数。

你把StandardBackgroundImage字段当作一个全局变量,因此你可以感觉到这个决定的影响——有些东西正在读取和修改它,而你无法跟踪它们的顺序。