События клавиатуры AS3 в классе? - PullRequest
2 голосов
/ 06 июня 2009

Кажется, у меня проблемы с получением события клавиатуры внутри класса, у меня есть событие ENTER_FRAME, которое работает нормально, но событие клавиатуры никогда не вызывается. Есть идеи? вот код

package 
{
import flash.display.MovieClip;
import flash.display.Stage;
import flash.events.*;
public class mainGame extends MovieClip 
{
    var myPlayer:player = new player();
    function mainGame():void 
    {   
        trace("arg!");
        addChild(myPlayer);
        addEventListener(KeyboardEvent.KEY_DOWN, keyDown);
        addEventListener(Event.ENTER_FRAME, update);
    }
    function keyDown(evt:KeyboardEvent):void
        {
                            trace("This never happens");
            myPlayer.x++;
        }
        function update(evt:Event):void
        {
            trace("This happens fine");
        }

}
}

спасибо заранее!

Ответы [ 3 ]

16 голосов
/ 07 июня 2009

В отличие от AS2, в AS3 события клавиатуры не являются глобальными. Они выдаются на сцену, и они пролистывают список отображения к любому экранному объекту, который имеет фокус. В вашем коде ваш прослушиватель событий добавляется к mainGame, поэтому он будет срабатывать только тогда, когда mainGame находится на сцене, а пользователь щелкнул (или забыл мышью, я забыл) фильм mainGame клип.

Когда вы хотите получать события клавиатуры в глобальном масштабе, как я уже сказал, все они начинаются со стадии до появления пузырьков, поэтому, если вы зарегистрируетесь для событий со сценой, вы получите все события клавиатуры. Итак, как сказал Кекоав, способ сделать это -

stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDown);

Однако ваша проблема в том, что stage в этом коде не является глобальной переменной. Это свойство является общим для всех объектов DisplayObject, но оно равно нулю, пока объект не будет добавлен в список отображения.

Таким образом, чтобы обойтись без объяснений, приведенный выше код будет работать, если вы позвоните ему после того, как mainGame был добавлен на сцену. Если у вас нет простого способа сделать это, вы можете добавить свой слушатель клавиатуры внутри другого слушателя, который знает, когда нужно запустить:

    function mainGame():void {       
        //...
        addEventListener(Event.ADDED_TO_STAGE, stageAddHandler);
        //...
    }

    private function stageAddHandler(e:Event):void {
        stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDown);
        removeEventListener(Event.ADDED_TO_STAGE, stageAddHandler);
    }
2 голосов
/ 20 октября 2011
 import flash.events.Event;
 import flash.events.KeyboardEvent;

поместите событие клавиатуры в событие enterframe, чтобы оно обновлялось при каждом обновлении фрейма.

            function update(evt:Event):void     
            {     
                    trace("This happens fine"); 
                     function keyDown(evt:KeyboardEvent):void     
                     {     
                        trace("This never happens");     
                        myPlayer.x++;     
                     }     
            }  
2 голосов
/ 06 июня 2009

Добавьте слушателей событий клавиатуры на сцену, а не в класс.

stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDown);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...