- ベストアンサー
Actionscript3.0 子のイベントを削除
- Actionscript3.0で親のムービーから子のイベント指定して削除する方法について
- 親のステージに配置したmymcの中でballをENTER_FRAMEを使い動かしています。親のステージに配置したbtnをクリックすることで、ENTER_FRAMEを削除したい方法はありますか?
- btn.addEventListener (MouseEvent.CLICK, myclick);関数で、mymc.removeEventListener(Event.ENTER_FRAME, myenterframe);を指定すると、親のほうでmyenterframeが未定義と表示されてしまいます。どのように記述すればよいでしょうか?
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
myenterframeはmymcの名前空間にいるので mymc.removeEventListener(Event.ENTER_FRAME, mymc.myenterframe); とやれば動くんじゃないですかね ちなみに僕はこういうことするときはmymc側に リスナーを全てremoveする為の destroyメソッドとか用意するようにしてます そういうふうにしておけばmymcにremoveしたいリスナーが増えたり 親のclick以外からもmymcのリスナーをremoveしたいとなったときも 書き換えが楽になるのでオススメ
その他の回答 (1)
- BlurFiltan
- ベストアンサー率91% (1611/1754)
> 子のイベント指定して削除 と書かれましても 子はどこにどうやってロードしたのでしょうか? それがわからないと子のイベントの削除などできませんが。。。 mymc.removeEventListener(Event.ENTER_FRAME, myenterframe); と書かれていらっしゃるところから 「mymc」 という変数名の Loader に 子SWF をロードしたということでしょうか? (Loader にしては変な名前ですが...) なんだかよくわかりませんが 仮に 「mymc」 という名の Loader に 子SWF をロードしたということにします。 また 仮に 子SWF のファイル名を 「ko.swf」 ということにします。 その場合の親のフレームに書くスクリプト(例)↓ ==================== //「mymc」という Loaderインスタンス を作成 var mymc:Loader = new Loader(); //「req」という「ko.swf」のURLリクエストを作成 var req:URLRequest = new URLRequest("ko.swf"); //「mymc」に「ko.swf」をロード mymc.load(req); //「mymc」をこのタイムラインに配置 this.addChild(mymc); //---↑仮に以上のようにした場合↑--- //---↓質問箇所の回答は以下↓--- btn.addEventListener(MouseEvent.CLICK, myclick); function myclick(event:MouseEvent):void { //「mymc」にロードされたSWFコンテンツを //ムービークリップとした参照変数「ko_mc」を作成 var ko_mc:MovieClip = mymc.content as MovieClip; //「ko_mc」内のリスナーを削除 ko_mc.removeEventListener(Event.ENTER_FRAME, ko_mc.myenterframe); } ==================== 「↑仮に以上のようにした場合↑」 より上が変われば 当然 「↓質問箇所の回答は以下↓ 」 より下も変わります。 (本当の状況がわからないので 「仮に」の状況でしか回答できません。) var ko_mc:MovieClip = mymc.content as MovieClip; ko_mc.removeEventListener(Event.ENTER_FRAME, ko_mc.myenterframe); myclick内の↑この2行は 要するに Loader に 子SWF をロードした場合 Loader.content が 子SWF のメインタイムラインになります。 しかし Loader.content を単純にそのまま指定すれば Loader.content は DisplayObject として扱われるため その「myenterframeプロパティ など取得できないよ!」ということになります。 そこで Loader.content を MovieClip として扱うものとして そのMovieClip 内の myenterframe関数 にアクセスしています。 そういう意味を含んだ2行です。 なお,この行↓は var ko_mc:MovieClip = mymc.content as MovieClip; 次↓のようにしても良いです。 var ko_mc:MovieClip = MovieClip(mymc.content);
お礼
説明不足で申し訳ございません、 親のステージにムービークリップとして設置して、 インスタンス名をmymcとする、 という意味です。 ただ、子swfを設置するやり方も検討しておりましたので、 回答の方大変参考になりました。 稚拙な質問に丁寧にお答えいただき、ありがとうございました。
お礼
回答ありがとうございます。 上記のやり方で出来ました。 >destroyメソッドとか用意するようにしてます なるほど、便利そうですね。。 試してみたいと思います。