在Android上拉伸游戏画面以跨设备统一分辨率

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Android上拉伸游戏画面以跨设备统一分辨率相关的知识,希望对你有一定的参考价值。

目前,我的游戏使用以下代码以正确的宽高比填充屏幕:

Initialise()我有:

protected override void Initialize()
{
    graphics.IsFullScreen = true;
    screen_width = graphics.GraphicsDevice.Viewport.Width;
    screen_height = graphics.GraphicsDevice.Viewport.Height;
    graphics.SupportedOrientations = DisplayOrientation.LandscapeLeft | DisplayOrientation.LandscapeRight;
    graphics.ApplyChanges();
    base.Initialize();
}

LoadContent()我有:

protected override void LoadContent()
{
    spriteBatch = new SpriteBatch(GraphicsDevice);
    float screenscale = screen_width / screen_height;
    SpriteScale = Matrix.CreateScale(screenscale, screenscale, 1f);

    //load textures here//
}

Draw()我有:

protected override void Draw(GameTime gameTime)
{
    spriteBatch.Begin(SpriteSortMode.Immediate, null, null, null, null, null, SpriteScale);

    //Draw sprites here//

    spriteBatch.End();
    base.Draw(gameTime);
}

但是,使用此代码会根据设备宽度显示不同数量的游戏屏幕。

如何根据设备显示和缩放相同数量的游戏画面(如下图所示)?

enter image description here

编辑:

在活动类我有:

using android.App;
using Android.Content.PM;
using Android.OS;
using Android.Views;

namespace android_game3
{
    [Activity(Label = "android_game3"
        , MainLauncher = true
        , Icon = "@drawable/icon"
        , Theme = "@style/Theme.Splash"
        , AlwaysRetainTaskState = true
        , LaunchMode = Android.Content.PM.LaunchMode.SingleInstance
        , ScreenOrientation = ScreenOrientation.UserLandscape
        , ConfigurationChanges = ConfigChanges.Orientation | ConfigChanges.Keyboard | ConfigChanges.KeyboardHidden | ConfigChanges.ScreenSize)]
    public class Activity1 : Microsoft.Xna.Framework.AndroidGameActivity
    {
        protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);
            var g = new Game1();
            SetContentView((View)g.Services.GetService(typeof(View)));
            g.Run();

            //Hide action bar
            View vw = (View)g.Services.GetService(typeof(View));
            vw.SystemUiVisibility = (StatusBarVisibility)SystemUiFlags.HideNavigation | (StatusBarVisibility)SystemUiFlags.ImmersiveSticky;
            vw.SetOnSystemUiVisibilityChangeListener(new MyUiVisibilityChangeListener(vw));
        }

        //Hide action bar
        private class MyUiVisibilityChangeListener : Java.Lang.Object, View.IOnSystemUiVisibilityChangeListener
        {
            View targetView;
            public MyUiVisibilityChangeListener(View v)
            {
                targetView = v;
            }
            public void OnSystemUiVisibilityChange(StatusBarVisibility v)
            {
                if (targetView.SystemUiVisibility != ((StatusBarVisibility)SystemUiFlags.HideNavigation | (StatusBarVisibility)SystemUiFlags.Immersive))
                {
                    targetView.SystemUiVisibility = (StatusBarVisibility)SystemUiFlags.HideNavigation | (StatusBarVisibility)SystemUiFlags.ImmersiveSticky;
                }
            }
        }
    }
}
答案

我检查了我的旧android项目,我用过:

ScreenWidth = graphics.PreferredBackBufferWidth;
ScreenHeight = graphics.PreferredBackBufferHeight;

另外,你的活动课怎么样?

以上是关于在Android上拉伸游戏画面以跨设备统一分辨率的主要内容,如果未能解决你的问题,请参考以下文章

Android全面屏(长屏)闪屏背景拉伸问题解决

Android Camera 预览拉伸问题

我可以在 ios 上统一测试游戏在 android 上发布吗?

完整启动画面的 Lottie 动画不占用全屏

Android 相机预览在预览中拉伸,而不是在拍照后

Android 自定义相机 Camera 预览变形拉伸问题