我正在使用Xamarin与MonoGame.Android进行游戏。
我发现具有软件控件的设备(此处以红色突出显示)会产生不一致的分辨率。
具体而言,对于在横向方向中创作但在手机处于纵向方向时打开的应用程序会出现问题。 执行此操作时,手机会忽略手机的物理方向,无论如何都会以横向模式呈现。
例如,我为Samsung Galaxy S2创建了一个模拟器。我克隆了2份,1份带有软件控件(S2Soft),另一份带有硬件控件(S2Hard)。我在两部手机上开始使用我的应用程序,无论是纵向还是横向。
在Game.Initialize中,我检查PreferredBackBufferWidth和PreferredBackBufferHeight的值。这是我发现的:
S2Soft:
S2Hard:
现在,据我所知,与S2Hard相比,S2Soft可能具有更小的分辨率(为了为软件按钮腾出空间),我不明白为什么S2Soft有两个不同的分辨率取决于关于启动时手机的方向。
之前有没有人处理过此事?这对我来说是一个问题,因为我的UI是根据这些分辨率放置的,如果有人以纵向模式启动应用程序,则放置不正确。当没有渲染后备缓冲区时,它还会在屏幕一侧留下薄盒。
以下是细条的示例(如果以横向模式启动,则顶部和底部的蓝条不存在)。
谢谢!
答案 0 :(得分:1)
简答
将以下内容添加到我的“活动”配置中可解决此问题。
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
。