ブラウザ上でのSWF実行
Flashエミュレーション/Flash互換技術情報
SWF2JSを用いたFlashエミュレーションに関する情報です

●SWF2JSを用いたFlashエミュレーション

■概要

SWF2JSはあまり複雑ではないActionScript2の実行が可能なSWFエミュレータである。AS3に対応した商用版も存在しており、より完全なエミュレーションに向かって、ゆっくり改善していくと思われる。しかし、例えば直接Socket接続可能だった従来の仕様(WebSocketのようにHTTP上にトンネルを作るのではない)の完全再現は厳しいだろう。そこで、JavaScript側とSWF側の得意な処理を役割分担する構成に作り替えていく方式に着目する。例えば、なるべくオープンにしたくないコードをSWF中に埋め込んだり、細かな画像で頻繁に更新したいようなものは、スプレッドシートを作るよりもSWF中に埋め込んだほうが管理しやすい場合も考えられる。また、当面はFlash CS5やFlash CS6のようなFlash統合開発環境の機能や作業ノウハウを有効活用できる(WindowsOSのバージョンアップにより、しだいにAdobe Flash統合環境の利用は厳しくなると予想される)。たとえば、ボーンツールやモーショントゥイーンのような成熟した機能は今でも便利かもしれない。
imghttps://github.com/swf2js/swf2js

■SWF内からJavaScript関数の呼び出し

AS2のgetURL()関数内に"javascript:"から始まるJavaScriptを記載することで関数を呼び出せる。

getURL("javascript:foo(\"文字列"\", 0, 1, 2);");


■JavaScriptからSWF内関数の呼び出し

SWF2JS起動時の引数"callback"を用いてAS2のrootポインタを取得する。取得したrootにaddEventListener("enterFrame", ...)にて毎フレーム実行されるコールバック関数を登録すれば、ポーリング動作で自由にSWF内とJavascript間でデータ送受できるようになる。必要に応じて処理に応じたコールバック関数を定義していけば、非ポーリング動作も可能となる。例えば(2022年時点では)XMLのパース処理はSWF2JSが持っておらず、JavaScript側でパース処理した結果をSWF側から参照する構成が作りやすい。他にも、Flash独自SocketのWebSocket通信への置きかえ、Full画面表示を含むHTMLコンポーネントの操作などは、JavaScript側で処理を実装する必要がある。あまりSWFを開いて再パブリッシュしなくてもよいような書き方をすることで保守性も高まる。

<script type="text/javascript" src="./swf2js.js"></script> <script type="text/javascript"> swf2js.load("target.swf", {"tagId": "container-1", "bgcolor": "#000000", "callback": 'function(_root){ _root.addEventListener("enterFrame", function(){}); }', "FlashVars":{ "X":1, "y":"String" } }); </script> <div id="container-1" style="width:640px; height:400px;"></div>