【问题标题】:Accessing an instance in a dynamically added MC访问动态添加的 MC 中的实例
【发布时间】:2011-04-12 19:40:52
【问题描述】:

我使用以下代码动态添加了一个影片剪辑:

var apie=new cPie()
apie.x=100
apie.y=100
stage.addChild(apie)

现在我的舞台上有一个馅饼。嗯。假设这就像通过拖放放置在舞台上的电影剪辑一样,我添加了它以更改饼图中的一个实例。

var apie=new cPie()
apie.x=100
apie.y=100
apie.cherry.gotoAndStop(2)
stage.addChild(apie)

cherry 是 cPie 影片剪辑中的一个实例,它是另一个由 3 帧组成的影片剪辑。我希望它进入第二帧。通常,这样做是可行的,但在尝试使用通过 ActionScript 添加的影片剪辑时,我会遇到以下运行时错误:

TypeError: Error #1009: Cannot access a property or method of a null object reference.
    at pies_fla::MainTimeline/frame1()

与往常一样,返回的错误根本无法帮助我解决这个问题。它和“隐式强制”一样晦涩难懂,这对我不是英语专业的人来说毫无意义。我所知道的是我做错了什么,结果我得到了这个错误。非常感谢正确的方法。

附:我打算循环使用它。请考虑到这一点。

【问题讨论】:

    标签: actionscript-3 flash-cs4 instance movieclip addchild


    【解决方案1】:

    我想错误是由apie.cherry.gotoAndStop(2) 行引起的。您可能必须将其更改为apie.getChildByName("cherry").gotoAndStop(2),但由于您的饼图是一个影片剪辑,因此孩子通常不会立即实例化。

    解决此问题的一种方法是在尝试访问 MovieClip 的子项之前等待帧重绘。

    【讨论】:

      【解决方案2】:

      您收到该错误的原因是因为cherry 不是cPie 对象的属性或方法,它是cPie 显示对象容器的子显示对象的实例名称。要访问cherry 显示对象,您必须使用cPie 对象继承的DisplayObjectContainer 方法,即getChildByName() 方法。幸运的是,这已经在 frankhermes 的另一个答案中进行了解释,因此我将在以下示例中解释另一种(并且可以说是更好的)访问子显示对象的方法:

      CherryPie.as:

      package display
      {
          import flash.display.MovieClip;
      
          public class CherryPie extends MovieClip
          {
              private var _cherry:MovieClip;
      
              public function get cherry():MovieClip
              {
                  return _cherry;
      
              }// end function
      
              public function CherryPie()
              {
                  _cherry = cherryMC;
      
              }// end function
      
          }// end class
      
      }// end package
      

      Main.as:

      package 
      {
          import flash.display.Sprite;
          import flash.events.Event;
      
          public class Main extends Sprite 
          {
              public function Main():void 
              {
                  init();
      
              }// end function
      
              private function init():void 
              {
                  var cherryPie:CherryPie = new CherryPie();
                  cherryPie.x = 100;
                  cherryPie.y = 100;
                  cherryPie.cherry.gotoAndStop(2);
                  addChild(cherryPie);
      
              }// end function
      
          }// end class
      
      }// end package
      

      通过为您的cherryPie_mc 影片剪辑创建一个基类,您可以创建一个名为cherry 的属性,并在启动该类时为其分配cherry 子显示对象。这样您就可以直接访问cherry 子显示对象,如:

      cherryPie.cherry.gotoAndStop(2);
      

      相对于:

      cherryPie.getChildByName("cherryMC").gotoAndStop(2);
      

      您可以将CherryPie 类设置为cherryPie_mc 影片剪辑的基类,如下所示:

      注意:符号属性中的“名称”应为“cherryPie_mc”

      对于那些想知道为什么我没有将cherry 设置为公共属性的人来说

      public var cherry:MovieClip;
      

      而是使用 getter 方法来访问私有属性

      private var _cherry:MovieClip;
      
      public function get cherry():MovieClip
      {
          return _cherry;
      
      }// end function
      

      是通过省略setter方法使cherry对象成为只读的。我将其设为只读的原因是为了避免以下情况:

      cherryPie.cherry = new FakeCherry();
      

      【讨论】:

      • 你有点飞过我的头。我无法真正理解所有这些,尤其是因为我不想使用包,所以我不知道如何将其转换为正常的帧内 AS。你能提供一个没有包的解决方案吗?
      • 我个人建议不要使用时间线,但即使你这样做,也不意味着你也不能使用自己的用户定义类。只需在源根目录中创建一个名为“display”的文件夹(在您的情况下可能是包含“fla”和“swf”文件的文件夹),然后在“display”文件夹中创建一个名为 CherryPie 的“as”文件和将CherryPie 类复制并粘贴到该文件中。然后更改“cherryPie_mc”电影剪辑的符号属性,使其与答案中的屏幕截图相匹配。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-06-22
      • 2016-09-10
      • 2015-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多