根据设备分辨率Monogame Windows Phone 8调整屏幕大小

时间:2014-05-16 06:10:28

标签: windows-phone-8 xna monogame

我使用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分辨率运行。在其他分辨率中,它将显示一些空格。

先谢谢。

2 个答案:

答案 0 :(得分:0)

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

您需要两件事:设计尺寸和设备尺寸。听起来你把它编码为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);
    }

这个功能对我们来说做得更多,但我把它全部整理出来。所以你现在应该有一个比例矩阵供你存储但是你喜欢。

现在在绘图调用中可以通过多种方式完成,您可以简单地将该刻度矩阵包含在SpriteBatch.Begin调用中的Matrix transformMatrix参数中。

这样的事情:

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

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

答案 1 :(得分:-1)

制作独立游戏,这是一个博客,它将为您提供一步一步的实现目标。 http://www.craftworkgames.com/blog/monogame-code-snippets/monogame-resolution-independence/