実現させる方法の1つとして、以前ブログパーツを作った時に利用した ExternalInterface.call()でJavaScriptの関数を呼び出し、別のSwfをキックする方法があるが、今回は噂に聞いたことのあるローカルコネクションによる連携を行ってみた。
簡単なサンプルとして、マウスの動きをトレースするSwfを作ってみた。
2つのSWFに"objMc"というちっちゃいMcを配置し、それがマウスと一緒に動くというだけ。
まずは、呼び出し側(A.swf)に記述するActionScript。
オブジェクトがマウスにくっついて移動する。
stage.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMoveFnc);
// ローカルコネクションを使うよ。
var localConn = new LocalConnection();
// マウスにくっつく&別のSwfに指示を出す
function onMouseMoveFnc(Event){
objMc.x = stage.mouseX;
objMc.y = stage.mouseY;
// 接続状況のイベントリスナーを追加しておく。
localConn.addEventListener(StatusEvent.STATUS,endFnc);
// 実際に接続先のSwfの関数を呼び出す。引数も渡せる。
localConn.send("CONNECT","moveObject",objMc.x ,objMc.y);
// 接続状況のイベントリスナーの結果。
function endFnc(stat){
//trace(stat);
}
}
続いて、受け側(B.swf)に記述するActionScript。
オブジェクトを呼び出し側のオブジェクトと同じ位置にする。
var localConn:LocalConnection = new LocalConnection();
// 何だろう?おまじない?(未調査)
localConn.client = this;
// 自分は"CONNECT"で待ってるよ。
localConn.connect("CONNECT");
// 私を呼び出して!!
function moveObject ( _x, _y ) {
objMc.x = _x;
objMc.y = _y;
}
呼び出し側のaddEventListenerがミソなのだが、受け側のSwfがない場合があるとエラーが出てしまう。これを止めたかったので、イベントリスナーを追加して制御してみた。本当はエラーイベントをちゃんととるべきだと思うが、そこまで余裕がなかった・・・。
また、多くのサイトのサンプルの中で、受け側のSwfの関数の定義の仕方が以下のようになっていた。
自分の所だとうまく動かないのはなぜ?
まぁ、ちゃんとクラスにしてあげると public指定もしなければならないため、しっかり関数として独立させておくべきだと自分に言い聞かせて闇に葬る。
うーん、やってみるとJavaScriptより断然楽だな。
ただ気になったのは、これを配置したHTMLを2つ以上開くと、以下のようなエラーが出てしまう点。
at flash.net::LocalConnection/connect()
at B/frame1()
なるほど。同じコネクション名は同一PC上で1つしか利用できないということか。(ブラウザでなくPCね)
ここの回避方法は別途考慮しなければならない。頑張ろう。