Статьи

Совет: использование кодов клавиш AS3

Узнайте, как использовать коды клавиш в ActionScript 3.0 для определения, когда пользователь нажимает конкретную клавишу.


Давайте посмотрим на конечный результат, к которому мы будем стремиться:

Проверьте ответы, нажав клавиши на клавиатуре.


Откройте новый документ Flash. Добавьте слева статические текстовые поля с именами обнаруживаемых ключей и динамические текстовые поля с текстом «Нет» внутри.

Дайте вашим динамическим текстовым keyname_txt имена экземпляров в следующем формате: « keyname_txt ». Мои ctrl_txt , shift_txt , left_txt , up_txt , right_txt , down_txt и space_text соответственно.


Выберите « File 〉 New и выберите « Actionscript File .

Теперь настройте базовый класс документа следующим образом: (Если вы хотите узнать о классах документов, прочитайте Быстрый совет Майкла )

01
02
03
04
05
06
07
08
09
10
11
12
package
{
    import flash.display.MovieClip;
     
    public class KeyCodes extends MovieClip
    {
        public function KeyCodes()
        {
 
        }
    }
}

Чтобы определить, когда пользователь нажимает клавишу с AS3, нам нужно добавить прослушиватели событий, которые прослушивают нажатие и отпускание клавиш пользователем. Мы можем сделать это, добавив следующий фрагмент кода в нашу KeyCodes() конструктора KeyCodes() :

1
2
3
4
5
public function KeyCodes()
{
    stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyPress);
    stage.addEventListener(KeyboardEvent.KEY_UP, onKeyRelease);
}

Прежде чем продолжить, нам нужно добавить строку кода для импорта KeyboardEvent . Добавьте эту строку кода ниже, где мы импортируем класс MovieClip в строке 3:

1
2
3
4
package
{
    import flash.display.MovieClip;
    import flash.events.KeyboardEvent;

Под нашими слушателями добавляются две функции, которые будут вызываться, когда пользователь нажимает или отпускает клавишу:

01
02
03
04
05
06
07
08
09
10
11
12
13
public function KeyCodes()
{
    stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyPress);
    stage.addEventListener(KeyboardEvent.KEY_UP, onKeyRelease);
 
    function onKeyPress(e:KeyboardEvent):void {
 
    }
 
    function onKeyRelease(e:KeyboardEvent):void {
 
    }
}

Теперь мы можем добавить trace() к каждой функции, чтобы при нажатии клавиши она отслеживала нажатие клавиши на панели вывода и отпускание клавиши при отпускании клавиши. Для этого мы можем добавить следующий код в наши функции:

01
02
03
04
05
06
07
08
09
10
11
12
13
public function KeyCodes()
{
    stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyPress);
    stage.addEventListener(KeyboardEvent.KEY_UP, onKeyRelease);
 
    function onKeyPress(e:KeyboardEvent):void {
        trace(«key pressed»);
    }
 
    function onKeyRelease(e:KeyboardEvent):void {
        trace(«key released»);
    }
}

Проверьте свой фильм (Ctrl + Enter). Когда вы нажимаете клавишу, она должна отслеживать «нажатие клавиши» на панели вывода и «отпускание клавиши» при ее отпускании.


Вы можете определить, какая клавиша была нажата, проследив код клавиши. Измените свою трассировку с trace("key pressed") на trace(e.keyCode) и удалите трассировку, освобожденную ключом. Ваш код теперь должен выглядеть так:

01
02
03
04
05
06
07
08
09
10
11
12
13
public function KeyCodes()
{
    stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyPress);
    stage.addEventListener(KeyboardEvent.KEY_UP, onKeyRelease);
 
    function onKeyPress(e:KeyboardEvent):void {
        trace(e.keyCode);
    }
 
    function onKeyRelease(e:KeyboardEvent):void {
         
    }
}

Теперь, когда вы нажимаете клавишу, она будет отслеживать код, который относится к этой конкретной клавише. Если я нажму стрелку влево, он проследит 37 в панель вывода, а пробел проследит 32 .

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

1
2
3
4
5
6
7
function onKeyPress(e:KeyboardEvent):void {
    trace(e.keyCode);
 
    if(e.keyCode == 32) { //If the keycode is equal to 32 (spacebar)
        trace(«spacebar pressed»);
    }
}

Теперь, если вы нажмете пробел, он не только отследит 32, но и «нажата пробел». Вы можете использовать это, чтобы иметь дело со многими различными клавишами отдельно в рамках одной функции.


Идите дальше и удалите трассировку внутри оператора if. Замените это на это:

1
2
3
4
5
6
7
function onKeyPress(e:KeyboardEvent):void {
    trace(e.keyCode);
 
    if(e.keyCode == 32) { //If the keycode is equal to 32 (spacebar)
        space_txt.text = «Yes»;
    }
}

Теперь, когда вы нажимаете пробел, вы должны увидеть, как метка пробела меняется с «Нет» на «Да».

Сделайте это для всех клавиш, кроме управления и переключения, так как они имеют особые способы обнаружения.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
function onKeyPress(e:KeyboardEvent):void {
    if(e.keyCode == 37){ //37 is keycode for left arrow
        left_txt.text = «Yes»;
    }
    if(e.keyCode == 38){ //38 is keycode for up arrow
        up_txt.text = «Yes»;
    }
    if(e.keyCode == 39){ //39 is keycode for right arrow
        right_txt.text = «Yes»;
    }
    if(e.keyCode == 40){ //40 is keycode for down arrow
        down_txt.text = «Yes»;
    }
    if(e.keyCode == 32){ //32 is keycode for spacebar
        space_txt.text = «Yes»;
    }
}

