Home > Progression > ProgressionでExternalInterfaceを使ってみる

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");
}

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

Comments:0

Comment Form

Trackbacks:0

TrackBack URL for this entry
http://ryow.net/mt/mt-tb.cgi/407
Listed below are links to weblogs that reference
ProgressionでExternalInterfaceを使ってみる from ryow.net Blog

Home > Progression > ProgressionでExternalInterfaceを使ってみる

About

りょうどっとねっとブログ

Twitter :ryownet

はてな :ryownet

Search

Return to page top