KeyboardEvent侦听器导致TypeError?

时间:2012-02-08 05:08:58

标签: flash actionscript-3 actionscript flash-cs5 packages

我收到这个奇怪的错误,不知道为什么,我已经将代码减少到最小并找到问题的根源但我不明白为什么会出错。

Main.as

package  {
    import flash.display.MovieClip;
    public class main extends MovieClip{
        public function main(){
            var player1 = new playerTest( 100 , 275 );
            addChild( player1 );
        }
    }
}

Player.as

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

    public class playerTest extends MovieClip{
        public function playerTest(xCoord:int, yCoord:int){
            x = xCoord;
            y = yCoord;
            stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownEvent);
            stage.addEventListener(KeyboardEvent.KEY_UP, keyUpEvent);
        }
        private function keyDownEvent(e:KeyboardEvent):void{
            //
        }
        private function keyUpEvent(e:KeyboardEvent):void{
            //
        }
    }
}

如果我注释掉任何一个KeyboardEvent侦听器,那么它工作正常,但只是将它们放在那里会使它出错并返回

TypeError: Error #1009: Cannot access a property or method of a null object reference.
    at playerTest()
    at main()

这才开始发生,因为我转换了我的代码,让我的角色通过代码生成,而不是只是把它扔到舞台上,就像它完全正常之前那样。

3 个答案:

答案 0 :(得分:4)

实际上,您可以从舞台上已有的任何DisplayObject访问舞台。所以,在你的课堂上,你可以等到播放器被添加到舞台上以添加键盘听众,如下所示:

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

public class playerTest extends MovieClip{
    public function playerTest(xCoord:int, yCoord:int){
        x = xCoord;
        y = yCoord;
        addEventListener(Event.ADDED_TO_STAGE,init);

    }
    private function init(e:Event)
    {
        stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownEvent);
        stage.addEventListener(KeyboardEvent.KEY_UP, keyUpEvent);
    }
    private function keyDownEvent(e:KeyboardEvent):void{
        //
    }
    private function keyUpEvent(e:KeyboardEvent):void{
        //
    }
}
}

答案 1 :(得分:2)

与Benny所说的相反,你绝对可以使用外部类中的舞台,但是该类必须是一个(或者是子类)DisplayObject,它也是舞台。当player1被实例化然后添加到舞台时,它还没有对舞台的引用。您可以收听Event.ADDED_TO_STAGE,然后根据需要将您的活动连接到舞台。

答案 2 :(得分:0)

从外部类引用stage不是最佳做法,如果您不是任何displayobject的子类,则不允许您引用stage。因此最好使用displayObjects。

package {
        import flash.display.MovieClip;
        import flash.events.KeyboardEvent;
        import flash.display.DisplayObject;

        public class playerTest extends MovieClip{
            public function playerTest(xCoord:int, yCoord:int,_stage:DisplayObject){
                x = xCoord;
                y = yCoord;
                _stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownEvent);
                _stage.addEventListener(KeyboardEvent.KEY_UP, keyUpEvent);
            }
            private function keyDownEvent(e:KeyboardEvent):void{
                //
                trace("down");
            }
            private function keyUpEvent(e:KeyboardEvent):void{
                //
            }
        }
    }

//主

 package  {
        import flash.display.MovieClip;
        public class main extends MovieClip{
            public function main(){
                var player1 = new playerTest( 100 , 275 ,stage);
                addChild( player1 );
            }
        }
    }