我正在使用Xamarin与MonoGame.Android进行游戏。

我发现带有软件控件的设备(此处以红色突出显示)的分辨率不一致。



具体来说,对于在“横向”中创作但在手机处于“纵向”时打开的应用程序会出现此问题。当您执行此操作时,手机将忽略手机的物理方向,并在横向模式下渲染。

例如,我为三星Galaxy S2创建了一个模拟器。我克隆了2个副本,其中一个使用软件控件(S2Soft)克隆,另一个使用硬件控件(S2Hard)。我同时以纵向和横向在两部手机上启动了我的应用。

在Game.Initialize中,我检查PreferredBackBufferWidth和PreferredBackBufferHeight的值。这是我发现的:

S2Soft:


肖像:736x480
Lanscape:744x480


S2Hard:


肖像:分辨率:800x480
风景:分辨率:800x480


现在,我了解到S2Soft的分辨​​率可能比S2Hard的分辨率小(以便为软件按钮腾出空间),但我不理解S2Soft为何具有两种不同的分辨率,具体取决于启动时手机的方向。

有人处理过吗?这对我来说是个问题,因为我的UI是根据这些分辨率放置的,并且如果有人以纵向模式启动应用程序,则会放置不正确的位置。当不渲染后缓冲时,它还会在屏幕的侧面留下细框。

这是细条的示例(如果以横向模式启动,顶部和底部的蓝色条将不存在)。



谢谢!!

最佳答案

简短答案

在我的活动配置中添加以下内容可解决此问题。

ScreenOrientation = Android.Content.PM.ScreenOrientation.Landscape


通过添加此行,活动将在初始化MonoGame之前切换到横向,从而完全避免了问题。

    [Activity (Label = "Swipe Tap Smash",
    MainLauncher = true,
    Icon = "@drawable/icon_large",
    Theme = "@style/Theme.Splash",
    AlwaysRetainTaskState = true,
    LaunchMode = Android.Content.PM.LaunchMode.SingleTask,
    ScreenOrientation = Android.Content.PM.ScreenOrientation.Landscape,
    ConfigurationChanges = Android.Content.PM.ConfigChanges.Orientation |
    Android.Content.PM.ConfigChanges.KeyboardHidden |
    Android.Content.PM.ConfigChanges.Keyboard)]
public class Activity1


长答案

我调查了一下,发现我看到的是在MonoGame中设计的。如果您在MonoGame \ v3.0 \ MonoGame.Framework \ GraphicsDeviceManager.cs中查看ResetClientBounds,则会发现以下注释:

    /// <summary>
    /// This method is used by MonoGame Android to adjust the game's drawn to area to fill
    /// as much of the screen as possible whilst retaining the aspect ratio inferred from
    /// aspectRatio = (PreferredBackBufferWidth / PreferredBackBufferHeight)
    ///
    /// NOTE: this is a hack that should be removed if proper back buffer to screen scaling
    /// is implemented. To disable it's effect, in the game's constructor use:
    ///
    ///     graphics.IsFullScreen = true;
    ///     graphics.PreferredBackBufferHeight = Window.ClientBounds.Height;
    ///     graphics.PreferredBackBufferWidth = Window.ClientBounds.Width;
    ///
    /// </summary>
    internal void ResetClientBounds()


这就是为什么我们在屏幕侧面看到条形图的原因; MonoGame已经创建了渲染区域,现在被告知渲染到其他大小的区域。它不是在创建新的渲染表面或拉伸现有的渲染表面,而是在图像上加上字母以使其尽可能适合。

但是,在我的情况下,这实际上不应触发,因为它不应在事实发生后切换方向。这已固定为我在“活动”中的设置ScreenOrientation = Android.Content.PM.ScreenOrientation.Landscape

09-30 09:36