Ошибка графического устройства XNA 4.0 - PullRequest
1 голос
/ 13 июля 2011

Я знаю, что объявление основного графического устройства в основном конструкторе Game1 () должно выглядеть так:

 GraphicsDeviceManager graphics;

 graphics = new GraphicsDeviceManager(this);

тогда вы можете использовать такие вещи, как:

 graphics.PreferredBackBufferWidth = 1366;

Но если я объявлю то же самое в отдельном классе, что я буду заполнять для "this"?

 GraphicsDeviceManager graphics;

 graphics = new GraphicsDeviceManager(?);

EDIT:

После изменения всего, как вы сказали, теперь я получаю сообщение об ошибке, которое отправляет меня в эту строку кода:

     /// <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 на экране главного меню с выделенным «Play Game». Я думаю, проблема в передаче переменной.

Редактировать 2:

Я исправил код, я думаю, но теперь он отправил меня на эту строку, и я не знаю, как его редактировать.

 playGameMenuEntry.Selected += PlayGameMenuEntrySelected;

1 Ответ

1 голос
/ 14 июля 2011

Вам нужна ссылка на ваш экземпляр 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 () выше.

...