2009-09-25 5 views
1

Итак, я успешно добавил фрагмент ролика из библиотеки с помощью addChild(), но теперь хочу получить доступ к некоторым мувиклипам, которые были в этом динамически добавленном мувиклипе.Actionscript 3, addChild из библиотеки, затем получить доступ к своим детям по именам экземпляров

Я использовал стандартную точечную нотацию, а также getChildByName, передав ей имена экземпляров.

Что мне здесь не хватает?

---- EDITED ----

Я попробовал предложение циклический и доступ к ним по индексу, но кажется, не столь интуитивным способом сделать это ... ниже являются два примеры того, что я ранее пробовал, и все они возвращаются как «1119: доступ к возможно неопределенному свойству nameText через ссылку со статическим типом flash.display: DisplayObject». или «1061: вызов возможно неопределенного метода getChildByName через ссылку со статическим типом flash.display: DisplayObject».

пример точечной нотации:

// 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(); 

и пример использования .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(); 

ответ

1

В AS3, точка обозначения не работает так, как раньше в AS2. Вы можете использовать его, если и только если вы явно объявили имя ребенка как переменную родительского объекта. getChildByName также не является надежным, так как нет правила, в котором говорится, что у двух братьев и сестер не может быть такого же имени. Используйте getChildAt, чтобы пронзить всех детей. Попробуйте что-то вроде:

//assuming newMC as the added movie clip 
var num:Number = newMC.numChildren; 
for(var i:Number = 0; i < num; i++) 
{ 
    var child:DisplayObject = newMC.getChildAt(i); 
    trace(child.name); 
} 
+0

UHH что? Конечно, точечные нотации работают в AS3, вам просто нужно использовать имена экземпляров. Если вы знаете, к чему вы пытаетесь получить доступ, вам не следует перебирать детей. –

+0

Точечная запись в AS2 работает совершенно по-другому. Родитель может получить доступ к своему дочернему элементу по имени: parentMC.childMC._x = 30; childMC не обязательно должна быть переменной экземпляра класса parentMC, чтобы эта строка работала в AS2. childMC - это просто имя родителя. – Amarghosh

+0

Это не должно быть так в AS3. MovieClips по-прежнему являются динамическими классами в AS3, и вы можете получить к ним доступ на основе имен сцен. Ваша точка с именами повторяющихся состояний действительна, но в худшем случае вы получите предупреждение о компиляторе. myMC.someStageInstance все еще полностью действует в AS3. Я использую это каждый день. –

1

Необходимо иметь ссылку на добавленный динамический файл. Затем вы можете получить доступ к определенному дочернему мувиклипу, если у него есть имя экземпляра.

Итак, если у вас есть MovieClip с именем экземпляра 'a', и внутри у вас есть MovieClip с именем экземпляра 'b', вы можете просто ссылаться на него как a.b. Но, как отметил Amarghosh, флеш позволит вам иметь несколько мувиклипов с одинаковыми именами экземпляров, и если в этом случае будет доступен только один из мувиклипов.

0

Хорошо, я прочитал ваш код несколько раз и хотел бы указать на следующее.

Ниже приведен фрагмент кода:

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)); 

Она смотрит на меня, как Тхо ваши просто устанавливающих атрибуты competencyInstance, но по какой-то причине ваш делать это через родителей. Я бы предположил, что вы AS2-разработчик, изучающий AS3, потому что это AS2-метод. У вас уже есть ссылка на объект и нет необходимости обращаться к родительскому объекту.

Ниже приведен пример вашего кода.

var competencyInstance:competencyCircle = new competencyCircle(); 
competencyInstance.name = "competency" + i; 

competencyInstance.x = circleCenter.x - (Math.sin(angleSum * (Math.PI/180)) * (circleSize/2)); 
competencyInstance.y = circleCenter.y - (Math.sin((90 - angleSum) * (Math.PI/180)) * (circleSize/2)); 
competencyContainer.addChild(competencyInstance); 

Х и y всегда относятся к родительскому.

Лучший способ понять эти вещи состоит в том, чтобы перебирать родительский/контейнер, отслеживая имя каждого объекта, вы можете обнаружить, что вы забыли, что вы вложили вещи еще глубже и т. Д.

Список отображения As3 - отличная вещь, потому что вы можете получить доступ к объектам через их прямую ссылку, вместо синтаксиса длинных точек, ссылающихся на родителя. Единственный раз, когда вам нужно получить доступ к вещам через родителя, как к вашему делу, - это когда у вас нет ссылки. Вы создали локальную переменную competencyInstance, которая доступна только для доступа, в то время как buildCircle() является exectuing, как только buildCircle() закончен, жизнь всех локальных переменных, созданных в нем, заканчивается. Чтобы все сказанное, когда у вас нет ссылки, вам придется использовать цикл for для итерации через родительский метод, обращаясь к каждому дочернему элементу. Больше всего я могу сказать о списке отображения и его чудесах, но я хочу придерживаться к тому, что относится.

