如何使用XNA来调整窗口(How to resize window using XNA)

2019-06-25 23:14发布

我知道这个问题已经被问过很多次。 然而,我在谷歌上搜索了一个小时后,发现所有的解决方案在本质上是一样的。 大家都说,为了调整窗口大小在XNA只需添加以下代码行(或几行代码的一些微小的变化)在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),虽然它看起来在XNA显卡兼容性维基条目不会被一会儿更新。

我在Windows 7上运行,与上面的显卡时,Visual C#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);
    }
}

PS这是我第二天与C#,因此,如果这是由于一个非常愚蠢的错误,我为浪费你的时间表示歉意。

Answer 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 ,您导致图形设备设置两次。 坏。

(说实话,我很惊讶,这会导致这样的困惑,这是在默认的项目模板提供的代码!)


当你修改分辨率,同时在游戏运行:

如果您在游戏中的某个地方呈现出“分辨率选择”菜单,并要应对用户(例如)点击该菜单中的选项- 那么 (只有这样),你应该使用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();


Answer 2:

GraphicsDevice.Viewport我的电脑上的宽度和高度默认情况下为800×480,可以尝试设置上面,这将是明显的大小-像1024×768。

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

在上面的代码Initialize足以展开窗口我。



文章来源: How to resize window using XNA