2011-04-11 45 views
0

我动态使用下面的代码添加了一个影片剪辑:在动态添加访问实例MC

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

与往常一样,返回的错误并不能帮助我解决这个问题在所有。这与“隐性强制”一样晦涩难懂,这对我而言并不是英语专业没有意义。我所知道的是我做错了一些事情,结果我得到这个错误。正确的方式去这个将非常赞赏。

P.S.我打算在一个循环中使用它。请考虑这一点。

回答

0

我想这个错误是由行apie.cherry.gotoAndStop(2)造成的。您可能必须将其更改为apie.getChildByName("cherry").gotoAndStop(2),但由于您的馅饼是动画片段,所以儿童通常不会立即实例化。

解决方法是在尝试访问影片剪辑的子项之前等待画面重新绘制。

0

,你有这个错误的原因是因为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财产,在启动中的C cherry子显示对象分配给它姑娘。这样你就可以直接访问类的cherry子显示对象:

cherryPie.cherry.gotoAndStop(2); 

,而不是:

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

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

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

也为那些想知道为什么我没有设置cherry作为公共财产

public var cherry:MovieClip; 

,而是使用一个getter方法来访问私有财产

private var _cherry:MovieClip; 

public function get cherry():MovieClip 
{ 
    return _cherry; 

}// end function 

是让樱桃对象读 - 只有通过省略setter方法才能完成。我将它设为只读的原因是为了避免类似以下内容:

cherryPie.cherry = new FakeCherry(); 
+0

你有点飞过我的头。我无法真正理解这一切,特别是因为我不想使用包,所以我不知道如何将其转换为正常的帧内AS。你能提供一个没有包的解决方案吗? – Anonymous 2011-04-11 19:59:51

+0

我个人建议不要使用时间轴,但即使您这样做,也并不意味着您也不能使用自己的用户定义类。只需在你的源代码根目录下创建一个文件夹(你的情况可能在包含你的“fla”和“swf”文件的文件夹中),然后在你的“display”文件夹中创建一个名为“CherryPie”的“as”文件,将CherryPie类复制并粘贴到该文件中。然后更改“cherryPie_mc”动画片段的符号属性,使其与匹配答案中的屏幕截图相匹配。 – Taurayi 2011-04-12 11:39:06