モバイルAdobe AIRアプリをPCに展開する2013-12-06 00:00

Adobe AIR Advent Calendarの6日目に飛び込み参加。

モバイルAIRアプリはAndroidとiOS向け、そんなふうに考えていた時期が俺にもありました。
(BlackBerryサポートはいつのまにか消えてる? )
実は、モバイルAIRアプリはAndroid向けのapk、iOS向けのipa、だけでなくWindowsやMac OS X向けのairファイルも書き出せるんですね。
これで1つのソースコードから4つのOS(Android、iOS、Windows、Mac)をカバーできちゃうぞ。

Flash Builder4.7で新規Flexモバイルプロジェクトを作成するとき「ターゲットプラットフォーム」には「Apple iOS」と「Google Android」があるだけ。
Flexモバイルプロジェクト作成画面

でも、リリースビルドの書き出しで「書き出し形式」項目の選択を「デスクトップでのインストール用の署名済み AIR パッケージ」にすると、.airファイルにパッケージされるのでWindowsやMac OS Xにインストールできるぞ。
モバイルFlexプロジェクト書き出し

ただし、AIRパッケージではネイティブエクステンションを使えないので100% Pure ActionScriptで限界に挑戦しましょう。
実際に1つのソースコードから4OSサポートのアプリ開発をしてますが、まあなんとかなります。

1つのソースといっても、OSや端末によってサポートされる機能が違うので気をつけないといけない部分はあります。
私はFlexモバイルプロジェクトで開発してますが、この時点で(デスクトップ向けの)Flexプロジェクトとサポートされる機能が違います。

デバイスプロファイルの記述通り、mobileDeviceプロファイルの機能だけサポートされます。「チェック」と書かれている機能は、実行時にisSupportedメソッドを呼び出して機能を使えるか確認しましょう。センサー類等のハードウェアが必要になる機能は使える使えないが想像できますが、NetworkInfo.isSupportedはiOSでは常にfalseだったりしてひどい。

OS毎に処理を分けたい場合は、Capabilities.osを見て分岐しましょう。
const isAndroid:Boolean = (Capabilities.os.toLocaleLowerCase().indexOf("linux") >= 0);
const isIOS:Boolean = (Capabilities.os.toLocaleLowerCase().indexOf("iphone") >= 0);
const isWin:Boolean = (Capabilities.os.toLocaleLowerCase().indexOf("windows") >= 0);
const isMac:Boolean = (Capabilities.os.toLocaleLowerCase().indexOf("mac os") >= 0);
こんな感じでいけます。
NetworkInfo.isSupportedの他に、SWFLoaderもiOSでは動作しないとか試してみてわかることが多すぎ。

あとは、app.xmlのinitialWindows要素内の記述はもともとデスクトップアプリ向けで、AndroidやiOSでは意味のないものが多いですが、モバイルAIRアプリでもWindowsやMac上で動作させる場合は有効です。(widthとかheightとか)
fullScreenをtrueにするとデスクトップでも全画面表示になってしまうので、実行時にOSを判別してモバイル端末だけ全画面にするとよいでしょう。
stage.displayState = StageDisplayState.FULL_SCREEN;
で全画面に切り替え、
stage.displayState = StageDisplayState.NORMAL;
で全画面解除になります。


クロスプラットフォーム開発の暗黒面はまた今度。
NativeApplication.nativeApplication.exit();でiOSじゃアプリ終了しやがらねえなんてかわいいもんだぜ。

ローグライク実験室の裏側2013-12-17 00:00

Roguelike Advent Calendar 2013 の17日目の記事です。

悪い話と良い話がある。
パシフィック・リムのブルーレイ版をレンタルして、PCで観ようとしたら案の定トラブってドライバー入れ直そうと削除したら再インストールが失敗する。ATI Radeon HD4200はWindows8.1には古すぎるか。8インチWindowsタブレット買っちゃおうかと調べたら今使ってるAMD Athlon II X2 240eとあんまりパフォーマンス変わらないって進歩しているようなしていないような。

良い話は、さっき起動したら消したドライバーが復旧してたよ。
実験室ページ用の半自動ビルド環境構築をメモって記事にしてWindows環境つぶしちゃおうと思ってたのにー。

「ローグライク実験室」はいろいろローグライクゲーム(といってもAngbandバリアントのみ)のパッチ作ったりするページにしようかなーと思ったこともありますが、結局CVSから最新ソース取ってきてコンパイルしてWindows用バイナリをうpするページになりました。
最初期は自分が遊ぶ用なのでリビジョンとか気にしない、CVSにはリビジョンなかったしね。パッチ適用変愚蛮怒のファイル名が年月日のものはその名残。

現在はほとんどのバリアントはSubversionに移行してるのでちょこっと洗練してリビジョン毎にビルドしてます。全自動まではいけてないけれど、今では手作業は苦にならないくらいには減らしてる。

作業は以下の流れ。
1.コミットの検出はRSSリーダーで
 SourceForgeならRSSフィードがあるし、GitHubにもある。
 Googleリーダー亡き後はFeedlyに移行。
2.コミット内容の確認
 trunk以外は無視するポリシーで運用。
3.ビルド対象のリビジョンをコンパイルする
 バッチファイルの引数にリビジョン番号を付けると、自動でzipファイルにパッケージングまでできちゃうBATを作ってある。
4.Dropboxのpublicフォルダにコピー
 Dropboxのpublicにファイル置くだけでサイト公開できるのでらくちん。
 ドメイン用意してないのでURLがあやしい感じなのはいなめないが。
 一覧HTMLはシェルスクリプト(Cygwin入れてる)で生成。容量足りなくてファイル消すことになっても一覧HTMLの維持がらくちん。
5.トップページの更新は手作業
 コピペして数字変えるのにたまに間違えてるのは手作業だから。
6.Twitterでつぶやく
 リビジョン○○をビルドしました。
 実験室ページにはTwitterの投稿表示するようにしたり結構マッシュアップ?
 でもFacebookとGoogle+のボタン用意したのにだれもいいねしてくれないよ。

まだ結構手間ひまかけてるけど、全自動にしちゃったら興味関心を維持できなくておしまいかな。

BATのビルドスクリプトは無くすとまた作るの面倒なのでアップロードしてるzipに一緒に入れてます。
CVSからソース取っていたころはwgetでtarballダウンロードしてたけど、コミット数多いのとダウンロードサイズの大きいDeeangband対策としてローカルにSubversionサーバ立ててコミット内容を同期するようにした。
VisualSVN Serverインストールして、他のリポジトリから同期するように設定。svnsync sync http〜で同期が実行される。
実行すると取り込まれたリビジョン番号がずらずら出てくるので、それ見て指定範囲のリビジョンをビルドするBATファイルを実行する。(ビルドBATをループで実行するBATファイル。)

おおざっぱにはこんな感じ。
バリアントによっては公式に無い俺おれmakeファイル用意してるのもあって、これは自分の都合のいいコンパイル環境を使うため。
今はMacbook Airがメインマシンなので、隣の部屋のWindows PCにChrome リモートデスクトップでインターネット経由で操作したり。

今時のゲームは時間だけでなくてお金も吸い取られるので、変愚蛮怒でなくてもスマートフォンでローグライクゲームができればね。あるにはあるんだけどねPCのと同じのが。操作しにくいよ。
昔作った携帯電話Java向けのmiRogueは、10キー操作に特化してたんだけどタッチパネル操作に合わせるにはどうしたものか。このネタは来年にまわして、今年のAdvent Calendarが埋まらなかったら「爆発だよ鉄獄は」の2013年バージョンを作ろうかな。

次はClockさんにバトンタッチ。