Удобная работа с мышью и клавиатурой - класс Input.as
Запись от Jarproger размещена 31.01.2012 в 22:53
Наверно многие из вас сталкивались с тем, что в языке ActionScript 3 при создании игры типа "аркада" возникает ряд проблем с клавиатурой.
Во-первых, нету, как в AS 2, удобной функции key.isDown(). А создавать переменные-триггеры для каждой клавиши - это очень не удобно и не правильно. Я решил эту проблему, создав класс KeyCheck, который вешает на себя события нажатия и отпускания клавиш и запоминает их состояния в массивах. Я уже писал в блоге про этот класс.
Во-вторых, событие KEY_UP может и не прийти - например, если пользователь вызвал контекстное меню (!!!) и там отпустил клавишу, то событие не отправиться и для программы клавиша будет нажата. Аналогично с переключением между окнами, например, alt-tab. Кроме того, с мышью также возникают проблемы и я столкнулся с ними при написании игрового инвентаря - если объект "взять", а потом вызвать контекстное меню, там отпустить, то затем он "прилипнет" к мышке.
Я написал более универсальный класс Input.as, который решает все эти проблемы - отслеживает открытие контекстного меню, потерю фокуса окна и сбрасывает состояние мыши и клавиатуры.
Использовать его предельно просто:
public var inp:Input;//Создаём объект inp = new Input(this);//В конструкторе главного класса передаём ссылку на него //..И всё - далее вы можете в любой момент узнать текущее состояние клавиатуры и мыши inp.code[65] - вернёт true, если сейчас нажата и удерживается клавиша 'a' inp.isMouseDown - определит состояние левой кнопки мыши мыши
Всего комментариев 20
Комментарии
![]() ![]() |
|
![]() ![]() |
|
Цитата:
Если swf'ке нужна работа с клавиатурой - у него будет свой Input
|
![]() ![]() |
|
Цитата:
Т.е. code[x] лучше сделать только read, через геттеры?
просто более типобезопасный и, главное, боллее понятный (как его использовать и что вернёт ясно), чем Тут без доков не сразу догадаешься, что если написать code[32], то оно вернет булевское значение нажата ли клавиша. И да, пользователи класса могут подумать что можно для каких-то целей менять этот массив или присваивать (хотя мозги у разработчиков иногда включаются и такие заблуждения маловероятны) Чисто из-за этих соображений |
|
Обновил(-а) expl 01.02.2012 в 12:03
|
![]() ![]() |
|
Цитата:
Статичным никак не получиться, т.к. он должен обрабатывать stage...
|
![]() ![]() |
|
Цитата:
А зачем вы вешаете листенеры на каждый root.stage? Stage один у нас.
|
![]() ![]() |
|
воможно со stage3D путаете
|
![]() ![]() |
|
В air по одному для каждого NativeWindow, т.е. в приложении их может быть несколько.
|
![]() ![]() |
|
Цитата:
В air по одному для каждого NativeWindow, т.е. в приложении их может быть несколько.
|
![]() ![]() |
|
Не делай синглетон
![]() |
Последние записи от Jarproger
- Удобная работа с мышью и клавиатурой - класс Input.as (31.01.2012)
- Универсальный загрузчик объектов ver 2.0 (Library.as) (21.06.2011)
- Универсальный загрузчик данных для AS 3.0 (10.03.2011)
- Продвинутая работа с клавой в AS 3.0 (08.01.2011)