【问题标题】:Resize Screen based on Device Resolution Monogame Windows Phone 8根据设备分辨率调整屏幕大小 Monogame Windows Phone 8
【发布时间】:2014-05-17 01:02:10
【问题描述】:

我使用 monogame 框架开发游戏。 游戏本身的代码是从我之前编码的 XNA 代码转换而来的。 我为 800*480 分辨率开发游戏资源(背景等)。当我尝试以不同的设备分辨率(模拟器 720p)运行它时出现问题。 如何实际调整它的大小?

我已经添加了这段代码,但没有任何反应

public Game1()
{
_graphics = new GraphicsDeviceManager(this);
this.Windows.ClientSizeChanged += Window_ClientSizeChanged;
}

void Window_ClientSizeChanged(object sender, EventArgs e)
{
int currentWidth = this.Window.ClientBounds.Width;
int currentHeight = this.Windows.ClientBounds.Height;
}

该代码只为 currentWidth 和 currentHeight 返回 0 值;

我也遵循此代码

this.Window.ClientSizeChanged += new EventHandler<EventArgs>(Window_ClientSizeChanged);

void Window_ClientSizeChanged(object sender, EventArgs e)
{
graphics.PreferredBackBufferWidth = Window.ClientBounds.Width;
graphics.PreferredBackBufferHeight = Window.ClientBounds.Height;
graphics.ApplyChanges();
}

但它有类似的结果。调整大小没有任何反应。 请指出我解决此问题的方法。因为我的游戏只能在 480*800 分辨率下运行。在其他分辨率下,它会显示一些空间。

之前谢谢。

【问题讨论】:

    标签: windows-phone-8 xna monogame


    【解决方案1】:

    我是如何为我的游戏处理它的,我认为这是一个简单的解决方案。

    您需要两件事:设计尺寸和设备尺寸。听起来您将其编码为 800 * 480,所以这些是您的设计尺寸。

    所以你需要先获取实际的设备宽度和高度。我在 App.xaml.cs 中执行此操作,因为如果您想为另一个平台重用您的代码(我们这样做了),您将需要按照他们特定的方式来获取屏幕尺寸。

    所以在 App.xaml.cs 中你可以这样做:

    private void Application_Launching(object sender, LaunchingEventArgs e)
        {
            // Get device viewport.
            double scaleFactor = (double)App.Current.Host.Content.ScaleFactor / 100f;
            double width = App.Current.Host.Content.ActualWidth * scaleFactor;
            double height = App.Current.Host.Content.ActualHeight * scaleFactor;
    
            ResolutionSystem.SetResolutionAndScale((float)width, (float)height);
        }
    

    现在您正在做的是获取设备比例因子(对于 WP8,1.0 是 800 * 480)。然后,您获得 ActualWidth 和 ActualHeight(始终为 800 和 480),然后乘以比例因子。所以你现在有了你的设备尺寸,并且你没有连接到游戏逻辑本身(除非你的逻辑需要基于游戏中期横向切换到纵向的可能性)。

    那么我们要做的是设置游戏的缩放矩阵。由于着色器和 UI 的原因,我还需要处理很多其他关于缩放和渲染目标的事情,但我会保持简单。本质上,您现在想要为运行游戏的精灵批次获得一个缩放矩阵。这意味着您在所需的设计视口范围内执行所有操作,然后在事后将其缩放到所需的大小(您可能需要考虑重做资源以获得更高的分辨率,如 WXGA 甚至 1080p,如果可以的话)。

    因此,为了在 ResolutionSystem.cs 类中获取比例矩阵,我们调用:

    public static void SetResolutionAndScale(float deviceWidth, float deviceHeight)
        {
    
            ScaleMatrix = Matrix.CreateScale(DeviceWidth / DesignWidth,
                                             DeviceHeight / DesignHeight,
                                             1f);
        }
    

    这个函数为我们做了很多,但我把它全部删掉了。所以你现在应该有一个比例矩阵供你存储。

    现在在您可以通过多种方式完成的绘制调用中,您只需将该比例矩阵作为 Matrix transformMatrix 参数包含在 SpriteBatch.Begin 调用中。

    所以是这样的:

    spriteBatch.Begin(SpriteSortMode.FrontToBack, null, null, null, null, null, ResolutionSystem.ScaleMatrix);
    

    你现在应该有一些有用的东西了。您可以在 Windows Phone Store 中查看我的游戏 SkyFehl 并进行测试。它与 1280 * 768 的设计参数一起使用。使用这种方法移植到 iOS 相对容易(我不会链接它以防不赞成)。希望我有某种意义。

    【讨论】:

      【解决方案2】:

      制作分辨率独立游戏,这里有一个博客,它将为您提供一步一步的过程来实现它。 http://www.craftworkgames.com/blog/monogame-code-snippets/monogame-resolution-independence/

      【讨论】:

      • 链接好像失效了。
      • 由于这里没有总结链接,而且链接已经失效,所以这个答案现在没用了。
      猜你喜欢
      • 1970-01-01
      • 2011-02-17
      • 2014-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多