【问题标题】:Windows 8 app XNA on two monitors with different resolutions两台分辨率不同的显示器上的 Windows 8 应用 XNA
【发布时间】:2013-01-31 21:14:32
【问题描述】:

我正在使用 Monogame 为 Windows 8 应用商店编写 XNA 游戏。我还在使用连接到外接显示器的笔记本电脑。自然,我的外接显示器的分辨率比我笔记本电脑的屏幕高得多。当我将应用程序从一个屏幕拖到另一个屏幕时,视口上的分辨率会发生变化。

在我的构造函数中,我正在使用

 _graphics = new GraphicsDeviceManager(this);
 _graphics.PreferredBackBufferHeight = 768;
 _graphics.PreferredBackBufferWidth = 1366;

设置我的视口分辨率。当应用程序在任一监视器上运行时,这使得应用程序可以正常工作,但是将应用程序从一个监视器拖到另一个监视器会更改 GraphicsDeviceManager 上的分辨率。有没有办法阻止这种变化?

【问题讨论】:

  • 什么意思,分辨率变了?它是增加了,还是只是窗口大小发生了变化?
  • 我现在正在一台具有 1600x900 分辨率和外接全高清显示器的笔记本电脑上测试我的一个旧 XNA 应用程序。我正在拖动窗口,但分辨率没有改变,只有窗口的(物理)大小,这是由于屏幕分辨率的差异。我能给你的唯一真正的答案是,也许 Monogame 有一个错误,因为它仍处于 Beta 阶段,并没有真正使用 MS 代码(甚至没有逆向工程)。虽然我不会打赌。

标签: c# windows-8 xna monogame


【解决方案1】:

所以我想通了

首先我写了一个方法来检查图形设备上的端口分辨率是否改变了

 private bool hasResolutionChanegd()
    {
        if ((GraphicsDevice.Viewport.Width != ScreenManager.Instance.ScreenWidth) || (GraphicsDevice.Viewport.Height != ScreenManager.Instance.ScreenHeight))
        {
            return true;
        }
        else
        {
           return false;
        }

    }

我每次更新都会调用这个方法

if (hasResolutionChanegd())
        {
             Debug.WriteLine("Resolution Change new width= " + GraphicsDevice.Viewport.Width +" new height="+ GraphicsDevice.Viewport.Height);

            _graphics.PreferredBackBufferHeight = 768;
            _graphics.PreferredBackBufferWidth = 1366;
            _graphics.ApplyChanges();
        }

这样,每当图形设备管理器上的分辨率发生变化时(当用户将应用程序从一个屏幕环境拖到另一个屏幕环境时),就会强制执行首选分辨率。

【讨论】:

【解决方案2】:

我得到了与原始海报相同的东西,但使用的是 XNA,而不是 MonoGame。当我在两个监视器之间拖动窗口时,分辨率会发生变化,但不会(当然)触发 ClientSizeChanged 事件。上面使用 SizeChanged 事件的建议很有帮助,但仅适用于文档所述的 Windows8。

我似乎通过处理 Window.ScreenDeviceNameChanged 事件修复了它 - 我将它连接到与 ClientSizeChanged 相同的处理程序。

我会将此作为对原始帖子的评论,但我没有足够的“声誉”积分让系统让我这样做。

【讨论】:

    猜你喜欢
    • 2014-05-17
    • 1970-01-01
    • 2014-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-27
    • 1970-01-01
    相关资源
    最近更新 更多