Подтвердить что ты не робот

Как изменить размер окна с помощью XNA

Я знаю, что этот вопрос задавался много раз. Тем не менее, все решения, которые я нашел после более чем одного часа работы с поисковыми системами, - это, по сути, одно и то же. Все говорят, что для изменения размера окна в XNA вы просто добавляете следующие строки кода (или некоторые незначительные изменения этих строк кода) к вашему методу Initiate() в классе Game1:

    //A lot of people say that the ApplyChanges() call is not necessary,
    //and equally as many say that it is.
    graphics.IsFullScreen = false;
    graphics.PreferredBackBufferWidth = 800;
    graphics.PreferredBackBufferHeight = 600;
    graphics.ApplyChanges();

Это не работает для меня. Код компилируется и запускается, но абсолютно ничего не меняется. Я просматривал документацию для классов GraphicsDevice и GraphicsDeviceManager, но мне не удалось найти какую-либо информацию, указывающую, что мне нужно что-то делать, кроме вышеуказанного.

Я также довольно уверен, что моя видеокарта достаточно (ATI HD 5870), хотя кажется, что запись wiki на совместимость с графической картой XNA не обновлялась какое-то время.

Я работаю на Windows 7 с вышеуказанной графической картой, Visual С# 2010 Express и последней версией XNA.

Поэтому я просто надеюсь, что кто-то может помочь мне найти, где я запутался. Я отправлю весь свой класс Game1 (я переименовал его в MainApp) ниже. Если кто-нибудь захочет увидеть любой из других классов, которые вызваны, спросите, и я опубликую их.

public class MainApp : Microsoft.Xna.Framework.Game
{
    GraphicsDeviceManager graphics;
    SpriteBatch spriteBatch;

    Player player;

    public MainApp()
    {
        graphics = new GraphicsDeviceManager(this);
        Content.RootDirectory = "Content";
    }

    protected override void Initialize()
    {
        player = new Player();

        //This does not do ANYTHING
        graphics.IsFullScreen = false;
        graphics.PreferredBackBufferWidth = 800;
        graphics.PreferredBackBufferHeight = 600;
        graphics.ApplyChanges();

        base.Initialize();
    }

    protected override void LoadContent()
    {
        spriteBatch = new SpriteBatch(GraphicsDevice);

        Vector2 playerPosition = new Vector2(GraphicsDevice.Viewport.TitleSafeArea.X,
                                             GraphicsDevice.Viewport.TitleSafeArea.Y
                                             + 2*(graphics.GraphicsDevice.Viewport.TitleSafeArea.Height / 3));
        player.Initialize(Content.Load<Texture2D>("basePlayerTexture"),
                          playerPosition);
    }

    protected override void UnloadContent()
    {
    }

    protected override void Update(GameTime gameTime)
    {
        if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
            this.Exit();
       base.Update(gameTime);
    }

    protected override void Draw(GameTime gameTime)
    {
        GraphicsDevice.Clear(Color.CornflowerBlue);
        spriteBatch.Begin();

        player.Draw(spriteBatch);

        spriteBatch.End();

        base.Draw(gameTime);
    }
}

P.S. Это мой второй день с С#, поэтому, если это из-за действительно глупой ошибки, я приношу свои извинения за то, что тратил ваше время.

4b9b3361

Ответ 1

Это разочаровывает то, что (как вы говорите) "Многие говорят, что вызов ApplyChanges() не нужен, и в равной степени так много говорят, что это". Дело в том, что это зависит от того, что вы делаете и где вы это делаете!

(Как узнать все это? Я реализовал его. См. также: этот ответ.)


Когда вы устанавливаете начальное разрешение при запуске игры:

Сделайте это в своем конструкторе (очевидно, если вы переименуете Game1, сделайте это в своем переименованном конструкторе!)

public class Game1 : Microsoft.Xna.Framework.Game
{
    GraphicsDeviceManager graphics;

    public Game1()
    {
        graphics = new GraphicsDeviceManager(this);
        graphics.PreferredBackBufferHeight = 600;
        graphics.PreferredBackBufferWidth = 800;
    }

    // ...
}

И не трогайте его во время Initialize()! И не вызывайте ApplyChanges().

Когда вызывается Game.Run() (проект шаблона по умолчанию вызывает его в Program.cs), он вызывает GraphicsDeviceManager.CreateDevice, чтобы настроить начальный показ , прежде чем Initialize() будет вызван! Вот почему вы должны создать GraphicsDeviceManager и установить нужные параметры в конструкторе вашего игрового класса (который вызывается до Game.Run()).

Если вы попытаетесь установить разрешение в Initialize, вы должны настроить графическое устройство на два раза. Bad.

(Честно говоря, я удивлен, что это вызывает такую ​​путаницу. Это код, который предоставляется в шаблоне проекта по умолчанию!)


Когда вы изменяете разрешение во время игры:

Если вы представляете меню выбора разрешения где-то в своей игре и хотите ответить пользователю (например), щелкнув опцию в этом меню - тогда (и только тогда) вы должны использовать ApplyChanges. Вы должны вызывать его только из Update. Например:

public class Game1 : Microsoft.Xna.Framework.Game
{
    protected override void Update(GameTime gameTime)
    {
        if(userClickedTheResolutionChangeButton)
        {
            graphics.IsFullScreen = userRequestedFullScreen;
            graphics.PreferredBackBufferHeight = userRequestedHeight;
            graphics.PreferredBackBufferWidth = userRequestedWidth;
            graphics.ApplyChanges();
        }

        // ...
    }

    // ...
}

Наконец, обратите внимание, что ToggleFullScreen() совпадает с:

graphics.IsFullScreen = !graphics.IsFullScreen;
graphics.ApplyChanges();

Ответ 2

Ширина и высота GraphicsDevice.Viewport по умолчанию на моем компьютере - 800x480, попробуйте установить размер выше того, что будет заметно - например, 1024x768.

graphics.PreferredBackBufferHeight = 768;
graphics.PreferredBackBufferWidth = 1024;
graphics.ApplyChanges();

Вышеприведенный код в Initialize был достаточным для расширения окна для меня.