0

それで、私は自分自身を数分節約してコードを少しきれいにするために恥ずかしい時間を費やしましたが、Google は何も生成しませんでした。問題は、角括弧表記 + ライブラリ項目にあります。

たとえば、「myMC_5」という名前のムービークリップがあり、その X 位置を 0 に設定するとします。

myMC_5.x = 0;

..そして、MC の名前をハードコーディングしたくないが、変数に基づいて特定の MovieClip を移動するための 1 行のコードが必要な場合は、次のようにすることができます。

var selectMC = 5;
root["myMC_"+selectMC]x = 0;

..これは myMC_5.x = 0 とまったく同じ効果がありますが、今回は場所 (「ルート」または「これ」など) を指定する必要があります。

問題:

背景のグラフィックがライブラリから読み込まれるゲームに取り組んでおり、レベルごとに異なります。ライブラリからのベクターの初期読み込みは次のようになります。

private var land:vector_land0 = new vector_land0();

..これは正常に機能しますが、その特定のベクトルのみをロードします。約30以上あるはずです。次のように、現在のレベルを追跡する変数に基づいて、それらのいずれかをロードするために、コンストラクターに 1 行のコードを配置したいと思います。

private var land:["vector_land"+theLevel] = new ["vector_land"+theLevel]();

..しかし、それは機能しません。最初の例のように、オブジェクトの場所を指定する必要があるため、構文エラー ("expecting identifier before leftbracket") が発生します。

root["myMC_"+"whatever"].x = 0;

..しかし、このライブラリ アイテムには「場所」がありません。では、ライブラリからベクターを動的にロードするにはどうすればよいのでしょうか。「ルート上」や他の場所ではありません。場所がありません。これを達成するための標準的な方法が、30 の異なるクラスを作成するか、30 の「if」ステートメントを含む巨大なコード ブロックを作成することであるとは信じられませんが、Google を検索しても何も見つかりませんでした。:(

4

2 に答える 2

1

次のようなことを行うために使用できるgetDefinitionByName()を探しているようです。

import flash.utils.getDefinitionByName;

private var LevelVectorClass:Class = getDefinitionByName("vector_land" + theLevel) as Class;
private var land:Object = new LevelVectorClass();
于 2014-04-14T23:54:28.347 に答える
-1

これは状況を解決する恐ろしい方法です。角括弧を使用することはお勧めしませんarrays。「土地」を に入れることをお勧めします。LandContainer MovieClipその各フレームには、MovieClip1 つのグラフィックが含まれます。これははるかにクリーンで、フレームの「ID」を格納する定数を作成できます。
例:

var land:LandContainer = new LandContainer();
land.gotoAndStop(FIRST_LEVEL); //FIRST_LEVEL is a constant integer

別のインスタンスを作成せずに、可視性を設定したり、表示リストから削除したり、フレームを次のレベルに設定したりできるため、この LandContainer インスタンスを再利用することもできます。考え直して、このクラスのラッパーを作成します。別名、クラスを拡張しMovieClipてカスタム関数、フィールドを作成する独自のクラスにリンクします...など.

この動的なものは恐ろしく、保守が難しく、まったく効率的ではありません。AS3 から削除しなかった理由がわかりません。削除する必要があります。

于 2014-04-14T22:50:04.247 に答える