访问动态添加的MC中的实例

时间:2011-04-11 08:17:18

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

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

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。我计划在循环中使用它。请考虑到这一点。

2 个答案:

答案 0 :(得分:0)

我认为错误是由行apie.cherry.gotoAndStop(2)引起的。您可能需要将其更改为apie.getChildByName("cherry").gotoAndStop(2),但由于您的饼图是一个动画片段,因此儿童通常不会立即实例化。

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

答案 1 :(得分: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的属性,并在启动课程时为其分配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();