Macromedia Flash非公式テクニカルノート タイムラインに置いたMovieClipからフレーム移動するとrootやstageが参照できない
問題 たとえば、メインタイムラインに2フレームをつくり、その第1フレームのみにMovieClipインスタンスを置きます(図001)。MovieClipインスタンスには、とくにビジュアルエレメントは要りません。 図001■全2フレームのメインタイムライン第1フレームにMovieClipインスタンスを置くMovieClipシンボルの第1フレームに、以下のスクリプト001を記述します(図002)。DisplayObject.enterFrameイベント(定数Event.ENTER_FRAME)のリスナー関数(xTest())から、メインタイムラインのつぎのフレームに移動します。DisplayObject.rootプロパティはDisplayObjectで型指定されていますので、MovieClipクラスのプロパティやメソッドにアクセスするときはMovieClipでキャストすべきことにご注意ください(「rootプロパティでメインタイムラインの関数にアクセスできない」の「対処法」[2]「キャスト」参照)。 スクリプト001■MovieClipインスタンスからメインタイムラインのフレームを移動する
図002■MovieClipシンボルに第1フレームアクションを記述 [ムービープレビュー]を試すと、[出力]パネルにつぎのようなランタイムエラーが表示されます。 TypeError: Error #1009: null のオブジェクト参照のプロパティまたはメソッドにアクセスすることはできません。 原因 表示リストに追加されていない表示オブジェクトの場合、root プロパティには、null が設定されます。 インスタンスの存在していないフレームに移動すると、そのインスタンスは親の表示リストから削除されます。その結果、上記の説明のようにDisplayObject.rootプロパティの参照がnullになっているものと考えられます。 DisplayObject.stageプロパティにもつぎのような記述がありますので、その参照については同じ注意が必要です。 表示オブジェクトが表示リストに追加されていない場合、stage プロパティは null に設定されます。 対処法
[ムービープレビュー]を試すと、エラーは生じません。また、テスト用にtrace()関数を加えていますので、つぎのような[出力]が示されます。フレームの移動によりDisplayObject.rootやDisplayObject.stageプロパティがnullになり、親インスタンスの表示リストから削除されていることが確かめられます。 [object MovieClip] [object Stage] 1 もっとも、自身の存在しないフレームに移動してスクリプトを実行し続けることには不安があります。そのときインスタンスからの参照がどのように変わるか明らかではないからです。実際、前掲スクリプト001は、Flash Player 9で書出すとエラーが生じないようです。インスタンスの表示リストから削除されるタイミングが変わったものと推測されます[*2]。そのタイミングはドキュメント化されている訳ではありませんので、仕様変更とみなされる余地が大きいでしょう。 そうすると、自身の存在しないフレームへの移動は、できるかぎりスクリプトの最後に行うことが安心です(スクリプト003)。 スクリプト003■親タイムラインのフレーム移動をスクリプトの最後に行う
もちろん、自身の存在しないフレームへの移動が原因ですので、移動先フレームまでインスタンスを継続して残すという対処法もあります。ただ、この問題を解消するためにタイムラインをいじるというのは、大げさでしょう。
作成者: 野中文雄 Copyright © 2001-2010 Fumio Nonaka. All rights reserved. |
|||||||||||