【问题标题】:XNA 4.0 Graphics Device ErrorXNA 4.0 图形设备错误
【发布时间】:2011-07-13 19:41:15
【问题描述】:

我知道在 Game1() 主构造函数中的图形设备声明方式是:

 GraphicsDeviceManager graphics;

 graphics = new GraphicsDeviceManager(this);

然后你可以使用类似的东西:

 graphics.PreferredBackBufferWidth = 1366;

但是如果我在一个单独的类中声明相同,我要为“this”填写什么?

 GraphicsDeviceManager graphics;

 graphics = new GraphicsDeviceManager(?);

编辑:

按照你说的修改所有内容后,我现在收到一个错误,将我发送到这行代码:

     /// <summary>
    /// Event handler for when the Play Game menu entry is selected.
    /// </summary>
    void PlayGameMenuEntrySelected(object sender, PlayerIndexEventArgs e, Game game)
    {
        LoadingScreen.Load(ScreenManager, true, e.PlayerIndex,
                           new GameplayScreen(game));
    }

此程序是您可以从 Microsoft 获得的菜单示例,当然,经过大量修改,这是您在主菜单屏幕上按 Enter 键并突出显示“玩游戏”时执行的代码。我猜问题在于传递变量。

编辑 2:

我修复了我认为的代码,但现在它把我送到了这一行,我不知道如何编辑它。

 playGameMenuEntry.Selected += PlayGameMenuEntrySelected;

【问题讨论】:

  • 你在哪里声明LoadingScreen?我目前无法访问 apphub 示例。我会让这变得简单:转到 VS 中的那一行,将光标放在 LoadingScreen,右键单击并选择“转到定义”。

标签: graphics device xna-4.0


【解决方案1】:

您需要对 Game 实例的引用。我只是将它传递给您的新类构造函数。

例如,如果要将GraphicsDeviceManager 实例移动到单独的类中,Foo

/// <summary>
/// This is the main type for your game
/// </summary>
public class Game1 : Microsoft.Xna.Framework.Game
{
    private Foo _foo;

    public Game1()
    {
        _foo = new Foo(this);
    }

    protected override void Dispose(bool disposing)
    {
        if (_foo != null)
        {
            _foo.Dispose();
            _foo = null;
        }
        base.Dispose(disposing);
    }

}

public class Foo : IDisposable
{
    private Game _game;
    private GraphicsDeviceManager _graphics;
    private SpriteBatch _spriteBatch;

    public Foo(Game game)
    {
        _game = game;
        _game.Content.RootDirectory = "Content";

        _graphics = new GraphicsDeviceManager(_game);
        _spriteBatch = new SpriteBatch(_game.GraphicsDevice);
    }


    public void Dispose()
    {
        if (!_spriteBatch.IsDisposed)
        {
            _spriteBatch.Dispose();
            _spriteBatch = null;
        }
    }
}

更新

正确处理大量 XNA 对象很重要(否则会导致内存泄漏)。请参阅上面的 Foo.Dispose() 和 Game1.Dispose() 覆盖。

【讨论】:

  • 好的,我像“public GameplayScreen(Game1)”一样传递了它,但是说我缺少一个标识符。
  • 您可能想阅读一些 C# 基础知识...将相关代码 sn-p 添加到您的帖子中。 public GameplayScreen(Game1) 行在任何情况下都不是有效的 C#。
  • 非常感谢,现在我将在哪里使用 Content 我会使用 _game.Content、_graphics 用于图形和 _spriteBatch 用于 spriteBatch,对吗?
  • 是的,没错。我还在示例中添加了一些Dispose() 代码。很多 XNA 资产——效果、spritebatch、模型等,必须在你的应用程序关闭时处理掉。如果你不这样做,它会泄漏内存,最终系统可能会毫不客气地崩溃。
  • 你有 Skype 吗?说话比来回评论更容易。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-22
相关资源
最近更新 更多