在XNA游戏中永远不会调用LoadContent

时间:2012-10-29 16:09:06

标签: c# xna initialization

我有一个使用XNA创建的WindowsGameLibrary(用C#编写)。它包括自己的Game类扩展。无论出于何种原因,LoadContent的重写版本永远不会被调用。我在论坛中读到,这可能是由于意外覆盖了Initialize而没有在最后添加base.Initialize(),但我确保有这个但它仍然不起作用。我会注意到包含Game扩展名的命名空间与其中包含“Program”类的实际WindowsGame项目的命名空间是分开的,尽管我认为这不重要。以下是我的代码:

    public AttunedGame()
    {
        // Singleton
        if (Instance == null) Instance = this;
        this.currentArea = "";
    }
    protected override void Initialize()
    {
        // Managers
        graphics = new GraphicsDeviceManager(this);
        currentGameTime = new GameTime(new TimeSpan(0), new TimeSpan(0));

        // Areas
        areas = new CollectibleCollection<Area>();
        foreach (string a in Directory.EnumerateDirectories(@"content\areas"))
        {
            areas.Add(new Area(a));
            areas.Get(Collectible.IDFromPath(a)).Initialize();
        }

        base.Initialize();
    }
    protected override void LoadContent()
    {
        spriteBatch = new AnimatedSpriteBatch(this.GraphicsDevice);
    }

    // Main loop methods
    protected override void Update(GameTime gameTime)
    {
        currentGameTime = gameTime;

        CurrentArea.Update();

        base.Update(gameTime);
    }
    protected override void Draw(GameTime gameTime)
    {
        currentGameTime = gameTime;

        SpriteBatch.Begin();
        CurrentArea.Draw();
        SpriteBatch.End();

        base.Draw(gameTime);
    }

我在此处显示的每个方法中都放置了断点,以查看程序流程的去向。它首先点击构造函数,然后是Initialize(我一次逐行一行直到结束),然后进入Update,然后是Draw。我甚至让它循环了一段时间,它从未进入LoadContent。

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

您实际上需要在构造函数中创建GraphicsDeviceManager。移动线:

  graphics = new GraphicsDeviceManager(this);

来自内部

  protected override void Initialize()

进入内部

  public AttunedGame()

我的猜测是,XNA内部的某些内容需要在图形设备管理器加载内容之前进行初始化(可能服务容器需要制作图形设备以便它可以加载内容,例如纹理)。 LoadContent实际上是从基类Initialize中调用的,这可能会以某种方式失败;它确实应该抛出某种异常,但他们可能没想到这种情况。

希望有所帮助!