AS3:无法创建Movieclip类实例吗?

时间:2017-10-19 20:16:02

标签: class actionscript-3 flash null addchild

我正在学习如何使用一些非常基本的代码在AS3中使用类,并且我试图弄清楚如何做最简单的事情。

我已经将文档课程设为'测试' class(基本上是我的主要课程),我尝试用它做的就是添加一个“白球”的实例。阶段(电影剪辑)到舞台。

' WhiteBall' class应该允许我用键盘控制movieclip。我不知道这部分是否有效,因为我一直收到这个错误:

TypeError:错误#1009:无法访问空对象引用的属性或方法。     在WhiteBall $ iinit()[/ Users / Owner / Desktop / Animation / Coding / WhiteBall.as:13]     在Test $ iinit()[/ Users / Owner / Desktop / Animation / Coding / Test.as:11]

以下是'测试'的代码。类:

package {
    import flash.display.MovieClip;
    import flash.events.Event;
    import flash.events.KeyboardEvent;
    import flash.ui.Keyboard;



    public class Test extends MovieClip
    {
        var whiteBall:WhiteBall = new WhiteBall ();

        public function Test() {

            addEventListener(Event.ENTER_FRAME, whiteBallSpawn);

        }

        public function whiteBallSpawn(evt:Event) {


            stage.addChild(whiteBall);
            whiteBall.x = 200;
            whiteBall.y = 250;




        }





    }
}

以下是' WhiteBall'的代码。类:

package {
    import flash.display.MovieClip;
    import flash.events.Event;
    import flash.events.KeyboardEvent;
    import flash.ui.Keyboard;

    public class WhiteBall extends MovieClip
    {


        public function WhiteBall() {

            stage.addEventListener(KeyboardEvent.KEY_DOWN, keysdown);
        }

        public function keysdown(mykey:KeyboardEvent) {

        if(mykey.keyCode==Keyboard.UP) {
            this.y--;
        }

        if(mykey.keyCode==Keyboard.DOWN) {
            this.y++;
        }

        if(mykey.keyCode==Keyboard.RIGHT) {
            this.x++;
        }

        if(mykey.keyCode==Keyboard.LEFT) {
            this.x--;
        }
    }
    }
}

'测试'中的第11行错误class指的是这一行:

var whiteBall:WhiteBall = new WhiteBall ();

我不知道这里有什么问题。你能给我的任何帮助都会非常感激。

1 个答案:

答案 0 :(得分:0)

Organis所说的是:当您创建一个DisplayObject时,例如一个MovieBip,它是您的WhiteBall扩展的类,那么该对象的stage属性为null。这意味着当您尝试在其构造函数

上访问whiteball的stage属性时
public function WhiteBall() 
{
   stage.addEventListener(KeyboardEvent.KEY_DOWN, keysdown);
} 

因为stage为null而抛出错误。因此,要解决这个问题,最安全和最常见的方法是等待球被添加到舞台然后监听任何舞台键盘事件。像这样:

public function WhiteBall() 
{
    if(stage != null)
    {
        stage.addEventListener(KeyboardEvent.KEY_DOWN, keysdown);
    }
    else
    {
       this.addEventListener(Event.ADDED_TO_STAGE, addedToStage);
    }
}
private function addedToStage(e:Event):void
{
   this.removeEventListener(Event.ADDED_TO_STAGE, addedToStage);
   stage.addEventListener(KeyboardEvent.KEY_DOWN, keysdown);
}

因此,当您的Test类实例将球添加到舞台上时,WhiteBall实例的stage属性将具有值,因此可以安全地侦听任何键盘事件。