電子書籍の厳選無料作品が豊富!

Actionscript3.0で親のムービーから子のイベント指定して削除することは可能でしょうか?

親のステージに配置したmymcの中でballをENTER_FRAMEを使い動かしています。
親のステージに配置したbtnをクリックすることで、
ENTER_FRAMEを削除したいのですが、
下記のスクリプトだと、親のほうでmyenterframeが未定義と表示されてしまいます。

どのように記述すればよいのでしょうか?
よろしくお願いいたします。


ーーーーーーーーーーーーーーーーー親ーーーーーーーーーーーーーーーーー
btn.addEventListener (MouseEvent.CLICK, myclick);
function myclick(event:MouseEvent):void{
mymc.removeEventListener(Event.ENTER_FRAME, myenterframe);
}

ーーーーーーーーーーーーーーーーーmymcーーーーーーーーーーーーーーーーー
addEventListener(Event.ENTER_FRAME, myenterframe);
function myenterframe(evt:Event):void {
ball.x++;
}

A 回答 (2件)

myenterframeはmymcの名前空間にいるので



mymc.removeEventListener(Event.ENTER_FRAME, mymc.myenterframe);

とやれば動くんじゃないですかね


ちなみに僕はこういうことするときはmymc側に
リスナーを全てremoveする為の
destroyメソッドとか用意するようにしてます

そういうふうにしておけばmymcにremoveしたいリスナーが増えたり
親のclick以外からもmymcのリスナーをremoveしたいとなったときも
書き換えが楽になるのでオススメ
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
上記のやり方で出来ました。

>destroyメソッドとか用意するようにしてます
なるほど、便利そうですね。。
試してみたいと思います。

お礼日時:2010/11/11 02:59

> 子のイベント指定して削除



と書かれましても
子はどこにどうやってロードしたのでしょうか?
それがわからないと子のイベントの削除などできませんが。。。

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);
    • good
    • 0
この回答へのお礼

説明不足で申し訳ございません、
親のステージにムービークリップとして設置して、
インスタンス名をmymcとする、
という意味です。

ただ、子swfを設置するやり方も検討しておりましたので、
回答の方大変参考になりました。

稚拙な質問に丁寧にお答えいただき、ありがとうございました。

お礼日時:2010/11/11 02:49

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!