一夫一妻制3.4 Windows Phone 8.1 -虚拟hw按钮下的视口渲染

本文关键字:按钮 hw 视口 虚拟 Windows Phone 一夫一妻制 | 更新日期: 2023-09-27 18:05:13

我正在开发一款面向Windows和Windows Phone 8.1的游戏。游戏运行在800x480,这是在游戏类构造函数中设置的:

graphics = new GraphicsDeviceManager(this);
graphics.PreferredBackBufferHeight = 480;
graphics.PreferredBackBufferWidth = 800;

在PC上的效果非常好,但是,当我在带有虚拟按键和实际分辨率为854x480的Nokia 630上运行游戏时,视口在虚拟按键下呈现拉伸。

如果我试图从spriteBatchgraphics或直接GraphicsDevice类获得实际分辨率,我总是得到800x480,而很明显,实际分辨率更大(而在PC上,我能够发现显示器是1920x1080)。

只是为了澄清,我目前有一个非常简单的绘制方法,没有其他分辨率或视口改变:

GraphicsDevice.Clear(oc.colBack);
spriteBatch.Begin();
foreach (Mob mobUnit in oc.mob) {
    spriteBatch.Draw(sprSquare, mobUnit.position, origin: mobUnit.size / 2, color: oc.colMob * 0.8f);
}
spriteBatch.End();
base.Draw(gameTime);

有什么办法解决这个问题吗?谢谢。

PS:状态栏没有显示,也没有将视窗"推"到一边。

一夫一妻制3.4 Windows Phone 8.1 -虚拟hw按钮下的视口渲染

经过一些深入的研究和计算,我想出了一个相当可疑的解决方案。在Initialize法中:

 matScale = Matrix.CreateScale(1f, 1f, 1f);
 if (Window.ClientBounds.Width < Window.ClientBounds.Height) {
      var dpiY = Windows.Graphics.Display.DisplayInformation.GetForCurrentView().RawDpiY;
      var dpiX = Windows.Graphics.Display.DisplayInformation.GetForCurrentView().RawDpiX;
      if (dpiY < dpiX - 1) {
           matScale = Matrix.CreateScale(.937f,1f,1f);
      }
 }

DpiX - 1是因为我实际上在PC上的dpi之间得到了1px的差异-尽管PC不应该清除第一个if语句。.937f是800px减去虚拟按钮大小的百分比,大约是50px。(当屏幕大小为854px时,它是54px,所以大约占屏幕的6.323%。)

当然,在Draw中:

spriteBatch.Begin(transformMatrix: matScale);

这工作。我将把这个问题留到后面,因为我认为这不是正确的做法。如果ApplicationView的所有文档方法都在就好了…