最近、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の影響がもろに出てて微妙なところ。。。