gotoAndStop(2)後のaddEventListenerの挙動

あるMC”panel”のフレーム1に”btn1″、フレーム2に”btn2″があり、これを条件分岐で切り替える構造のFlashだとする。下みたいな実装。

if(hoge){
panel.btn1.addEventListener(MouseEvent.CLICK, mouseDownHandler);
}else{
panel.gotoAndStop(2);
panel.btn2.addEventListener(MouseEvent.CLICK, mouseDownHandler);
}

要はフレーム移動直後に、その移動先フレームにのみ存在するボタンに対して addEventListener するケース。

FlashIDE上でのパブリッシュ設定が FlashPlayer10 の時は動くのに、FlashPlayer9 設定に切り替えると null エラーになる。

ビックリした。

ちなみに両フレームともにまたがるように配置されたボタンなら大丈夫、あくまでgotoAndStop移動後に初登場のオブジェクトに対してイベント付けた時に起こる。


“gotoAndStop(2)後のaddEventListenerの挙動” への3件の返信

  1. テストしてないんですけど、昔同様の問題が起きたときのことをちょっと思い出したので。
    要するに、gotoAndStop()で遷移した先のフレームに存在するインスタンスへを参照できないということですよね?
    RENDERイベントとinvalidateメソッドを使えば9のプラットフォームでも解決できそうじゃないでしょうか?
    ⇒http://mag.autumn.org/Content.modf?id=20080730135451
    ただし、バージョン9世代のプレイヤーの最初のリビジョンでは、RENDERイベント自体が発生しないバグがあったような。
    ⇒http://level0.kayac.com/2008/02/as3gotoandstopeventrender.php

    ご参考までにどうぞ。

  2. 9プラットフォーム時に
    if(hoge)の部分に
    if (mc == null || mc.hasEventListener(MouseEvent.CLICK)のような判定がないと、フレーム移動のたびにリスナー登録されメモリリークしたのをおぼてます。これを10でも試してみたのですが、同様のErrorとなりますね。案としてはStageあたりにEventListener登録して、target.event.nameでスイッチしてやればいいかと。

  3. 前項、(implus)
    誤植がめだつので訂正致します。
    (誤)「9プラットフォーム」(=AVM2) ,
    (誤)target.event.name(=event.target~)nameは任意です。
    nameを任意に指定しない場合、
    インスタンスから始まるAVMに割り振られたインスタンス名となります。

    にゃ。
    イベントリスナーを登録した場合は
    プラットフォームにかかわらず、現時点ではnullエラーとなります。
    MovieClipを継承した場合の典型でもありますが。。。

    にゃごー。
    たしかに、AS2にくらべれば(AS3)、だいぶよくなりましたが、
    仕様部分を理解するのに時間がかかりすぎて、骨おれます。
    DOMとかが、導入の人には楽勝過ぎるのかもしれないのですが。
    java scriptのいわゆぅーる、スクリプト部分とjavaのいわゆぅーる、class部分が交互に
    おりまじり、私としてはカオスとしかw(ぁ,でも楽しいですよ)
    UMLとデザインぱたぁーんが織りなす、美しいコードが、いつか書きたいと。
    おもいつつ。2010年12月31日になってしまった。
    (とお茶を濁しましたが、実質はテスト&デバッグの繰り返しでつかれちゃいますw)

    にゃ。
    はやいけど。来年の抱負。
    ASでつくった自分のclassのDocument化と、
    かみさんと、にゃんこと、こどもの、幸せと、
    あとは、「きたきたきたぁー」って瞬間を増やしたいです。

コメントは受け付けていません。