Flashムービーのすべての名前付きインスタンスを取得する
-
08-07-2019 - |
質問
actionscript 2を使用して、Flashムービー内の名前を持つすべてのインスタンスのリストを取得できます。すべての名前付きテキスト領域、またはすべてのmovieClipインスタンスなどを含む配列のように。または、テキスト領域などを削除すると、アクションスクリプトはこれらを動的に検出し、別のデータソースからテキストを取得できます。
私が欲しいのは、DOMツリーのようなものか、JavaScriptでgetElementByName()がどのように機能するかのようなものです。また、インスタンス名の文字列値を取得するので、xmlでテキスト値を見つけることができます。
デザイナーが「copyright」という名前の新しいテキスト領域を追加するとしましょう。そして、私のコードは(スクリプトを変更することなく)IDが「著作権」のデータを見つけるはずです。 XMLファイルが存在する場合は、その値をテキスト領域に追加します。
解決
@Stein Gauslaa Strindhaug
これはかなりラフですが、トリックを行う必要があります!
private function traceAllChildren(rootContainer:DisplayObjectContainer):void {
for(var i=0; i < rootContainer.numChildren; i++) {
var item:* = rootContainer.getChildAt(i);
try {
traceAllChildren(item);
} catch (e:Error) {
trace(e.toString());
}
trace(item.toString());
// This is the block where you can affect
// an 'item' depending on it's type, name, etc..
// eg:
// if (item.toString() == '[object TextField]') {
// item.text = "The text I want to insert";
// }
// or
// if (item.name == myTextFieldNameVar) {
// item.text = "The text I want to insert";
// }
}
}
その後、次のように呼び出します:traceAllChildren(this)またはtraceAllChildren(myParentMovieClip)。
これがお役に立てば幸いです!
他のヒント
簡単な答え:「組み込み」はありません。これを行う方法。 getElementByName()に似た機能を試してみることができますが、 _root
から開始してコンテンツをスパイダーする必要があります。厳密に言えば、ムービークリップはその子への参照で始まりますが実行時に削除されるため、これは失敗する可能性があります。
とはいえ、これは一般的な問題であり、多くのアプローチがあります。もっと便利だと思うことの1つは、カスタムクラスにアタッチされたカスタムコンポーネント(「TextPlaceholder」など)を作成し、デザイナーにそのコピーをダイナミックテキストが必要な場所に配置させることです。次に、実行時に、このコンポーネントはその _name
プロパティまたは他のカスタムコンポーネントパラメータを調べ、それらに基づいて適切なサイズ、コンテンツなどのテキストフィールドを作成できます。それはそれに近づくためのただ一つの方法です。
AS2コーディングを行ってからしばらく経ちましたが、おそらくMovieClip.getInstanceAtDepth()とthis.getNextHighestDepth()の組み合わせを使用して、ムービーの最高深度を見つけ、それが見つかるまで各下位深度をさかのぼることができます。新しいデータを取り込むクリップに対応するgetInstanceAtDepth()。
AS2のドキュメントにもこのサンプルコードがあります。
次のコードは、ステージ上のすべてのムービークリップインスタンスの深さをトレースします。
for (var i in this) {
if (typeof (this[i]) == "movieclip") {
trace("movie clip '"+this[i]._name+"' is at depth "+this[i].getDepth());
}
}
PS:おそらくこれを聞きたくないと思いますが、AS3ではthis.childrenを繰り返し処理するだけなので、これは面倒です!