「電波とどいた?」
2009/04版 その2

2009/04/20 (月)

Squirrel on Flash Player (Squirrel, Flash, Alchemy)

_ 某案件で必要があって、squirrel での疑似スレッド拡張を、 ファイルロードを非同期で処理するように構成組み替えたんですが、ふと、そういや以前に Adobe Alchemyで AIR 版の squirrel 作ってみたけど、 この構造でつくれば、Flash Player でも動かせるんじゃね? と思ってちょこっと組んでみたらあっさり動いた件。 わあい。

関連して flyield() の正しい使い方もわかった。 これ、メインループを C側で持つ場合のみに有効なんですね。 Flash 側に制御を返すと、そこから先は Cモジュールを駆動してた インターバル制御系からはずれるので使えないというよく考えると当たり前の話だったのでした。

ちょっとバージョンあがってましたが、new/delete はあいかわらずだめぽ。 しょうがないので、object拡張機能用に、データ構造として stl とか 使ってたところも全部 squirrel 内部構造で処理するように直しました^^; まあ、結果的には squirrel のみに依存する独立性の高いソースになったのでおっけーってことで。

こんなかんじで、swf と同じフォルダに init.nut をおいておくと、それを呼みこんでその記述に従って動作します。オブジェクトは適宜 FlashPlayer の 機能を呼び出してインスタンス化して利用。スレッド(コルーチン)を使ってスクリプトを 回してあるので、suspend() で待ちを入れると、処理が一旦 Flash Player 側に帰って、 更新処理の後、またスクリプト側の続きに制御が戻って来ます。ってことで while で無限ループで メインループ書いてしまってOK。イベントドリブン的構造不要で「待ち」を含むシーケンシャルな 処理が簡単にかけるので、ぶっちゃけゲームとか作る場合は、性能は1段落ちますが、ActionScript で 書くよりも圧倒的に楽だろうと思います。たぶん機能クラスは ActionScript でつくって 制御は squirrel 使うってのがナイス。

内部的な解像度指定をスクリプト的に制御する方法がわからん^^; とりあえずコンパイル時きめうちになってます。 ソースも投げときますので、ご利用はご自由に。 吉里吉里squirrel拡張のような、システムネイティブなクラスを、直接 squirrel で継承 できるようにする処理はとりあえず組んでません。ActionScript3 はリフレクション系の 機能あるようなので、たぶん自動化できるはずなので気が向いたらそのうち。




メールはこちらへ...[わたなべごう (go @(at) denpa .(dot) org)]

この日記は、GNSを使用して作成されています。