「Xamarin.AndroidのViewとMonoGameを混在させる」の版間の差分

提供: MonoBook
ナビゲーションに移動 検索に移動
imported>Administrator
 
(2人の利用者による、間の5版が非表示)
2行目: 2行目:
  
 
たとえばMonoGameには「文字入力」などという軟弱な概念はないので日本語入力対応のテキストボックスを使いたい場合や、[[Google AdMob]]で[[バナー広告]]を表示したい場合などが考えられる。
 
たとえばMonoGameには「文字入力」などという軟弱な概念はないので日本語入力対応のテキストボックスを使いたい場合や、[[Google AdMob]]で[[バナー広告]]を表示したい場合などが考えられる。
 +
 +
なお、以下の方法は[[iOS]]などのマルチプラットフォーム対応などクソくらえである。[[ググる]]と「[[Xamarin.Forms]]と[[MonoGame]]で同様のことをやりたい」という事例が[[stackoverflow.com]]などで散見されたが、その解決策は「MonoGame使うのやめて[[CocosSharp]]を使え」というものであった。CocosSharpを軽く触ってみたが、[[物理演算]]のために[[固定フレームレート]]にしたいが設定方法がわからない、[[3Dモデル]]の描画方法がわからないなど、わからないことだらけで撃沈した。
  
 
== 実装例 ==
 
== 実装例 ==
新規プロジェクトを作った直後に自動生成される[[ソースコード]]はこんな感じ。アクティビティにいきないMonoGameのViewを追加している。[[Xamarin.Mac]]と違ってMonoGameも普通のViewじゃん。<source>
+
新規プロジェクトを作った直後に自動生成される[[ソースコード]]はこんな感じ。アクティビティにいきないMonoGameのViewを追加している。つまりMonoGameの描画領域も普通のAndroid.View.Viewから派生したものだ。
 +
 
 +
<source lang="csharp">
 
protected override void OnCreate(Bundle bundle)
 
protected override void OnCreate(Bundle bundle)
 
{
 
{
14行目: 18行目:
 
</source>
 
</source>
  
MonoGameもXamarin.AndroidのViewの一種でした。ならば普通にAndroid.Widget.Layoutに噛ませばいいんじゃね。<source>
+
ならば普通にAndroid.Widget.Layoutに噛ませばいいんじゃね。
 +
 
 +
<source lang="csharp">
 
protected override void OnCreate (Bundle bundle)
 
protected override void OnCreate (Bundle bundle)
 
{
 
{
32行目: 38行目:
 
     g.Run();
 
     g.Run();
 
}
 
}
</source>
+
</source>まじかよ。うごいた。
 
+
[[category: Xamarin.Android]]
== 関連項目 ==
+
[[category: MonoGame]]
*
 

2021年12月29日 (水) 04:23時点における最新版

MonoGameはものすごく低レベルなAPI群なので、Xamarin.Androidの各種View(各種UI)を混在させたいことも多い。

たとえばMonoGameには「文字入力」などという軟弱な概念はないので日本語入力対応のテキストボックスを使いたい場合や、Google AdMobバナー広告を表示したい場合などが考えられる。

なお、以下の方法はiOSなどのマルチプラットフォーム対応などクソくらえである。ググると「Xamarin.FormsMonoGameで同様のことをやりたい」という事例がstackoverflow.comなどで散見されたが、その解決策は「MonoGame使うのやめてCocosSharpを使え」というものであった。CocosSharpを軽く触ってみたが、物理演算のために固定フレームレートにしたいが設定方法がわからない、3Dモデルの描画方法がわからないなど、わからないことだらけで撃沈した。

実装例[編集 | ソースを編集]

新規プロジェクトを作った直後に自動生成されるソースコードはこんな感じ。アクティビティにいきないMonoGameのViewを追加している。つまりMonoGameの描画領域も普通のAndroid.View.Viewから派生したものだ。

protected override void OnCreate(Bundle bundle)
{
    base.OnCreate(bundle);
    var g = new Game1();
    SetContentView((View)g.Services.GetService(typeof(View)));
    g.Run();
}

ならば普通にAndroid.Widget.Layoutに噛ませばいいんじゃね。

protected override void OnCreate (Bundle bundle)
{
    base.OnCreate (bundle);

    // レイアウトを手動で構築する
    var layout = new FrameLayout( this );
    SetContentView( layout );

    // MonoGameが動くAndroid.Views.Viewを取得する。
    // Game1はMicrosoft.XNA.Framework.Gameクラスの派生クラス。
    var g = new Game1();
    var gameView = g.Services.GetService<View>();
    layout.AddView( gameView );

    // ゲームループ開始
    g.Run();
}

まじかよ。うごいた。