0

Мне удалось легко получить доступ к дочерним объектам в динамически загружаемой библиотеке movieClip. Я на самом деле сделал ручной цикл, который создает кнопки, основанные на количестве элементов в документе XML. Вызывается функция твина и после завершения анимации создается новый экземпляр кнопки и позиционируется в соответствии с моим вычислением значения x. То, что я сделал здесь, - это флеш-навигатор для веб-сайта. Я хотел переключить мувиклип «select», если пользователь нажимает кнопку и отключает ее, если пользователь выбирает другую кнопку.

Вы были на правильном пути, и я по существу использовал то, что вы делали с методом getChildByName. С циклом for я смог получить доступ ко всем детям динамически загруженной кнопки, указав имена, которые я им дал, когда они были созданы (в данном случае «btn_» плюс значение переменной «i»), то есть «btn_0», btn_1, btn_2 "и т. д. Затем эти кнопки были добавлены в мувиклип btnGroup. По сути, все, что мне нужно было сделать, это ссылки на дочерние элементы btnGroup с использованием getChildByName («имя клипа»), за которым следует имя объекта, который вы хотите получить от ребенка в скобках [""], в форме строка. Просмотрите мой пример «Функция мыши» ниже, чтобы перейти к ответу

function btnMaker():void 
{ 
    btnGroup.x = 170; 
    if(btnCount < clubXML.btn_group.*.length()) 
    { 
    btnCount++; 
    b = new btn(); 
    spacer = b.width-27; 
    b.x = (btnCount-1)*spacer; 
    b.y = 25; 
    b.name = "btn_"+(btnCount-1);//Name the dynamicly loaded movie clip 
    b.buttonMode = true; 
    b.mouseChildren = false; 
    b.btn_txt.text = clubXML.btn_group.btn[btnCount-1]; 
    b.addEventListener(MouseEvent.CLICK, mouseFunctions); 
    b.addEventListener(MouseEvent.MOUSE_OVER, mouseFunctions); 
    b.addEventListener(MouseEvent.MOUSE_OUT, mouseFunctions); 
    b.grid_mc.stop(); 
    b.grid_mc.visible = false; 
    b.select.visible = false; 
    btnGroup.addChild(b); 
    btnGroup.getChildByName("btn_0")["select"].visible = true; 
    tweenIn(); 
    } 
    if(btnCount == clubXML.btn_group.*.length()) 
    { 
    //btnTimer.stop(); 
    xTween.removeEventListener(TweenEvent.MOTION_FINISH, animFinish); 
    } 
} 

function mouseFunctions(e:MouseEvent):void 
{ 
    var btnName = e.target.name.substring(4, 5); 

    switch(e.type) 
    { 
    case("mouseOver"): 
     bounceIn = new Tween(e.target, "scaleY", Bounce.easeOut, 1.5, 1, 10, false); 
     e.target.gotoAndPlay(2); 
     e.target.getChildByName("grid_mc").visible = true; 
     //trace(e.target.getChildByName("grid_mc").totalFrames()); 
     e.target.getChildByName("grid_mc").play(); 
     break; 

    case("mouseOut"): 
     e.target.gotoAndPlay(12); 
     e.target.getChildByName("grid_mc").stop(); 
     e.target.getChildByName("grid_mc").visible = false; 
     break; 

    case("click"): 
     trace("Button Name: "+btnName); 

     currentSelection = e.target.name; 

     for(var i:int = 0; i < btnGroup.numChildren-1; i++) 
     { 
     btnGroup.getChildByName("btn_"+i)["select"].visible = false;  
     } 

     notIt != currentSelection; 

     if(currentSelection != notIt) 
     { 
     e.target.getChildByName("select").visible = true; 
     } 
     break; 
    } 
} 

Надеюсь, это вам поможет.

Мир

3

Что об использовании этого при создании клипов:

... 
competencyInstance.name = "competency" + i; 
competencyContainer.addChild (competencyInstance);   
// this is the additional line, cecessary for accesing later by name 
competencyContainer["clipFichaEjemplo2"] = competencyInstance; 
... 

И это получить доступ к ним позже:

... 
var M:MovieClip = clipMapa["competency" + i]; 
... 

он работал для меня в подобной флэш-проект, в котором я проблемы с использованием addChild динамически.

ihih: Я надеюсь, что это помогает :)

1

Вы можете попробовать, как этот код:

//prizma, küp, dortgen, koni, kure, silindir are mc's name 
var movieList:Array = [prizma, küp, dortgen, koni, kure, silindir]; 
var k:Number=Math.round(Math.random()*5); 
var nes:MovieClip=new movieList [k](); 
addChild(nes); 
Смежные вопросы