Как определить, нажаты ли кнопки управления или переключения? Каждый из них имеет простую встроенную переменную, которая автоматически изменяется при нажатии клавиш. Вы можете обнаружить их, используя следующий код. Поместите этот код ниже других операторов onKeyPress() в onKeyPress() .

1
2
3
4
5
6
if(e.ctrlKey == true) {
    ctrl_txt.text = «Yes»;
}
if(e.shiftKey == true) {
    shift_txt.text = «Yes»;
}

Примечание: есть также altKey , который определяет, нажата ли клавиша alt. Это будет работать только в приложениях Adobe AIR, так как нажатие клавиши alt при фокусировке в файле Flash почти всегда отвлекает внимание от SWF и поэтому не работает.


Для создания функции release все, что нам нужно сделать, это скопировать код внутри функции onKeyPress() и просто изменить несколько вещей.

Нам нужно изменить весь текст, чтобы сказать «Нет» вместо «Да», и проверить, что ctrlKey и shiftKey имеют значение false не true . Вот как должен выглядеть окончательный код:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
package
{
    import flash.display.MovieClip;
    import flash.events.KeyboardEvent;
     
    public class KeyCodes extends MovieClip
    {
        public function KeyCodes()
        {
            stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyPress);
            stage.addEventListener(KeyboardEvent.KEY_UP, onKeyRelease);
             
            function onKeyPress(e:KeyboardEvent):void {
                if(e.keyCode == 37){ //37 is keycode for left arrow
                    left_txt.text = «Yes»;
                }
                if(e.keyCode == 38){ //38 is keycode for up arrow
                    up_txt.text = «Yes»;
                }
                if(e.keyCode == 39){ //39 is keycode for right arrow
                    right_txt.text = «Yes»;
                }
                if(e.keyCode == 40){ //40 is keycode for down arrow
                    down_txt.text = «Yes»;
                }
                if(e.keyCode == 32){ //32 is keycode for spacebar
                    space_txt.text = «Yes»;
                }
                if(e.ctrlKey == true) {
                    ctrl_txt.text = «Yes»;
                }
                if(e.shiftKey == true) {
                    shift_txt.text = «Yes»;
                }
            }
             
            function onKeyRelease(e:KeyboardEvent):void {
                if(e.keyCode == 37){ //37 is keycode for left arrow
                    left_txt.text = «No»;
                }
                if(e.keyCode == 38){ //38 is keycode for up arrow
                    up_txt.text = «No»;
                }
                if(e.keyCode == 39){ //39 is keycode for right arrow
                    right_txt.text = «No»;
                }
                if(e.keyCode == 40){ //40 is keycode for down arrow
                    down_txt.text = «No»;
                }
                if(e.keyCode == 32){ //32 is keycode for spacebar
                    space_txt.text = «No»;
                }
                if(e.ctrlKey == false) {
                    ctrl_txt.text = «No»;
                }
                if(e.shiftKey == false) {
                    shift_txt.text = «No»;
                }
            }
        }
    }
}

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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
package
{
    import flash.display.MovieClip;
    import flash.events.KeyboardEvent;
     
    public class KeyCodes extends MovieClip
    {
        public function KeyCodes()
        {
            stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyPress);
            stage.addEventListener(KeyboardEvent.KEY_UP, onKeyRelease);
        }
         
        public function onKeyPress(e:KeyboardEvent):void {
            if(e.keyCode == 37){ //37 is keycode for left arrow
                left_txt.text = «Yes»;
            }
            if(e.keyCode == 38){ //38 is keycode for up arrow
                up_txt.text = «Yes»;
            }
            if(e.keyCode == 39){ //39 is keycode for right arrow
                right_txt.text = «Yes»;
            }
            if(e.keyCode == 40){ //40 is keycode for down arrow
                down_txt.text = «Yes»;
            }
            if(e.keyCode == 32){ //32 is keycode for spacebar
                space_txt.text = «Yes»;
            }
            if(e.ctrlKey == true) {
                ctrl_txt.text = «Yes»;
            }
            if(e.shiftKey == true) {
                shift_txt.text = «Yes»;
            }
        }
         
        public function onKeyRelease(e:KeyboardEvent):void {
            if(e.keyCode == 37){ //37 is keycode for left arrow
                left_txt.text = «No»;
            }
            if(e.keyCode == 38){ //38 is keycode for up arrow
                up_txt.text = «No»;
            }
            if(e.keyCode == 39){ //39 is keycode for right arrow
                right_txt.text = «No»;
            }
            if(e.keyCode == 40){ //40 is keycode for down arrow
                down_txt.text = «No»;
            }
            if(e.keyCode == 32){ //32 is keycode for spacebar
                space_txt.text = «No»;
            }
            if(e.ctrlKey == false) {
                ctrl_txt.text = «No»;
            }
            if(e.shiftKey == false) {
                shift_txt.text = «No»;
            }
        }
    }
}

Проверь свой фильм и все должно быть хорошо! Если у вас есть какие-либо комментарии или проблемы, просто разместите их в разделе комментариев, и я (или кто-то еще) отвечу на ваш вопрос.

Спасибо за чтение, и я надеюсь, что это помогло вам узнать больше о нажатиях клавиш во Flash.