Flash 键盘事件侦听器导致TypeError?

Flash 键盘事件侦听器导致TypeError?,flash,actionscript-3,actionscript,flash-cs5,packages,Flash,Actionscript 3,Actionscript,Flash Cs5,Packages,我得到了这个奇怪的错误,不知道为什么,我已经将代码减少到最小,并找到了问题的根源,但我不明白为什么它会出错 梅因 package { import flash.display.MovieClip; public class main extends MovieClip{ public function main(){ var player1 = new playerTest( 100 , 275 ); addChi

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

梅因

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()

这只是在我将代码转换为通过代码生成角色而不是将角色扔到舞台上之后才开始发生的,当时它工作得非常好。

从外部类引用
舞台不是最佳做法,如果您没有子类化任何不允许您引用的
stage
displayobject,则可能是。因此,最好使用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 );
            }
        }
    }

从外部类引用
阶段
不是最佳做法,如果您没有子类化任何不允许引用
阶段
显示对象
。因此,最好使用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 );
            }
        }
    }

实际上,您可以从舞台上已经存在的任何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{
        //
    }
}
}

实际上,您可以从舞台上已经存在的任何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{
        //
    }
}
}

与Benny所说的相反,您完全可以从外部类使用stage,但是该类必须是也在stage上的DisplayObject(或其子类)。由于player1被实例化并添加到stage,因此它还没有对stage的引用。你可以监听Event.ADDED_TO_STAGE,然后如果你愿意,将你的事件连接到STAGE。

与Benny所说的相反,你完全可以从外部类使用STAGE,但是该类必须是一个也在STAGE上的DisplayObject(或其子类)。由于player1被实例化并添加到stage,因此它还没有对stage的引用。您可以侦听Event.ADDED_到_STAGE,然后根据需要将事件连接到STAGE。

S.如果外部类没有对displayObject的任何引用,如果它是document类,它是否已经在STAGE上?自从我玩flash以来已经有很长一段时间了,我主要使用flex,我只是不记得lol。我不询问文档类。一个不被任何displayObjects子类化的外部类?在这种情况下,您最好只在构造函数中添加stage:stage作为参数,并将引用传递给中的stage。在这种情况下,你会做一些更像BennyGeo的回答。如果外部类没有对displayObject的任何引用?如果它是document类,它不是已经在后台了吗?自从我玩flash以来已经有很长一段时间了,我主要使用flex,我只是不记得lol。我不询问文档类。一个不被任何displayObjects子类化的外部类?在这种情况下,您最好只在构造函数中添加stage:stage作为参数,并将引用传递给中的stage。在这种情况下,你会做一些更像BennyGeo回答的事情。你确定舞台不是空的吗?选中此复选框,也许您应该改用this.systemManager.stage。是否确定该stage不为null?选中此复选框,也许您应该改用this.systemManager.stage。