【问题标题】:Actionscript 3, addChild from library then access it's children by instance namesActionscript 3,来自库的 addChild 然后通过实例名称访问它的孩子
【发布时间】:2016-03-07 06:21:44
【问题描述】:

所以我成功地使用 addChild() 从库中添加了一个影片剪辑,但现在我想访问动态添加的影片剪辑中的一些影片剪辑。

我使用了标准的点表示法,还使用 ​​getChildByName 将实例名称传递给它。

我在这里错过了什么?

----已编辑----

我尝试了循环并可以通过索引访问它们的建议,但似乎不是一种直观的方法......下面是我之前尝试过的两个示例,它们都返回为“ 1119:通过静态类型 flash.display:DisplayObject 的引用访问可能未定义的属性 nameText。”或“1061:通过静态类型 flash.display:DisplayObject 的引用调用可能未定义的方法 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).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();

【问题讨论】:

    标签: flash actionscript-3 actionscript movieclip addchild


    【解决方案1】:

    创建剪辑时如何使用它:

    ...
    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];
    ...
    

    它在一个类似的 Flash 项目中对我有用,我在动态使用 addChild 时遇到了问题。

    ihih:希望对你有帮助:)

    【讨论】:

      【解决方案2】:

      您需要引用动态添加的影片剪辑。然后,您可以访问具有实例名称的特定子影片剪辑。

      因此,如果您有实例名称为“a”的 MovieClip,并且内部有一个实例名称为“b”的 MovieClip,那么您可以简单地将其引用为 a.b。但正如 Amarghosh 指出的那样,flash 将允许您拥有多个具有相同实例名称的影片剪辑,如果是这种情况,则只会访问其中一个影片剪辑。

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 呃什么?当然,点表示法在 AS3 中有效,您只需要使用实例名称即可。如果您知道要访问的内容,那么您不应该循环访问子项。
        • AS2 中的点符号以完全不同的方式工作。父级可以通过其名称访问其子级,例如: parentMC.childMC._x = 30; childMC 不需要是 parentMC 类的实例变量,此行在 AS2 中工作。 childMC 只是父级的名称。
        • 在 AS3 中也不必如此。 MovieClips 在 AS3 中仍然是动态类,您可以根据舞台名称访问它们。您关于重复州名的观点是有效的,但最坏的情况是您会收到编译器警告。 myMC.someStageInstance 在 AS3 中仍然完全有效。我每天都用它。
        • myMC.someStageInstance 要在 AS3 中工作,您应该调用 myMC.someStageInstance = something;早一点。在AS2中如果你调用myMC.attachMovieClip with someStageInstance,你可以调用myMC.someStageInstance来获取。
        • 致 OP:能力容器.getChildByName("competency" + i).x 可以替换为能力实例.x,这就是您在 AS3 中的操作方式。将儿童电影视为单独的影片剪辑,而不是通过父母介绍它们。将它们存储在一个数组中,并根据需要循环它们。
        【解决方案4】:

        你可以试试这样的代码:

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

        【讨论】:

          【解决方案5】:

          我能够轻松访问动态加载的库movieClip 中的子对象。我实际上做了一个手动循环,它根据 XML 文档中的元素数量创建按钮。调用补间函数,一旦动画完成,就会根据我的 x 值计算创建和定位一个新按钮实例。我在这里制作的是一个网站的 Flash 导航。如果用户单击一个按钮,我想打开“选择”影片剪辑,如果用户选择另一个按钮,我想将其关闭。

          您在正确的轨道上,我基本上使用了您在 getChildByName 方法中所做的事情。使用 for 循环,我可以通过引用我在创建它们时给它们的名称(在本例中为“btn_”加上变量“i.”的值)来访问所有动态加载的按钮的子项,即“btn_0, btn_1、btn_2" 等。然后将按钮添加到 btnGroup 影片剪辑中。所以从本质上讲,我需要做的就是使用 getChildByName("movie clip name") 引用 btnGroup 的子元素,然后在括号[""] 中以 a细绳。在下面查看我的“鼠标功能”示例以获得答案

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

          希望对你有帮助。

          和平

          【讨论】:

            【解决方案6】:

            好的,我已经阅读了您的代码几遍,想指出以下几点。

            以下是您的代码的 sn-p:

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

            在我看来,您只是设置了能力实例的属性,但由于某种原因,您是通过父级进行的。我假设您是学习 AS3 的 AS2 开发人员,因为这是一种 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);
            

            x 和 y 总是相对于父级。

            解决这些问题的最佳方法是遍历父/容器来跟踪每个对象的名称,您可能会发现您忘记了将事物嵌套得更深,等等。

            as3 显示列表是一件很棒的事情,因为您可以通过对象的直接引用来访问对象,而不是通过父级引用的长点语法。唯一需要通过父母访问事物的时候是当您没有参考时。您创建了一个局部变量能力实例,它只能在 buildCircle() 执行时访问,一旦 buildCircle() 完成运行,在其中创建的所有局部变量的生命周期就会结束。话虽如此,当您没有参考时,您将不得不使用 for 循环遍历访问每个子项的父方法。关于显示列表及其奇迹,我还有很多话要说,但我想坚持与什么有关。

            【讨论】:

              猜你喜欢
              • 2011-06-07
              • 2011-02-23
              • 1970-01-01
              • 2016-12-31
              • 2014-04-07
              • 2011-04-07
              • 1970-01-01
              • 1970-01-01
              • 2016-03-18
              相关资源
              最近更新 更多