« XNAベースのゲームをAndroidに移植する方法(その3) | トップページ | PC1台でクラスタ(MSFC)を試すメモ(進化版) »

XNAベースのゲームをAndroidに移植する方法(その4)

前回からの続き。

ちょっとツールの話。Mono for AndroidにはMonoDevelopという開発環境が付属していて、これでLinuxやAndroid用のアプリケーションをC#で開発できる。使い勝手もVisualStudioとあまり変わらないので、非常に使えるツールである。MonoDevelopでも当然ExEnを用いたゲームをビルドしてデバッグできる。デバッグ機能も豊富だ。しかし、MonoDevelopでは、XNAプロジェクトが開けない。この移植作業では、既存のXNAプロジェクトのソース修正がメインになるので、これは非常に不便である。VisualStudioでXNAプロジェクトを開いてソース修正&ビルドを行ってMonoDevelopで配置&デバッグ実行うか、VisualStudioだけですべての作業を行うか、の選択となる。VisualStudioだけですべて行う方が作業が美しいと思うので、ここではそうした。

VisualStudioだけでMono for Androidプロジェクトをデバッグする際の注意点として、既定の設定では、BlankGameプロジェクトが依存している既存の自作XNAゲームプロジェクトのソースを更新しても、デバッグ実行時に、その変更が反映されない。これでは、移植作業が進められないので、BlankGameプロジェクトのプロパティを開き[Mono Android Options]タブの[Use Fast Deployment (debug mode only)]のチェックを外す。こうすることで、既存の自作ゲームのexeが更新されても、デバッグ実行時にその変更が反映されるようになる。

なお、VisualStudioでもMonoDevelopでも、例外が発生した箇所でブレークし、その時点の変数の値やコールスタックなどを確認することができ、とても便利だ。Visual StudioでWindows Mobileのプログラムを実機でデバッグするのと同じ感覚で、ARMデバイスをICEでつないでRealViewでデバッグするのと同じ感覚でデバッグできる。いとも簡単に。

それから、自作ゲームのソース中に

    System.Diagnostics.Debug.WriteLine("Hello...");   
のように出力しておくと、(エミュレータでの)デバッグ実行時に、VisualStudioの[出力]ウィンドウに、出力した文字列が表示され、デバッグの役に立つ。MonoDevelopでも出力は表示できるが、Android自身のログ、Mono for Androidのログ、ExEnのログと混ざって出力される。VisualStudioではメニューの[表示]-[その他のウィンドウ]-[Android Device Logging]を表示することで、Android自身のログなどを参照できる。

さて、いよいよAndroidエミュレータ上でゲームを実行してみる。…動かない。起動してもすぐに終わってしまう。なんかgraphics.ApplyChanges()でNullReferenceExceptionみたいなの出るし。Androidでは要らないのだろう。ExEnのサンプルソースにもこの処理なかったし。そんな感じで、実行時エラーが出る個所をちょこちょこ直していく。そうそう、画面の解像度が異なるから、デバイスに合わせて変えないといけない。場合によっては背景画像などのコンテンツも修正が要るだろう。これは仕方のないことだ。

それから、pngファイルをLoad()するときにjava.lnag.OutOfMemoryError(だったか?)が出た。Android端末だから搭載メモリが少ないのは仕方ない…が、これは少なすぎだろう、という感じだったので、AVDマネージャーで仮想Androidマシンのheapsizeを24から256まで増やした。とりあえず移植できるかの検証が目的なので、今はこれで対処しておく。(仮想Androidマシンのheapsizeをそれ以上にすると、仮想マシンが起動中に停止し、起動できないっぽい。。。)ところがところが、これでもゲームの全コンテンツをLoadすることはできなかった。う~むパソコン向けゲームとは違って、画像や音声の容量をできるだけ節約する必要がありそうだ。とりあえずいまは、余計なアニメーションを省いて、テクスチャを減らして対処しておく。

あと、ソース中で指定しているコンテンツのアセット名とファイル名の大文字小文字が合っておらず、コンテンツのLoad()が例外になった場合、VisualStudio上でコンテンツのファイル名を変更しただけでは、変更がapkファイルに反映されないっぽい。そういう場合は、コンテンツファイルのプロパティで[ビルドアクション]を[なし]にしてBlankGameをリビルドしてから[ビルドアクション]を[Android Asset]にして再度リビルドすると、反映される。

さて、最初からここまでで、結構、自作ゲームのソースをいじった。Mono for Androidプロジェクトには、プロジェクトのプロパティの[ビルド]タブを見るとわかるのだが、"ANDROID"という条件付きコンパイルシンボル(いわゆる#define値)が定義されているので、Android専用のコードは#ifdef ANDROIDと#endifでくくっておけばよかった。そうすることで、パソコン用とAndroid用のソースを一本化できる。

さて、デバッグ実行。ゲームがAndroidエミュレータで起動し、グラフィックやBGMが流れた!!う~むすばらしい。

しかし、実行してみるとまだまだ問題が発生。

  • まず、めちゃくちゃ重い(エミュレータだから?)
  • キーボードの押下が検出できない
  • 独自のファイル(設定ファイル)が読み込めない(見つからないエラーになる)
  • mp3が2曲つながって再生される。
  • フォントが表示できない(Loadで例外になる)

これらの対処法はまた次回。。。

|

« XNAベースのゲームをAndroidに移植する方法(その3) | トップページ | PC1台でクラスタ(MSFC)を試すメモ(進化版) »

XNA」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/543635/53698367

この記事へのトラックバック一覧です: XNAベースのゲームをAndroidに移植する方法(その4):

« XNAベースのゲームをAndroidに移植する方法(その3) | トップページ | PC1台でクラスタ(MSFC)を試すメモ(進化版) »