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

时间:2017-12-25 22:49:16

标签: c# android xna 2d monogame

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

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;
                }
            }
        }
    }
}

1 个答案:

答案 0 :(得分:0)

我检查了我的旧android项目并使用了:

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

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