-
Flash
Posted on 2月 19th, 2006 はおりん No comments最近ワケあってFlashをいじっている。
といっても、そこらのFlash職人さんのようにアニメーションがどうこうとか、そういうものを作っているわけではない。
今作っているのは、いわゆる着せ替えアプリ。パーツが山のように用意してあり、レイヤ数も10以上あって、パーツのアイコンをクリックすると、対応するレイヤにパーツを表示するというもの。
トゥイーン(だったっけ?)など一切使わず、アニメーションもすべてプログラミングで実現している。
そんなこんなで、BitmapDataクラスが必須になってしまったため、Flash6対応を諦め、Flash8対応とした。FlashはVBのようなものだと思っていたが、ActionScript2.0からはずいぶんと進化しているようだ。
クラスを使用したオブジェクト指向的なプログラミングスタイルになっているため、C++やJAVAに慣れた人には比較的わかりやすいと思う。
ガベージコレクトもしっかりしていて、duplicateMovieClipしたあと、removeMovieClipせずに放置しても、duplicateの際に同じインスタンス名を指定すれば勝手に上書きしてくれる。
パーツ切り替えを延々と、高速でやっていると。メモリを最大で350MB強食うが(実装メモリ1GB)、ある瞬間に95MBまで下がる。
おそらくこれがガベージコレクトの瞬間だろう。また、Cで言うところの関数ポインタ的なものも実装されており、新しく作ったムービークリップインスタンスのイベントハンドラに、functionを割り当てることが出来る。
これで、動的に生成される複数のボタンの挙動をまったく同じにすることが出来る。
functionの中ではthisが使えるので、this参照を使用して、インスタンスごとに挙動を変えることも出来る。さらに驚いたのはdynamicキーワードである。
このキーワードのついたクラスは、宣言無しで動的にメンバを追加することが出来る。
MovieClipにはこのキーワードがついており、イベントハンドラの中でインスタンスグローバルな変数を使用したいと思ったら、存在しないメンバ変数に勝手に代入してしまえばよい。宣言はいらない。イベントハンドラは、いわゆる関数ポインタなので、プログラム中から強制的に呼び出すことも出来る。
たとえば、onLoadなどはインスタンス生成時に呼び出されるハンドラなので、本来ならばクラスを継承してオーバーロードしなければ呼ばれないものであるが、インスタンス生成直後に強制的に呼び出して、任意の初期化処理をさせることも出来る。たとえば、メンバ変数にデフォルト値を代入するとか。僕はデザイン能力が皆無なので、Flashなどとは無縁だと思っていたが、真にマルチプラットフォームなGUI環境としては悪くないと思った。
XML通信も行うことも出来るので、UIをFlashで、サーバをNativeコードで。などということも可能だ。
また、XMLでなく、CGIクエリでもこれは可能だ。
FlashとPHPを連携させてマルチプラットフォームなシステム開発などは新しい世界かもしれない。
過去日記コメントを書く