ProgressionでExternalInterfaceを使ってみる

非ProgのものをProg化するテストで、ExternalInterfaceを使ってJS通信するサンプルを加工してみました。
で、エラーが起こりまくるので頑張ってデバグしてみると、いろいろ見えてきたのでメモメモ。

ぶっちゃけブログパーツなんですが、
1.本体パーツをクリック
2.オーバーレイFlashが表示される
3.オーバーレイの閉じるボタンをクリック
4.オーバーレイ削除&本体パーツも表示mc変更
という流れのもので、3→4の流れでつまづいていました。

オーバーレイFlashの閉じるボタンの部分:

close_btn.addEventListener(MouseEvent.CLICK,closeFunc)
function closeFunc(e:MouseEvent):void{
ExternalInterface.call("endFunc");
}

JSの部分:

function endFunc(){
var player = document.all ? window["overlayID"] : document["overlayID"];
player.FlashCallBack();
window.setTimeOut(function(){
document.getElementByTagName("body")[0].removeChild("overlay_flash");
},1);//オーバーレイを画面から消すときはsetTimeOutを使った方がよさげなので
}

本体パーツFlash:

ExternalInterface.addCallBack("FlashCallBack","endFunc2");
function endFunc2():void{
mc1.visible=true;
mc1.gotoAndStop("BlogPartsEnd");
}

という、どうってことのない流れなんですが、FlashCallBackをコールするとエラーが起こりました。
uncaught exception: Error calling method on NPObject!
[plugin exception: Error in Actionscript.Use a try/catch block to find error.]
これ、ググって見るとセキュリティを満たしていないからだ、という記事が多々出てきたんですが、それだけじゃなさそうです。セキュリティについては、当然、Flash側もJS側もちゃんと書いてあります。念のためクロスドメインXMLも置きました(今回は関係ないのかな)。

//Flash
Security.allowDomain("*")
Security.loadPolicyFile("http://example.com/crossdomain.xml")
//JS(SWFObject)
bp_so.addparam("allowScriptAccess","always")

でもエラーが出ます。
uncaught exception: Error calling method on NPObject!
[plugin exception: Error in Actionscript.Use a try/catch block to find error.]
どうやらコレ、AS側にエラーがあると全部この表示になっちゃうっぽいです。
なので、AS側の処理をひとつずつ見ていくと、どこでつまづいているのかが分かります。

ExternalInterface.addCallBack("FlashCallBack","endFunc2");
function endFunc2():void{
//ここでmc1の参照がうまくいってないのでは、と考えたので
//mc1があるかどうかをチェックします
mc1 = getChildByName("test_mc")
return mc1
//mc1.visible=true;
// mc1.gotoAndStop("BlogPartsEnd");
}

mc1を返すようにしてみると、null でした。どうやらmc1が分からないまま処理を続けようとしてエラーになってるぽいですね。

でもProgressionじゃない版ではこの書き方で大丈夫でした。
ということは、Progのシーン(testScene)内にあるmcを見つけられてないっぽいなぁ、と思ったので

ExternalInterface.addCallBack("FlashCallBack","endFunc2");
function endFunc2():void{
return testScene
}

にしてみると、これまたnull でした。どうやらこのCallBackを定義している場所からtestSceneを参照できてないっぽいので、TestScene.as内に書いてみると、
「Object obj__19」
どうやら参照が通ったみたいです。

念のため

ExternalInterface.addCallBack("FlashCallBack","endFunc2");
function endFunc2():void{
return testScene.mc1.toString()
}

と書いてみると、「mc1」と出ました。これでOK。なので最終的には

ExternalInterface.addCallBack("FlashCallBack","endFunc2");
function endFunc2():void{
testScene.mc1.visible =true;
testScene.mc1.gotoAndStop("BlogPartsEnd");
}

これにて一件落着ですね。