サイトトップ

Director Flash 書籍 業務内容 プロフィール

Macromedia Flash非公式テクニカルノート

MovieClip.duplicateMovieClip()メソッド

ID: FN0506001 Product: Flash

Platform: All
Version: Flash 5 and above

シンタックス
my_mc.duplicateMovieClip(newname:String, depth:Number [,initObject:Object]) : MovieClip

引数(型指定は訳者による追加)
newname:String   複製されたMovieClipに与える一意の識別子(訳者注: 文字列で指定)。

depth:Number   深度を指定する一意の数値(訳者注: 整数)[*1]。指定したMoiveClipは、その深度に配置されます[*2]。

initObject:Object(Flash Player 6以降でサポート)   複製したMovieClipに設定すべきプロパティを格納したオブジェクト。この引数を使って、動的に作成したMovieClipに、パラメータを与えることができます。initObjectがオブジェクトでなければ、この引数は無視されます[*3]。initObjectのすべてのプロパティは、新たなインスタンスにコピーされます。initObjectで指定したプロパティは、コンストラクタ関数で使うことができます[*4]。この引数は、省略可能です。

[訳者注*1]「一意」(unique)というのは、同一の親タイムライン上における他のインスタンスと深度の値が重複しないことを意味します。オーサリング時に配置したビジュアルエレメント(シェイプやインスタンスなど)も含めて、ひとつの深度にはひとつのオブジェクトしか存在できません(1深度1オブジェクト)。したがって、すでにビジュアルエレメントのある深度にMovieClipインスタンスを作成すれば、予め存在したエレメントは消滅し、作成したインスタンスがそれに取って替わります。

[訳者注*2] 原文に"the SWF file specified is to be placed"とあるのは、誤りでしょう。上記の本文では、"the MovieClip specified is to be placed"の意味に修正しました。

深度には、0以上1,048,575以下の整数を指定します。-16,383以上-1以下の深度は、ムービーを作成(オーサリング)するときに配置したエレメントが使用します。オーサリング時に作成したコンテンツの背後に動的にMovieClipを複製したい場合には、-16,384を深度として指定することができます。

[訳者注*3] Objectクラスを継承したインスタンスであれば、使用することができます。したがって、たとえば後述[訳者注*5]のように、MovieClipインスタンスをこの引数として指定することも可能です。

[訳者注*4] MovieClipシンボルにMovieClipクラスを継承したカスタムクラスを設定した場合、そのクラスのコンストラクタ関数内で、コピーされたプロパティにアクセスすることが可能です。

戻り値(型指定は訳者による追加)
MovieClip(訳者注: Flash Player 6以降でサポート)   複製されたMovieClipへの参照。

説明
メソッド; SWFファイルの再生中(訳者注: ランタイム時)に、指定したMovieClipのインスタンスを(訳者注: 別途)作成します。

複製されたMovieClipはつねに第1フレームから再生を開始し、元のMovieClipのフレームがduplicateMovieClip()メソッドを呼出したときどの位置にあったかは関係ありません。元のMovieClipの変数は、複製されたMovieClipにはコピーされません[*5]。

MovieClipをduplicateMovieClip()の使用により作成していた場合、親のMovieClipに対してduplicateMovieClip()を呼出しても、そのMovieClipは(訳者注: 親とともに)複製されることはありません。親のMovieClipが削除されれば、複製された(訳者注: 子の)MovieClipもともに削除されます[*6]。

MovieClip.loadMovie()またはMovieClipLoaderクラスを使ってMovieClip(訳者注: に外部ファイル)をロードした場合、SWFファイルのコンテンツは複製することができません。つまり、帯域幅を節約するために、JPEGやSWFファイルをロードしてからMovieClipを複製するということはできません[*7]。

[訳者注*5] 原文は、"Variables in the parent movie clip are not copied into the duplicate movie clip" としています。しかし、親つまり_parentのパスに設定された変数が、その子(下位のパス)となるインスタンスの複製にコピーされる理由はありません。したがって、上記本文では、"Variables in the original movie clip are not copied into the duplicate movie clip"の意味で解釈しています。

変数だけでなく、ダイナミックに追加されたユーザー定義のプロパティ・メソッドは、複製の対象になりません。たとえば、MovieClipに設定されたイベントハンドラメソッドも、複製したインスタンスにはコピーされません。これに対して、MovieClipアクションは、コピーされます。

以下のサンプル(スクリプト001)で、複製元のMovieClipインスタンスmy_mcに設定した変数testおよびイベントハンドラメソッドMovieClip.onEnterFrameは、MovieClip.duplicatMovieClip()メソッドで複製したインスタンスにはコピーされません(図001)。

スクリプト001■変数とイベントハンドラメソッドを設定したMovieClipを複製

// フレームアクション
// 複製元MovieClipインスタンスmy_mcを配置
var my_mc:MovieClip;
my_mc.test = 100;
my_mc.onEnterFrame = function() {
   this._rotation += 10;
};
var _mc:MovieClip = my_mc.duplicateMovieClip("my2_mc", 1);
_mc._x += 100;
trace(_mc.test); // 出力: undefined

図001■MovieClip.duplicateMovieClip()メソッドで複製したインスタンス

(画像クリックでSWFを表示)
変数testとMovieClip.onEnterFrameイベントハンドラメソッドは複製されない

ユーザー定義のプロパティ(変数)やメソッドをコピーするには、複製後にそれらを個別に設定するか、第3引数(initObject)として複製元MovieClipインスタンスを渡します(スクリプト002・図002)。

スクリプト002■複製元インスタンスをMovieClip.duplicateMovieClip()の第3引数として渡す

// フレームアクション
// 複製元MovieClipインスタンスmy_mcを配置
var my_mc:MovieClip;
my_mc.test = 100;
my_mc.onEnterFrame = function() {
   this._rotation += 10;
};
var _mc:MovieClip = my_mc.duplicateMovieClip("my2_mc", 1, my_mc);
_mc._x += 100;
trace(_mc.test); // 出力: undefined

図002■変数とイベントハンドラメソッドがコピーされたインスタンス

(画像クリックでSWFを表示)
変数testとMovieClip.onEnterFrameイベントハンドラメソッドが複製にも設定された

[訳者注*6] 複製したMovieClipインスタンスを削除するには、MovieClip.removeMovieClip()メソッドを使います。なお、このメソッドは、負の深度に設定されたインスタンスを削除することはできません。

[訳者注*7] MovieClipインスタンスを複製してから、同じ外部ファイルを改めてロードする必要があります。ただ、ブラウザのキャッシュが利用されるので、2回目以降のアクセスは通常速くなります。


つぎの例は、MovieClipのcircle_mcを複製します。コードは、circle1_mcというMovieClipを作成し、xy座標(20, 20)に配置しています[*8]。

circle_mc.duplicateMovieClip("circle1_mc", this.getNextHighestDepth(), {_x:20, _y:20});


[訳者注*8] MovieClip.getNextHighestDepth()メソッドについては、F-site「意外と使えないMovieClip.getNextHighestDepth() 」をご参照ください。

Player
Flash Player 5以降。

出典
Flash MX 2004 ActionScript Language Reference: MovieClip.duplicateMovieClip() より邦訳。

_____

作成者: 野中文雄
更新日: 2005年7月14日 [訳者注*1]を追加
作成日: 2005年6月12日


Copyright © 2001-2006 Fumio Nonaka.  All rights reserved.