What is it, naokirin?

MonoGame + Xamarin Androidで書き方が変わってた

最近、Xamarin AndroidのIndieライセンス契約をして、MonoGameをいじってみたりしています。

先週、MonoGameを入れた時に気になっていたこととして、Xamarin Androidでアプリを作成した場合に起動後2回目のResumeでExceptionが発生していました。

そのときはなぜかわからないままでしたが、一昨日こんなプルリクを発見。

Better detection of graphics mode on Android. #2627 - https://github.com/mono/MonoGame/pull/2627

「これ、自分の現象と一緒だ!」ということで、早速MonoGameをビルドしなおしてみました。

そこで更に問題発生。

以前までは以下の様なコードを書くと、表示されていました。

public class Activity1 : AndroidGameActivity
{
    protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);
        Game1.Activity = this;

        // Game1 is derrived from Microsoft.Xna.Framework.Game
        var game = new Game1(); 
        SetContentView(game.Window);
        game.Run();
    }
}

Microsoft.Xna.Framework.Game のstatic public 変数のActivityがなくなっているし、Windowプロパティもない!

さらにコードを読んでみると、どうもActivityは勝手に登録されるようになったみたいだったのですが、Viewがどこにいったのかわからない。 もちろん、ViewをActivityでSetContentViewに渡さなければ表示されない!

更に調べたところ、以下のプルリクを発見。

Refactor AndroidGameWindow to inherit GameWindow #2393 - https://github.com/mono/MonoGame/pull/2393

どうやら次のように書くのが、いまのリポジトリの最新での正しい書き方のようです。

public class Activity1 : AndroidGameActivity
{
    protected override void OnCreate (Bundle bundle)
    {
        base.OnCreate (bundle);

        // Game1 is derrived from Microsoft.Xna.Framework.Game
        var game = new Game1();

        SetContentView ((View)game.Services.GetService(typeof(View)));
        game.Run();
    }
}

MonoGameもまだまだ活発に修正や対応が行われていて、ちょっとの間に結構大きく変わることもまだまだありそうですね…

自分としては、SetContentViewに渡すのを、Gameクラスを継承したクラスで

class Game1 : Microsoft.Xna.Framework.Game
{
...

    View View { get { return (View)game.Services.GetService(typeof(View)); } }


...
}

としておくと、Activity側のコードはちょっとはいい感じにかけるのかなと思ったりしてますが、これはこれでGameクラスにAndroidの影響がもろに出てて微妙なところ。。。