Нажатие кнопки с помощью клавиатуры в AS3

Я пытаюсь сделать это, нажав кнопку с помощью клавиши «A» на клавиатуре. Я создал две рамки для этой кнопки, но код не работает, хотя ошибки нет.

Нужно ли мне что-то помещать в мой основной класс? Может ли кто-нибудь помочь исправить это?

package  {

    import flash.display.MovieClip;
    import flash.events.MouseEvent;
    import flash.display.Sprite;
    import flash.display.Stage;
    import flash.events.Event;
    import flash.events.KeyboardEvent;
    import flash.ui.Keyboard;

    public class controlButton extends MovieClip {      

        public function controlButton() {
            // constructor code
            this.addEventListener(KeyboardEvent.KEY_DOWN,clickDown);
            this.addEventListener(KeyboardEvent.KEY_UP,clickUp);
        }

        public function clickDown(event:KeyboardEvent):void{

         // if the key is A
            if(event.charCode == 65){
                this.gotoAndStop(2);
            }
        }

        public function clickUp(event:KeyboardEvent):void{

         // if the key is A
            if(event.charCode == 65){
                this.gotoAndStop(1);
            }
        }

        public function changelabel(newLabel:String):void{

            this.label.text = newLabel;
        }
    }
}

person user1805430    schedule 30.08.2013    source источник
comment
Кроме того, вам следует избегать использования фактических кодов символов, так же как вы избегаете добавления прослушивателя событий для щелчка. Вместо этого используйте константы класса Keyboard. Хотя маловероятно, что коды когда-либо изменятся, это делает их надежными в будущем. (поэтому вместо event.charCode == 65 используйте event.charCode == Keyboard.A)   -  person Josh    schedule 30.08.2013


Ответы (1)


Ваша кнопка никогда не получит никакого KeyboardEvent. Вы должны добавить прослушиватели событий прямо на сцену. Конечно, вы должны получить ссылку на сцену. В любом случае:

package {

import flash.display.MovieClip;
import flash.events.MouseEvent;
import flash.display.Sprite;
import flash.display.Stage;
import flash.events.Event;
import flash.events.KeyboardEvent;
import flash.ui.Keyboard;


public class controlButton extends MovieClip {


    public function controlButton() {
        // constructor code
        addEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
    }

    private function onAddedToStage (e:Event):void
    {
        removeEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
                    //stage is no longer null here
        stage.addEventListener(KeyboardEvent.KEY_DOWN,clickDown);
        stage.addEventListener(KeyboardEvent.KEY_UP,clickUp);
    }


    public function clickDown(event:KeyboardEvent):void{

     // if the key is A
         if(event.charCode == 65){
            this.gotoAndStop(2);
        } 


    }

    public function clickUp(event:KeyboardEvent):void{

     // if the key is A
         if(event.charCode == 65){
                this.gotoAndStop(1);
             }
    }



    public function changelabel(newLabel:String):void{

        this.label.text = newLabel;
    }
}

}

Как видите, вы должны добавить прослушиватели KeyboardEvent на сцену сразу после срабатывания Event.ADDED_TO_STAGE.

person KumoKairo    schedule 30.08.2013
comment
Извините, я совершенно новичок в AS3. когда я реализовал ваш код, я столкнулся с ошибкой доступа к неопределенному свойству onAddedToStage. Где я должен это определить? - person user1805430; 31.08.2013
comment
OMG, извините, я забыл назвать функцию. Это была просто частная функция (e:Event). Теперь это частная функция onAddedToStage (e:Event). Я исправил ответ, попробуйте снова скопировать его. - person KumoKairo; 31.08.2013