【问题标题】:AS 3.0 Dynamic Instance NamesAS 3.0 动态实例名称
【发布时间】:2011-08-07 20:13:19
【问题描述】:

您好,我创建了一个自定义类,我想在其中创建一个影片剪辑的 x 个实例。但以下不起作用:

package {

import flash.display.MovieClip;
public class CustomClass extends MovieClip {

    public function CustomClass(amount:uint) {  
        var Collector:Array = new Array(); 

        //Add and position Tiles to stage.
        for (var i:uint = 1; i <= amount; i++){ 
            var newMovieClip:MovieClip = new MovieClip;
            newMovieClip.y = amount * 10;
            Collector.push(newMovieClip); 
        }
        addChild(Collector);
    }
}

}

我想用

将它们放在时间轴上 var customClass_mc:CustomClass = new CustomClass(10); addChild(customClass_mc); //尝试跟踪其中一个实例的 x 位置。 跟踪(customClass_mc.Collector[5].x);

我不断收到错误消息:场景 1,图层“图层 1”,第 1 帧,第 5 行 1119:通过静态类型 CustomClass 的引用访问可能未定义的属性收集器。

【问题讨论】:

    标签: actionscript-3 dynamic instances


    【解决方案1】:

    我自己找到了另一个我认为更好的答案!

    您根本不需要容器。

    当您使用以下内容时

    package {
    
        import flash.display.MovieClip;
        public class CustomClass extends MovieClip {
    
            public function CustomClass(amount:uint) {  
    
                //Add and position Tiles to stage.
                for (var i:uint = 1; i <= amount; i++){ 
                    var newMovieClip:MovieClip = new MovieClip;
                    newMovieClip.y = amount * 10;
                    newMovieClip.name = "clip"+i;
                    addChild(newMovieClip); 
                }
            }
        }
    }
    

    不,我可以通过以下方式访问影片剪辑:

    var customClass_mc:CustomClass = new CustomClass(10);
    addChild(customClass_mc);
    
    //try to trace the x position of the fifth instance. 
    trace(customClass_mc.getChildByName("child5").y);
    

    【讨论】:

      【解决方案2】:

      变量 'Collector' 仅在构造函数中可用。收集器必须公开才能从时间线之外访问。最好的办法是创建一个公共的 getter 方法来访问它。所以像:

      import flash.display.MovieClip;
      public class CustomClass extends MovieClip {
      
          private var Collector:Array = new Array(); 
      
          public function get Collector():Array
          {
              return Collector;
          }
      
          public function CustomClass(amount:uint) {  
      
              //Add and position Tiles to stage.
              for (var i:uint = 1; i <= amount; i++){ 
                  var newMovieClip:MovieClip = new MovieClip;
                  newMovieClip.y = amount * 10;
                  Collector.push(newMovieClip); 
              }
              addChild(Collector);
          }
      }
      

      【讨论】:

      • shanethehat 的 anwser 工作,你的我得到 2 个错误:1067:将 Array 类型的值隐式强制转换为不相关的 flash.display:DisplayObject 类型。 & 1114: public 属性只能在包内使用。还是谢谢
      【解决方案3】:

      首先,您需要将 Collector 声明为 public:

      public var Collector:Array = new Array(); 
      

      您的收集器是一个数组,而不是显示对象,因此无法将其添加到显示树中。相反,您会将每个 newMovieClip 推送到 Custom 类的显示上,并将它们放置在您的 for 循环中。那么你就完全不需要收集器了,因为你可以使用getChildAt()来定位movieclip:

      trace(customClass_mc.getChildAt(5).x);
      

      【讨论】:

      • 太棒了,getChildAt 方法有效!除此之外,将收集器公开给我: 1114:公共属性只能在包内使用。好在我不再需要它了!
      • 对不起,我错过了一些解释。要像在示例的最后一行中所做的那样从类构造函数外部访问收集器,您必须将其设为类属性。为此,您将其移出构造函数并添加 public 关键字。
      • 嘿 shanethehat,我找到了另一种方法(我也添加了答案)。你同意它更容易使用吗?
      • 是的,当然,如果您决定其他任何事情都不需要该数组,那么您的方式会更干净、更容易。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多