文档类和MovieClip类之间的通信:错误1009

时间:2013-11-09 01:21:01

标签: actionscript-3

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

这是我的Document Class Main的代码:

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]

现在,如果我将我的Main文档类留空,只需将blueBall Movieclip拖放到库中,它就会按照我想要的方式工作,但是一旦我尝试使用文档类来执行它,它不起作用。

毋庸置疑,我很失落,甚至认为调试器告诉我哪些行是错误的。

有什么想法吗?

1 个答案:

答案 0 :(得分: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);
}