1

いらっしゃいませ、

私は単純なFLAプロジェクト(iOS用のAIR 3.6-ソース)を作成しました:

var k1:kloc1 = new kloc1();
var k2:kloc2 = new kloc2();

k1.x = 0;
k1.y = 0;
k2.x = 150;
k2.y = 150;

addChild(k1);
addChild(k2); 
trace("k2 name main timeline: " + k2.name);  
trace("k2 demo_tekst before: " +  MovieClip(root).k2.demo_tekst);  
k2.demo_tekst = 'podmieniony tekst';  
trace("k2 demo_tekst after: " +  MovieClip(root).k2.demo_tekst);  

kloc2はライブラリにあり、MovieClipから継承し、demo_tekst変数のみを含みます。

var demo_tekst:String = "oryginalny tekst";

kloc1もライブラリにあり、MovieClipから継承し、リスナーとトレース命令のみが含まれています。

addEventListener(MouseEvent.CLICK, onClick);
function onClick(e:MouseEvent):void {
    trace("k2 name from k1 obj: " + MovieClip(root).k2.name);
    trace(MovieClip(root).k2.demo_tekst);
}

上記のコードをテストすると、k1をクリックして、コンソールでの結果は次のようになります。

k2 name main timeline: instance3
k2 demo_tekst before: null
k2 demo_tekst after: podmieniony tekst
k2 name from k1 obj: instance3
oryginalny tekst

最終結果は、私が期待するように、「podmieniony tekst」ではなく、「oryginalnytekst」です。また、クレアチンk2オブジェクトの後、new()によって、demo_tekstはnull(?!)になります。デバッグモードでチェックしましたが、k2は作成中、および結果のトレース中に同じインスタンスを持っています。オブジェクト名は両方の場所で同じです。誰かが私に何が起こっているのか説明できますか?

4

1 に答える 1

1

k2名のメインタイムライン:instance3

これは、動的に作成されたオブジェクトに期待されます。インスタンスを作成するときに名前を付ける必要があります。そうしないと、インスタンスが生成されます。ステージ3番目のオブジェクトなので「instance3」になります。

解決:

var k2:kloc2 = new kloc2();
k2.name = "myK2";
trace("My k2.name = " + k2.name);  // My k2.name = myK2

k2 demo_tekst before:null

MovieClip(root)ルートをMovieClipオブジェクトとしてデータ型化するだけです(すでにそうなっています)。これを単純化するには、次のように記述します。

root.k2.demo_tekst

ただし、ルートオブジェクト(別名MainTimeline)に「k2」というプロパティがある場合でも、その名前のDisplayListオブジェクトはありません。DisplayListとオブジェクトのプロパティは、2つの明確に別個のものです。あなたの場合、MovieClipを指す「k2」というプロパティがルートにありますが、nameプロパティは空白のままになっているため、自動的に名前は「instance3」になります。

この一見便利なポインタの理由は、デフォルトでFlashIDEで「ステージインスタンスを自動的に宣言する」が有効になっているためです。ライブラリオブジェクトを作成したことを確認すると、MovieClipを指すプロパティがルートに自動的に作成されています。

実行時にオブジェクトを手動で作成した場合、これはオプションではありません。通常、dot.notation構文を使用するには、これらを手動で宣言する必要があります。

k2.name = "k2";
root.addChild(k2);
root[k2.name] = k2;

root.getChildByName("k2")逆に、ルートオブジェクトでのポインタの作成を使用および中止することもできます。多くの場合、これは正しい方法ですが、少し面倒です。


k2 demo_tekst後:podmieniony tekst

Flash IDEおよびAS2を使用している場合は、各従属オブジェクトのタイムライン上で直接ActionScriptを作成することに慣れていると思います。AS3ではそれを行わないでください。

demo_tekstMovieClipが再生されないため、変数は初期化されないと私は信じていk2.demo_tekstますk2.demo_tekst = 'podmieniony tekst'; 。MovieClipは動的であるため、これらの変数を競合することなく生成できます(そうではありません)。 SpriteやShapeなどの非動的オブジェクトを使用)。

次のように、MovieClipsを完全に動的に作成することを検討してください。

var k1:MovieClip = new MovieClip();
k1.name = "kloc1";
k1.demo_text = "replacement text";
addChild(k1);
trace(k1.name + ".demo_text = " + k1.demo_text);
// outputs:  kloc1.demo_text = replacement text

k1 objからのk2名:instance3

oryginalny tekst

最初の行は(k2オブジェクトに名前を付けたことがないため)予想されますが、これはタイムラインコードで操作の順序が興味深い場所です(これを行わないことを強くお勧めします)。ムービークリップがMainTimelineにペアレント化された後、子MovieClipのタイムライン内のコードが最終的に実行され、内部プロパティが上書きされますdemo_tekst

これが物事を明らかにすることを願っています。繰り返しになりますが、物事を単純にしたい場合は、すべてのコードを1つのドキュメントに記述することを強くお勧めします。これは最初のフレームで行うことも、外部に書き込んでincludeタイムラインに書き込むこともできます。

基本を超える準備ができている場合は、独自のクラスオブジェクトを作成してインポートすることを検討してください。これにより、カスタムオブジェクト(元の意図のように見える)に複雑なプロパティと関数を作成することができます。

于 2013-03-26T15:16:29.247 に答える