0

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

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

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

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

4

2 回答 2

0

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

樱桃派.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

主要作为:

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();
于 2011-04-11T13:27:03.417 回答
0

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

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

于 2011-04-11T09:20:42.630 回答