Air on Androidでつまずいた部分のメモ

=前置き=

 FlashAir化すればAndroidなどでもアプリとして使えるということで、具体的にどれくらいの速度が出るのか調べたかった。
 そこで、GlowFilterがちょっと重いであろうwonderfl build flash online | 面白法人カヤックをタッチで操作するように変更したwonderfl build flash online | 面白法人カヤックAir化して速度を比較してみることにした。
 その際、つまずいた部分がいくつかあったのでそれをメモしておく。

=環境設定=

 Flex SDKの最新版をとったつもりが、微妙に古くてコンパイルに失敗した。(mxmlc -versionで確認したら4.5.1のはずなのに3.5とか出た)

 現時点での最新版は4.6でAdobe: Creative, marketing and document management solutionsからダウンロード可能。

 あとはこれにDownload Adobe AIR SDKからダウンロードした中身で上書きコピーすればOK。

 パスも変わるので設定し直す。

=サイズ合わせとクリップング=

 もともとwonderfl上で再生することを想定していたため、画面の幅は465x465固定で作っている。
 ケータイはサイズがぜんぜん違うので、サイズを合わせる必要が出てくる。

 サイズの方は

stage.scaleMode = StageScaleMode.SHOW_ALL;

という指定を加えることで画面にフィットするように自動的に拡大してくれる。
ただし、比率を維持するため上下にスキマができて、あまり見えてほしくないところが見えてしまう。
(wonderflにUPしたやつをフルスクリーンボタンで起動すればこの現象は確認できる)

 ということで、はみ出る部分は非表示にしたい(クリッピングしたい)。
scrollRectを使うとクリッピングできるようなので、以下のようなコードを入れることで非表示にするようにした。
maskだと描画に負荷がかかると思うけど、これは範囲の制限なのでむしろ高速化しそう。(ちゃんと調べてはいない)

var clipX:int = 0;
var clipY:int = 0;
var clipW:int = stage.stageWidth;
var clipH:int = stage.stageHeight;
if(clipW < clipH){
	clipY = (clipH - clipW)/2;
	clipH = clipW;
}else{
	clipX = (clipW - clipH)/2;
	clipW = clipH;
}
this.scrollRect = new Rectangle(clipX,clipY,clipW,clipH);

Airでバックキー=

 ランチャー形式なので、ゲーム時にバックキーを押したらリスト表示に戻りたい。
 デフォルトだとバックキーを押すとアプリ自体が閉じてしまうので、AIR アプリケーションにおける Android のホーム、メニュー、サーチ、バックキーの処理方法 | デベロッパーセンターを元にキーの対応を行った。

=電力消費の軽減=

 Airはホームボタンが押されてもバックグラウンドで回っているため、ムダに電力を消費してしまう。
 これもさきほどのAIR アプリケーションにおける Android のホーム、メニュー、サーチ、バックキーの処理方法 | デベロッパーセンターを参照して、exitを呼び出すことできちんと終了させる対応をした。

=swf in swf時の注意=

 色々とコピペして使うため、ランチャーのクラス名と起動するゲームのクラス名が同じなままswfをembedしたところ、生成時にエラーが出てしまった。
 これは別名のクラスにすることで解決した。

=アイコンの対応=

 サイトを参考にアイコンの設定をしたところ、「error 303: Icon icon.png is missing from package」というエラーが出てうまくいかなかった。
 これはhttp://merl.ec.t.kanazawa-u.ac.jp/diary_public/index.php?butchi%2F2011%C7%AF6%B7%EE#x8750937を参考に、adtの引数にアイコンのファイル名を指定すればOKだった。自分の場合、フォルダを指定してもうまくいかなかった。
 Flex Builderの場合は英語だけどXu Cui » Adobe AIR error 303とかPost.it: Error creating AIR file: 303:Error, [some path]が参考になりそう。

 また、「アイコンのファイル名は先頭を大文字にしなければならない」「57x57の画像を必ず用意しなければならない」「adtでアイコンのファイル名を並べるときは小さい順に並べなければならない」などの条件があるようなので、それぞれ対応する必要があった。

=バッチファイル=

 いちいちビルドやインストールを手で打つのは面倒なので、以下のバッチファイルを用意した。


 まずはswf(Flash)からapk(Android用ファイル)に変換するバッチファイル

adt -package -target apk -storetype pkcs12 -keystore codesigningCert.p12 Prototype.apk Launcher-app.xml Launcher.swf Icon_57.png Icon_512.png


 そしてそれを(上書き)インストールするバッチファイル

adb install -r Prototype.apk

=アップロード時の有効期限=

 自分の端末で実行確認する際は設定しなくても問題なかったけど、アップロードする際には有効期限を2033年以降になるように設定しなければならない。
 これはhttp://www.techmaru.net/ar/keytool.phpを参考にして設定すればOKだった。

=アップロード後のアドレス=

 設定ファイルのidの先頭にair.をつけたものがアドレスのidになる。
 自分の場合、showohealer.game.airprototypeの先頭にair.をつけて
https://play.google.com/store/apps/details?id=air.showohealer.game.airprototype
になる。

=動作比較=

 Air化したものはhttps://play.google.com/store/apps/details?id=air.showohealer.game.airprototypeに入っている。
 以前UPした試作集と同じようにランチャー形式になっており、これからいくつかゲームをここに追加していく予定。

 で、FlashAirの速度を比較したところ、どちらも十分な速度で動いているのを確認できた(Desire HDにて)。
 描画の高速化が必要だったのも確認したけど、もう少し検証したい。

=予定=

 もうしばらくは検証用のゲームをいくつか追加していきたい。具体的には描画負荷の高いもの(炎エフェクトとか)や、処理負荷の高いもの(物理エンジンとか)を試したい。
 また、Flash用の広告も調べて対応したい。今週末には帰郷してしまいゲームを作るには時間が足りないので、今週は広告について調べる予定。現状もムダに隙間ができてるので、今回は広告を入れても特にスペース的には困らないはず。


 ユーザとしてはAir用のランタイムは容量を圧迫するので微妙なところだけど、作る側としては端末ごとの微妙な差異を吸収してくれるのでAirで作るのはだいぶ楽。
 ということで、当面は生AndroidではなくAirで作っていくことになると思う。