AS3:无法创建 Movieclip class 实例?

AS3: Can't create Movieclip class instance?

我只是在学习如何使用一些非常基本的代码在 AS3 中使用 classes,我正在绞尽脑汁想弄清楚如何做最简单的事情。

我已经将文档 class 设为 'Test' class(本质上是我的主文档 class),我想用它做的就是添加'WhiteBall' class(动画片段)的一个实例到舞台上。

'WhiteBall' class 应该允许我用键盘控制动画片段。我不知道这部分是否有效,因为我不断收到此错误:

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

这是 'Test' class 的代码:

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' class 的代码:

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--;
        }
    }
    }
}

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

var whiteBall:WhiteBall = new WhiteBall ();

我不知道这里有什么问题。如果您能给我任何帮助,我们将不胜感激。

Organis 所说的是这样的:当您创建一个 DisplayObject,例如您的 WhiteBall 扩展的 class MovieClip 时,该对象的阶段 属性 为空。这意味着当您尝试在其构造函数

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

由于阶段为空而引发错误。所以要解决这个最安全和最常见的方法是等到球被添加到舞台上,然后监听任何舞台键盘事件。像这样:

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 class 实例将球添加到舞台时,您的 WhiteBall 实例的舞台 属性 将具有一个值,因此可以安全地监听任何键盘事件。