意外と使えないMovieClip.getNextHighestDepth() [Edit]

MovieClip.getNextHighestDepth()メソッドは、現在使用されている最も数値の大きい深度のつぎ(+1)の値を返します。この値をスクリプトで新規に配置するMovieClipインスタンスの深度に設定すれば、他のMovieClipと重複せずに1番手前に配置することができます。しかし、このメソッド、実はあまり使えません。

MovieClipシンボルに"mySymbol"というリンケージ識別子をつけて、メインタイムラインに以下のフレームアクションを設定しましょう。[ムービープレビュー]を行うと、インスタンスが座標(0, 0)の位置に配置され、そのMovieClipをクリックすれば消滅します。[出力]パネルには、MovieClip.getNextHighestDepth()で取得した深度の値が表示されるはずです。

スクリプト001■MovieClipインスタンスをダイナミックに配置
// タイムライン: _level0
// フレームアクション
var nDepth:Number = this.getNextHighestDepth();
trace(nDepth); // 深度の確認用
var _mc:MovieClip = this.attachMovie("mySymbol", "my_mc", nDepth);
_mc.onPress = function() {
   this.removeMovieClip();
};

では、[コンポーネント]パネルからUI Componentsのコンポーネント、たとえばButtonをステージにドラッグ&ドロップします。コンポーネントのインスタンスは、ステージから削除しておきましょう。コンポーネントは、[ライブラリ]パネルに格納されています。

図001■[ライブラリ]パネルに格納されたコンポーネント
FN041212-001.gif

もう1度[ムーピーブレビュー]して、配置されたMovieClipインスタンスをクリックしてください。今度は、MovieClipがステージから消えません。なぜでしょう?

[出力]パネルに表示された深度の値を、確認してみてください。1048576になっているはずです。オンラインヘルプの[ActionScriptユーザーガイド] > [ムービークリップの操作] > [ムービークリッブの深度の管理] > [ムービークリップの深度]には、「ムービークリップに指定できる深度の範囲は、-16384から1048575までです」とされています。MovieClip.getNextHighestDepth()メソッドで得られた値は、この範囲外になってしまっているのです。

以下のステートメントを追加すると、MovieClipを配置する前に最前面に存在しているインスタンスを確認することができます。

trace(this.getInstanceAtDepth(nDepth-1)); // 出力: _level0.reserved

UI Componentsを[ライブラリ]に格納すると、自動的にDepthManagerクラスがロードされます。そして、DepthManagerはその初期化処理で、深度1048575にMovieClipインスタンス_level0.reservedを作成してしまうのです。1048575を超える深度に作成されたMovieClipの動作はサポートされず、実際MovieClip.removeMovieClip()メソッドでインスタンスを削除することができません。

スクリプト002■ DepthManagerクラスの初期化処理
class mx.managers.DepthManager {
   // highest allowed depth is reserved for tooltips and cursors
   static var reservedDepth:Number = 1048575;
   // ...[中略]...
   // reserve the topmost layer for ourselves

   private static var holder:MovieClip =
   _root.createEmptyMovieClip("reserved", DepthManager.reservedDepth);

結局、UI Componentsのコンポーネントをひとつでも使用すれば(厳密にはステージに配置しなくても[ライプラリ]に存在すれば)、メインタイムライン(_root)ではMovieClip.getNextHighestDepth()メソッドは使えないということになります。

[追記] 2006.12.22
DepthManagerを使った深度管理については、「深度の管理 − DepthManager」をご参照ください。

その他の記事