Слушатель KeyboardEvent, вызывающий TypeError? - PullRequest
0 голосов
/ 08 февраля 2012

Я получаю эту странную ошибку, не знаю почему, я сократил код до минимума и нашел источник проблемы, но я не понимаю, почему он дает ошибку.

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 ]

4 голосов
/ 08 февраля 2012

На самом деле, вы можете получить доступ к сцене из любого объекта 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{
        //
    }
}
}
2 голосов
/ 08 февраля 2012

Вопреки тому, что говорит Бенни, вы можете абсолютно использовать сцену из внешнего класса, однако этот класс должен быть (или подклассом) DisplayObject, который также находится на сцене.Поскольку player1 создается, а затем добавляется на сцену, у него еще нет ссылки на сцену.Вы можете прослушать Event.ADDED_TO_STAGE, а затем подключить свои события к сцене, если хотите.

0 голосов
/ 08 февраля 2012

Не рекомендуется ссылаться на 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 );
            }
        }
    }
...