Verständnisfrage

NoGFX

Erfahrenes Mitglied
Weniger ein Problem als eine simple Frage.

Wenn man ein Mc via attachMovie oder createEmptyMovieClip erstellt, wieso liest man häufig, dass die Hirachie dieser Objekte in ActionScript wie folgt geschrieben wird:

PHP:
_root["test_mc"]["test2_mc"]._visible = false;

Während es doch genausogut funktioniert mit:
PHP:
_root.test_mc.test2_mc._visible = false;

Wobei Methode zwei den deutlichen Vorteil hat, dass auf diesem Weg das "_mc" des Objektes von Flash erkannt wird, was bei der ersten Methode nicht der Fall ist.
 
Hi,

prinzipiell wird ein MC, der dynamisch auf die Bühne geholt wird, unter seinem Instanznamen als Objekt auf der Zeitleiste registriert. Dies geschieht aber nicht implizit per Script, sondern nur durch die Benennung per attachMovie - und auch nur, wenn es noch kein anderes Objekt dieses Namens gibt. Wenn Du folgendes schreibst:
Code:
var foo = "bar";

this.createEmptyMovieClip("foo", 12);

trace(this.foo);
bekommst Du nur "bar" als Ausgabe: die erstellte Variable gleichen Namens wird nicht überschrieben.

Daher würde ich beim Neuerstellen von MovieClips immer die Rückgabewerte der Methoden createEmptyMovieClip bzw. attachMovie verwenden, um implizit Objektzuordnungen zu erstellen:
Code:
var foo = "bar";

var blubb = this.createEmptyMovieClip("foo", 12);

trace(foo); // Ausgabe: "bar"

trace(blubb): // Ausgabe: _level0.foo

Gruß
.
 
Hm, vielleicht missverstehe ich deine Antwort, vielleicht hast du auch meine Frage etwas missverstanden.

Also, ich ertslle einen MovieClip via ActionScript:
PHP:
_root.createEmptyMovieClip("test_mc", 1);

Nun hat man 2 Möglichkeiten die Hirachie in AS zu formulieren, entweder so:
PHP:
_root["test_mc"]

oder so:
PHP:
_root.test_mc


Nur, wo liegt der unterschied zwischen diesen beiden Schreibweisen?
 
Hi,

ich habe Deine Frage schon verstanden, aber wahrscheinlich war meine Antwort missverständlich:

1. Zwischen beiden Schreibweisen gibt es keinen Unterschied, solange die Objektnamen nicht dynamisch zusammengesetzt werden.

2. Wenn MovieClips wie in Deinem Beispiel erstellt werden, würde ich die erste Schreibweise (Array-Zugriffsoperator) bevorzugen, um zu verdeutlichen, dass es sich um keine Variablen/Objekte handelt, die implizit im Script erstellt wurden - aber das ist eine reine Konvention.

3. Um Uneindeutigkeiten (siehe mein erstes Posting) zu vermeiden, würde ich dynamisch erstellte MovieClips immer über ihre Rückgabefunktion in einem selbst erstellen Objekt ablegen:
Code:
// Variante a: es wurde schon zur Entwurfszeit ein MC mit dem
// Instanznamen "foo" auf die Bühne gezogen:

trace(foo._x);

// Variante b: Der MC wird ohne implizite Objektzuweisung dynamisch erstellt:

this.createEmptyMovieClip("foo", 1);

trace(this["foo"]._x);

// Variante c: Der MC wird mit impliziter Objektzuweisung dynamisch erstellt:

var foo = this.createEmptyMovieClip("foo", 1);

trace(foo._x);

Seinen eigentlichen Vorteil spielt die Array-Zugriffs-Methode beim Zusammensetzen von Objektbezeichnern aus:
Code:
for (var i=0; i<10; i++) {
    trace(this["foo" + i]._x);
}

Gruß
.
 
Ok, danke für die ausführliche Antwort :)

Aber nocheinmal eine kleine Frage zu Methode C.
Wenn man auf diese Art und Weise einen MC erstellt, kann es nicht passieren, dass sich vorher definierte Daten für diesesn MC überschreiben?

PHP:
var foo:MovieClip = this.createEmptyMovieClip("foo", 1);
foo._x = 150
foo._y = 150
foo._alpha = 50
 
Na ja - wenn Du bei diesem Beispiel vorher eine Variable "foo" erstellt hast, wird diese überschrieben. Das ist aber genau der Vorteil dieser Methode, da es in diesem Fall keine Unstimmigkeit gibt, ob Du nun die Variable, oder den MC ansprichst:
Code:
var foo = "bar";

this.createEmptyMovieClip("foo", 1);

trace(foo); // Unklar: Meine ich den String oder den MC? (der String wird referenziert)
Code:
var foo = "bar";

foo = this.createEmptyMovieClip("foo", 1);

trace(foo); // Zweifelsfrei wird der MC angesprochen, da der String überschrieben wird
Zu Überschneidungen kommt es im zweiten Fall nicht. Auch möglich:
Code:
foo = this.createEmptyMovieClip("bar", 1);

trace(foo);

trace(bar);

trace(this["bar"]);

trace(foo == bar); // Ausgabe: "true"

Gruß
.



Gruß
.
 
Zurück