参考にしたもの

SDK のダウンロードはこちらから。(メールアドレスの登録が必要です)

このページの一番下にある「ドキュメンテーション zip ファイル」に API リファレンス HTML が入っています。展開して index.html をブラウザに放り込み、このローカルなページをブックマークしておきましょう。オンラインのリファレンスもありますが、タブブラウザでたくさん開くとなぜかだんだん重くなっていきます。ローカルなら全文検索ができませんが閲覧はとても快適です。

昨年のSアプリの時に続き、いつもお世話になっています。ActionScript 3.0ゲームプログラミングブック (Flash for Professionals) も買いました。

i アプリの名作ゲーム(と個人的に思っている)の作者でもあり、3 時間で Flex2 SDK に移植してしまった id:naoya2k さんの記録。全てのソースも公開されていて実に読み甲斐があります。しかし 3 時間てまじすか…。

id:mdiapp さんの開発記録。他のサイトがゲーム中心なのに対し積極的に実用アプリに手を出そうとされています。

作ったもの

Flex2 SDK のヘルプを眺めていると、画面に表示されるものは全て個々の行列を持っているようです。ということは、移動だけでなく拡大・縮小・回転も簡単にできそうですね。ところが、参考にしたサイトを見ていると、フレームバッファのような表示用の Bitmap を用意し、そこに描画していくという方法がよく使われているようです。
いわゆるゲームのスプライトのように細かい物体が動き回るような用途なら、毎回 Bitmap に描画する必要もなく、ただ addChild() するだけで済むような気がしたので、テストプログラムで確認してみました。

おぉ、ちゃんと動いているようです。拡大されたドットに激しく萌えてしまいますね(笑)。

一方 Bitmap に描画する方法でどんなメリットがあるのかピンとこなかったので、こちらも試してみました。

なるほど! 描画時にいったんフレームバッファ Bitmap の解像度に落ちるので、往年のシステムII基板のようなエイリアシングや変形のひずみに萌える人にはたまりませんね!

キーボードのフォーカス

少し苦労したのはキーボードフォーカスの扱いです。
こちらにも書いてある通り、アプリケーションのオブジェクトにイベントリスナーの関数をセットしてもちっとも呼ばれないため、イベント受信用の Sprite オブジェクト(m_canvas)を addChild() でつるし、そこにセットしてやる必要があるようです。
さらに、イベント受信用の Sprite の子供が表示領域全体を覆う Bitmap 1 枚だけなら問題ないのですが、今回の例のように TextField と Bitmap のように複数の子供をつるす場合はキーボードフォーカスの問題が出てきます。つまり、そのままでは表示されているテキスト部分や Bitmap をクリックしないとキーボードイベントが来てくれませんし、それら以外の部分をクリックすると途端に来なくなります。
これに対する解決として色々考えていたのですが、ヘルプを眺めていた所、stage.focus というプロパティにキーボードイベントを受ける表示オブジェクトを指定できるようです。そこで、MOUSE_DOWN のイベントリスナー関数の中で、以下のように書くことでとりあえず解決できました。クリックされた瞬間にフォーカスが外れるのを強引に奪う、というやり方なのでちょっと乱暴な気もしますが…。*1

private function onMouseDown(event:MouseEvent):void
{
	stage.focus = m_canvas; // focus が他へ移るのを防止
}

そして解決してからこちらのページにも同様の記述があることを発見…。orz

*1:子供のオブジェクトの方に「うちは focus を受け取りません」と設定することができれば、そっちの方が正しいような気がするんですが…いや、1ページ内に複数の swf が存在する時がダメですね…。結局強引にフォーカスを奪うしかないのか…。orz

とりあえず

動く事は確認できたので先に進めそうです。墓穴ネタの具体化まではもうちょっと時間がかかりそうですが…。*1

*1:そういえばジャンプする方向が違うような…。墓穴ネタ自体はトップビューでもないし…はっ!! orz

(1/31追記)Stage にイベントリスナーをセットする版

アプリの土台となる Stage オブジェクトにもイベントリスナーがセットできることがわかりました。こちらだと、内部の表示オブジェクトのいずれにフォーカスがあっても必ずイベントが届くのでイベント受信用 Sprite が不要になります。