-1

我正在学习如何制作 MovieClip 类。我要做的就是让 MovieClip 能够使用左右箭头键移动,但它不起作用。

这是我的文档类主代码:

package  {   

    import flash.display.MovieClip;

    public class Main extends MovieClip{

         var blueBall:Ball = new Ball; //This is line 7

          public function Main()
        {
            addChild(blueBall)
        }

    }

 }

我的 Ball 类代码是:

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

    public class Ball extends MovieClip
    {
        public function Ball()
        {
            stage.addEventListener(KeyboardEvent.KEY_DOWN, keyPressed); //This is Line 11
        }

         function keyPressed(evt:KeyboardEvent):void
        {
             switch (evt.keyCode)
        {
            case Keyboard.RIGHT :
                this.x +=  10;
                break;
            case Keyboard.LEFT :
                this.x -=  10;
                break;
        }
    }

}

}

当我在调试中运行它时,我得到这个错误:

TypeError:错误 #1009:无法访问空对象引用的属性或方法。在 Ball()[C:\Users\Joel\Desktop\Flash\Projects\DropClassTest\Ball.as:11] 在 Main()[C:\Users\Joel\Desktop\Flash\Projects\DropClassTest\Main.as: 7]

现在,如果我只是将主文档类留空,然后将 blueBall Movieclip 从库中拖放出来,它就会按照我想要的方式工作,但是一旦我尝试使用文档类来完成它,它就无法正常工作.

不用说,我很迷茫,甚至认为调试器告诉我哪些行是错误的。

有任何想法吗?

4

1 回答 1

0

问题是您试图在将球添加到舞台之前从 Ball 类内部访问舞台。在将对象添加到阶段之前,它无法直接访问阶段。

选项 1:您可以将舞台从主类传递给 Ball 构造函数。

将此添加到您的 Ball 类的导入中:

import flash.display.Stage;

向 Ball 类的构造函数添加阶段参数:

public function Ball(stage:Stage):void {
    stage.addEventListener(KeyboardEvent.KEY_DOWN, keyPressed);
}

并将舞台传递给您的 Ball 实例(在 Main 中)

var blueBall:Ball = new Ball(stage);

选项 2:您可以在 Ball 类中侦听 ADDED_TO_STAGE 事件,并在 ADDED_TO_STAGE 发生后添加 KEY_DOWN 侦听器:

在 Ball 类中导入 Event 类:

import flash.events.Event;

用这个替换你的构造函数:

public function Ball():void {
    addEventListener(Event.ADDED_TO_STAGE, addedToStage);
}

然后在 ADDED_TO_STAGE 侦听器中添加您的 KEY_DOWN 侦听器:

function addedToStage(evt:Event):void {
    stage.addEventListener(KeyboardEvent.KEY_DOWN, keyPressed);
}
于 2013-11-09T02:41:42.213 回答