1

我有一个使用 XNA(用 C# 编写)创建的 WindowsGameLibrary。它包括自己对 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。

非常感谢您的帮助。

4

1 回答 1

1

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

  graphics = new GraphicsDeviceManager(this);

从内部

  protected override void Initialize()

在里面

  public AttunedGame()

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

希望有帮助!

于 2012-10-29T19:48:51.763 回答