【问题标题】:Splash/Loading Screen while LoadContent is running in AndroidGameActivity在 AndroidGameActivity 中运行 LoadContent 时的启动画面/加载屏幕
【发布时间】:2013-11-23 18:58:53
【问题描述】:

首先我想说的是,总的来说,我对 C# 和 Monogame 真的很陌生。

我的问题是显示屏幕。 我有一个名为 loadingsplash.xml 的布局资源,并希望在游戏活动运行 LoadContent() 时显示它;

流程图是: Main.xml:在按钮按下 > LoadContent 期间的 ProgressDialog > GameActivity

我想要的流程图: Main.xml:按下按钮 > 在 LoadContent > GameActivity 期间显示 loadingsplash.xml

MainMenu.cs

[Activity( Label = "theApp", Theme = "@android:style/Theme.NoTitleBar.Fullscreen", MainLauncher=true, ScreenOrientation=Android.Content.PM.ScreenOrientation.Landscape)]

public class MainMenu : Activity, IDialogInterfaceOnClickListener
{
......
void GoButton_Click(object sender, EventArgs e)
{
    Intent theActivity = new Intent(this, typeof(GameActivity));
    StartActivity(theActivity);
}

theActivity.cs

namespace theApp
{
    [Activity(Theme = "@android:style/Theme.NoTitleBar.Fullscreen", Label = "theApp", Icon = "@drawable/icon", ScreenOrientation = Android.Content.PM.ScreenOrientation.Landscape, ConfigurationChanges = ConfigChanges.Orientation | ConfigChanges.Keyboard | ConfigChanges.KeyboardHidden)]

    public class GameActivity : Microsoft.Xna.Framework.AndroidGameActivity, IDialogInterfaceOnClickListener
    {
        myGame game = null;
        static GameBundle gameBundle = null;
        ProgressDialog dialog;
        const int WindowID = 10001;

        protected override void OnCreate(Bundle bundle)
        {
            loadedOnce = true;
//this works
//
//dialog = new ProgressDialog(this);
//dialog.SetMessage("Loading...");
//dialog.Show();
//

//Loading Splash screen invocation code goes here?

    if (game == null)
       {
         myGame.Activity = this;
         base.OnCreate (bundle);
         game = new myGame();
         game.NativeCommand = ProcessCommand;
         game.Window.GraphicsMode = new AndroidGraphicsMode(0, 4, 0, 0, 0, false);
         game.Window.Id = WindowID;

                if (gameBundle == null)
                {
                    game.Run();
                }
                else
                {
                    if (gameBundle != null)
                    {
                        resumeGame.Show();
                    }
                }
            }
            SetContentView(game.Window);
        }

myGame.cs

public class myGame : Microsoft.Xna.Framework.Game
{

public myGame()
    {
        graphics = new GraphicsDeviceManager(this);
        Content.RootDirectory = "Resources/Drawable";
        unloading = false;
        graphics.PreferMultiSampling = true;
        graphics.IsFullScreen = true;
        graphics.SupportedOrientations = DisplayOrientation.LandscapeLeft;
    }

    protected override void Initialize()
    {
        graphics.SynchronizeWithVerticalRetrace = true;
        graphics.PreferredBackBufferWidth =  800;
        graphics.PreferredBackBufferHeight = 480;
        screenManager = new ScreenManager(this, 800, 480);
        base.Initialize();
    }

    bool loaded = false;
    protected override void LoadContent()
    {
        spriteBatch = new SpriteBatch(this.GraphicsDevice);
        font = Content.Load<SpriteFont>("Arial");
        GraphicsDevice.Clear(Color.Black);
        ThreadPool.QueueUserWorkItem(state =>
            {
                            ...
                            loaded = true;
            });

如果我使用 setContentView(Resource.Layout.LoadingSplash); 调用 LoadingSplash在 base.OnCreate(bundle) 之前,我得到一个异常,必须调用 requestFeature。

【问题讨论】:

    标签: c# android mono monogame


    【解决方案1】:

    我使用以下实现。我计划在不久的将来在 NuGet 中公开这个包,以便您可以在我的存储库中查看它https://github.com/AzuxirenLeadGuy/Azuxiren.MG (请为我的存储库加注星标)

    无论如何,我已经在代码中做到了这一点。

    首先我定义了一个接口IScreen如下:

    public interface IScreen
    {
        void LoadContent();
        void Update(GameTime gt);
        void Draw(GameTime gt);
    }
    

    接下来我定义了我的游戏类如下:

    public abstract class AMGC<StartScreen,LoadScreen> : Game where StartScreen:IScreen,new() where LoadScreen:IScreen,new()
    {
        public GraphicsDeviceManager graphics;
        internal bool isLoading;
        internal IScreen CurrentScreen,LoadingScreen;
        public AMGC()
        {
            graphics = new GraphicsDeviceManager(this);
            isLoading = false;
        }
        protected override void Initialize()
        {
            CurrentScreen = new StartScreen();
            LoadingScreen = new LoadScreen();
            base.Initialize();
        }
        protected override void LoadContent()
        {
            CurrentScreen.LoadContent();
            LoadingScreen.LoadContent();
            base.LoadContent();
        }
        protected override void Draw(GameTime gt)
        {
            if (isLoading) LoadingScreen.Draw(gt);
            else CurrentScreen.Draw(gt);
            base.Draw(gt);
        }
        protected override void Update(GameTime gameTime)
        {
            if (isLoading) LoadingScreen.Update(gameTime);
            else CurrentScreen.Update(gameTime);
            base.Update(gameTime);
        }
        public void ScreenLoad<T>() where T : IScreen, new()
        {
            isLoading = true;
            Task.Run(() =>
                {
                    var screen = new T();
                    screen.LoadContent();
                    CurrentScreen = screen;
                    isLoading = false;
                }
            );
        }
    }
    

    现在有了该代码,您就可以开始了。现在您的游戏是在 IScreen 实例中设计的。假设您制作了一个 LogoScreen(游戏开始时显示您的游戏徽标)、MenuScreen(游戏的主菜单)和 SplashScreen(您想要为游戏显示“Now Loading...”的通用启动画面)。

    您的游戏对象将像这样创建:

    AMGC game=new AMGC<LogoScreen, SplashScreen>();
    

    在 LogoScreen 中,当您必须从 LogoScreen 更改为 MenuScreen 时,您必须在屏幕更改逻辑中使用它。

    game.ScreenLoad<MenuScreen>();
    

    请注意,为此,游戏实例必须是全局的,才能从您的 LogoScreen 内部访问。

    【讨论】:

    • 谢谢,这很有帮助
    【解决方案2】:

    对于仍在寻找这个问题的答案的人,我建议您不要通过使用不同的 xml 文件来使用单独的屏幕,而是在 Monogame 本身中对其进行操作。

    请看看我在这篇文章中的回答:https://stackoverflow.com/a/55667101/8594783

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-23
      • 1970-01-01
      • 1970-01-01
      • 2013-05-23
      • 1970-01-01
      • 1970-01-01
      • 2022-01-25
      相关资源
      最近更新 更多