Actionscript 3, addChild aus der Bibliothek darauf zugreifen-es sind Kinder, die nach instance-Namen
So habe ich erfolgreich Hinzugefügt einen MovieClip aus der Bibliothek mithilfe von addChild(), aber ich will jetzt auf einige movieclips in der dynamisch Hinzugefügt movieclip.
Habe ich verwendet, standard dot-notation, die auch getChildByName übergeben Sie die Instanz Namen.
Was vermisse ich hier?
---- BEARBEITET ----
Habe ich versucht, den Vorschlag Durchlaufen und auf Sie zugreifen kann, die durch den index, aber scheint nicht so intuitiv einen Weg, dies zu tun... unten sind zwei Beispiele von dem, was ich vorher versucht und Sie kommen alle wieder als "1119: Zugriff möglicherweise nicht definierte Eigenschaft nameText über einen Verweis mit statischem Typ flash.display:DisplayObject." oder "1061: Aufruf für eine möglicherweise nicht definierte Methode getChildByName über einen Verweis mit statischem Typ flash.display:DisplayObject."
Beispiel der dot-notation:
// build circlular display
function buildCircle() {
trace("buildCircle()");
if (viewByState == "assignment") {
var competencyContainer:MovieClip = new MovieClip();
competencyContainer.name = "competencyContainer";
this.addChild(competencyContainer);
var angleSegment:Number = 360 / competenciesArray.length;
var angleSum:Number = 360 - angleSegment / 2;
for (var i:Number = 0; i < competenciesArray.length; i++) {
var competencyInstance:competencyCircle = new competencyCircle();
competencyInstance.name = "competency" + i;
competencyContainer.addChild(competencyInstance);
competencyContainer.getChildByName("competency" + i).x = circleCenter.x - (Math.sin(angleSum * (Math.PI / 180)) * (circleSize / 2));
competencyContainer.getChildByName("competency" + i).y = circleCenter.y - (Math.sin((90 - angleSum) * (Math.PI / 180)) * (circleSize / 2));
competencyContainer.getChildByName("competency" + i).nameText.wordWrap = true;
competencyContainer.getChildByName("competency" + i).nameText.embedFonts = true;
competencyContainer.getChildByName("competency" + i).nameText.htmlText = "COMPETENCY:<br />" + competenciesArray[i].name;
competencyContainer.getChildByName("competency" + i).nameText.setTextFormat(tfTitle, 0, competencyContainer.getChildByName("competency" + i).nameText.text.length - competenciesArray[i].name.length);
competencyContainer.getChildByName("competency" + i).nameText.setTextFormat(tfName, competencyContainer.getChildByName("competency" + i).nameText.text.length - competenciesArray[i].name.length, competencyContainer.getChildByName("competency" + i).nameText.text.length);
competencyContainer.getChildByName("competency" + i).nameText.autoSize = TextFieldAutoSize.CENTER;
competencyContainer.getChildByName("competency" + i).nameText.y = -(competencyContainer.getChildByName("competency" + i).nameText.height / 2);
competencyContainer.getChildByName("competency" + i).filters = [circleDefaultDropShadow];
competencyContainer.getChildByName("competency" + i).selectedIndicator.visible = false;
competencyContainer.getChildByName("competency" + i).hit.buttonMode = true;
competencyContainer.getChildByName("competency" + i).hit.mouseEnabled = true;
competencyContainer.getChildByName("competency" + i).hit.tabEnabled = true;
competencyContainer.getChildByName("competency" + i).hit.mouseChildren = true;
competencyContainer.getChildByName("competency" + i).hit.addEventListener(MouseEvent.MOUSE_OVER, function(e:MouseEvent) {
e.target.parent.filters = [circleHoverDropShadow];
});
competencyContainer.getChildByName("competency" + i).hit.addEventListener(MouseEvent.MOUSE_OUT, function(e:MouseEvent) {
e.target.parent.filters = [circleDefaultDropShadow];
});
competencyContainer.getChildByName("competency" + i).hit.addEventListener(MouseEvent.CLICK, function(e:MouseEvent) {
e.target.parent.filters = [circleDefaultDropShadow];
e.target.parent.selectedIndicator.visible = true;
});
angleSum -= angleSegment;
trace("end");
trace(i);
trace("\n\n\n");
}
} else if (viewByState == "competency") {
} else {
}
}
buildCircle();
Beispiel und verwenden .getChildByName():
// build circlular display
function buildCircle() {
trace("buildCircle()");
if (viewByState == "assignment") {
var competencyContainer:MovieClip = new MovieClip();
competencyContainer.name = "competencyContainer";
this.addChild(competencyContainer);
var angleSegment:Number = 360 / competenciesArray.length;
var angleSum:Number = 360 - angleSegment / 2;
for (var i:Number = 0; i < competenciesArray.length; i++) {
var competencyInstance:competencyCircle = new competencyCircle();
competencyInstance.name = "competency" + i;
competencyContainer.addChild(competencyInstance);
competencyContainer.getChildByName("competency" + i).x = circleCenter.x - (Math.sin(angleSum * (Math.PI / 180)) * (circleSize / 2));
competencyContainer.getChildByName("competency" + i).y = circleCenter.y - (Math.sin((90 - angleSum) * (Math.PI / 180)) * (circleSize / 2));
competencyContainer.getChildByName("competency" + i).getChildByName("nameText").wordWrap = true;
competencyContainer.getChildByName("competency" + i).getChildByName("nameText").embedFonts = true;
competencyContainer.getChildByName("competency" + i).getChildByName("nameText").htmlText = "COMPETENCY:<br />" + competenciesArray[i].name;
competencyContainer.getChildByName("competency" + i).getChildByName("nameText").setTextFormat(tfTitle, 0, competencyContainer.getChildByName("competency" + i).getChildByName("nameText").text.length - competenciesArray[i].name.length);
competencyContainer.getChildByName("competency" + i).getChildByName("nameText").setTextFormat(tfName, competencyContainer.getChildByName("competency" + i).getChildByName("nameText").text.length - competenciesArray[i].name.length, competencyContainer.getChildByName("competency" + i).getChildByName("nameText").text.length);
competencyContainer.getChildByName("competency" + i).getChildByName("nameText").autoSize = TextFieldAutoSize.CENTER;
competencyContainer.getChildByName("competency" + i).getChildByName("nameText").y = -(competencyContainer.getChildByName("competency" + i).getChildByName("nameText").height / 2);
competencyContainer.getChildByName("competency" + i).filters = [circleDefaultDropShadow];
competencyContainer.getChildByName("competency" + i).getChildByName("selectedIndicator").visible = false;
competencyContainer.getChildByName("competency" + i).getChildByName("hit").buttonMode = true;
competencyContainer.getChildByName("competency" + i).getChildByName("hit").mouseEnabled = true;
competencyContainer.getChildByName("competency" + i).getChildByName("hit").tabEnabled = true;
competencyContainer.getChildByName("competency" + i).getChildByName("hit").mouseChildren = true;
competencyContainer.getChildByName("competency" + i).getChildByName("hit").addEventListener(MouseEvent.MOUSE_OVER, function(e:MouseEvent) {
e.target.parent.filters = [circleHoverDropShadow];
});
competencyContainer.getChildByName("competency" + i).getChildByName("hit").addEventListener(MouseEvent.MOUSE_OUT, function(e:MouseEvent) {
e.target.parent.filters = [circleDefaultDropShadow];
});
competencyContainer.getChildByName("competency" + i).getChildByName("hit").addEventListener(MouseEvent.CLICK, function(e:MouseEvent) {
e.target.parent.filters = [circleDefaultDropShadow];
e.target.parent.getChildByName("selectedIndicator").visible = true;
});
angleSum -= angleSegment;
trace("end");
trace(i);
trace("\n\n\n");
}
} else if (viewByState == "competency") {
} else {
}
}
buildCircle();
InformationsquelleAutor Justin Lee | 2009-09-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
Was über die Verwendung dieser bei der Erstellung der clips:
Um später darauf zugreifen:
es funktionierte für mich in eine ähnliche flash-Projekt, wo ich das problem mithilfe von addChild dynamisch.
ihih: ich hoffe, es hilft 🙂
InformationsquelleAutor Tomas
Benötigen Sie eine Referenz auf den movieclip, das war dynamisch Hinzugefügt. Dann können Sie den Zugriff auf ein bestimmtes Kind movieclip, wenn es eine Instanz Namen.
Also, wenn Sie die MovieClip-Instanz mit dem Namen 'a' und im inneren haben Sie eine MovieClip-Instanz mit dem Namen 'b', dann können Sie einfach darauf verweisen, wie eine.b. Aber wie Amarghosh wies darauf hin, flash, lassen Sie mehrere movieclips mit dem gleichen Instanznamen und wenn das ist der Fall nur einer der movieclips zugegriffen wird.
InformationsquelleAutor Allan
In AS3, die Punkt-notation funktioniert aber nicht so wie früher in AS2. Sie können es verwenden, wenn und nur, wenn Sie ausdrücklich erklärt wird der name des Kindes als eine variable des übergeordneten Objekts.
getChildByName
ist auch nicht zuverlässig, da es keine Regel, die sagt, zwei Geschwister können nicht denselben Namen. VerwendengetChildAt
eine Schleife durch alle Kinder. Probieren Sie etwas wie:Dot-notation in AS2 funktioniert in eine völlig andere Weise. Ein Elternteil Zugang zu Ihrem Kind, indem Sie seinen Namen wie: parentMC.childMC._x = 30; childMC brauchen nicht eine Instanz-variable von parentMC Klasse für diese Zeile zu arbeiten, in AS2. childMC ist nur der name der Eltern.
Es muss nicht sein, dass die Art und Weise, in AS3. MovieClips sind immer noch dynamische Klassen in AS3 und Sie können Sie aus der Basis von Künstlernamen. Ihren Punkt über " Status duplizieren-Namen gültig ist, aber im schlimmsten Fall erhalten Sie eine compiler-Warnung. myMC.someStageInstance ist immer noch vollständig gültig in AS3. Ich benutze es jeden Tag.
myMC.someStageInstance arbeiten in AS3, sollten Sie genannt haben, myMC.someStageInstance = etwas; irgendwann zuvor. In AS2, wenn Sie anrufen myMC.attachMovieClip mit someStageInstance, können Sie rufen Sie myMC.someStageInstance, um es zu bekommen.
Zu OP: competencyContainer.getChildByName("Kompetenz" + i).x kann ersetzt werden durch competencyInstance.x und das ist, wie Sie es tun in AS3. Behandeln Kind Filme als separate movieclips als vielmehr bezieht Sie durch die Eltern. Speichern Sie in einem array und loop-thru Ihnen, wenn Sie wollen.
InformationsquelleAutor Amarghosh
Können Sie versuchen, wie dieser code:
InformationsquelleAutor oldprogrammer
Konnte ich problemlos Zugriff auf die Kind-Objekte innerhalb einer dynamisch geladenen Bibliothek-movieClip. Ich machte wirklich eine manuelle Schleife, erstellt buttons auf der Grundlage der Anzahl der Elemente in einem XML-Dokument. Eine tween-Funktion aufgerufen wird, und sobald die animation abgeschlossen ist, wird ein neues button-Instanz erstellt und entsprechend positioniert, um mein x-Wert-Berechnung. Was machte ich hier eine Flash-navigation für eine website. Ich wollte zu wechseln, die "select" - movieclip auf, wenn der Benutzer auf eine Schaltfläche klickt, und schalten Sie es aus, wenn der Benutzer eine andere Schaltfläche.
Du auf dem richtigen Weg waren, und ich im wesentlichen das, was Sie Taten, mit getChildByName Methode. Mit einer for-Schleife, ich war in der Lage Zugriff auf alle dynamisch geladen Schaltfläche Kindern durch verweisen auf die Namen, die ich Ihnen gab, wenn Sie erstellt wurden (in diesem Fall "btn_" plus der Wert der variable "i".) d.h. "btn_0, btn_1, btn_2" etc. Die Schaltflächen wurden Hinzugefügt, um die btnGroup Film-clip. So im wesentlichen, alles ich tun musste, war die Referenz die child-Elemente von btnGroup mit getChildByName("movie clip "name"), gefolgt vom Namen des Objekts, das Sie wollen, um Zugriff aus das Kind in Klammern[""] in der form einer Zeichenfolge. Meine "Maus-Funktion" Beispiel unten zu bekommen Recht auf die Antwort
Ich hoffe das hilft dir.
Frieden
InformationsquelleAutor
Ok, ich habe gelesen, durch den code ein paar mal und möchte auf Folgendes hinweisen.
Das unten ist ein Ausschnitt des Codes:
Sieht es für mich aus als wenn Ihr nur die Einstellung Attribute des competencyInstance, aber für einige Grund es zu tun durch die Eltern. Ich würde davon ausgehen, dass du ein AS2 AS3 developer learning, denn dies ist ein AS2-Methode. Sie haben eine Referenz auf das Objekt bereits und müssen nicht den Zugriff auf die Eltern.
Folgende ist, wie Ihr code Aussehen sollte.
X und y sind immer relativ zum parent.
Dem besten Weg, zu verstehen, diese Dinge, um zu Durchlaufen und die Eltern - /container-tracing aus den Namen von jedem Objekt, finden Sie möglicherweise, dass Sie vergessen, dass Sie verschachtelte Dinge, die man tiefer, etc.
Den as3-display-Liste ist eine tolle Sache, weil Sie können den Zugriff auf Objekte durch Ihre direkte Bezugnahme, statt das lange dot-syntax der Referenzierung durch die Eltern. Die einzige Zeit, die Sie zugreifen müssen, die Dinge durch die Eltern, wie Ihr tut, ist, wenn Sie nicht über einen Verweis. Sie erstellt eine lokale variable competencyInstance, die nur den Zugriff-in der Lage, während buildCircle() ist exectuing, einmal buildCircle() ausgeführt, die das Leben aller lokalen Variablen, die innerhalb es endet. Dass alle gesagt, wenn Sie nicht über eine Referenz, verwenden Sie die for-Schleife iteriert über die übergeordneten Methode auf jedes Kind.Es ist viel mehr ich könnte sagen, über die display-list und seine Wunder, aber ich will bei dem bleiben, was gilt.
InformationsquelleAutor Brian Hodge