#flash #actionscript #keylistener
#flash #actionscript #keylistener
Вопрос:
Могу ли я отслеживать нажатые клавиши, используя ActionScript?
Ответ №1:
Я использую этот класс, который я создал некоторое время назад:
РЕДАКТИРОВАТЬ: теперь немного чище.
package
{
import flash.display.Stage;
import flash.events.KeyboardEvent;
public class Keys extends Object
{
// vars
private var _keys:Array = [];
/**
* Constrcutor
* @param stg The stage to apply listeners to
*/
public function Keys(stg:Stage)
{
stg.addEventListener(KeyboardEvent.KEY_DOWN, _keydown);
stg.addEventListener(KeyboardEvent.KEY_UP, _keyup);
}
/**
* Called on dispatch of KeyboardEvent.KEY_DOWN
*/
private function _keydown(e:KeyboardEvent):void
{
//trace(e.keyCode);
_keys[e.keyCode] = true;
}
/**
* Called on dispatch of KeyboardEvent.KEY_UP
*/
private function _keyup(e:KeyboardEvent):void
{
delete _keys[e.keyCode];
}
/**
* Returns a boolean value that represents a given key being held down or not
* @param ascii The ASCII value of the key to check for
*/
public function isDown(...ascii):Boolean
{
var i:uint;
for each(i in ascii)
{
if(_keys[i]) return true;
}
return false;
}
}
}
Отсюда все просто: создайте экземпляр keys и используйте метод isDown().
var keys:Keys = new Keys(stage);
addEventListener(Event.ENTER_FRAME, _handle);
function _handle(e:Event):void
{
if(keys.isDown(65)) trace('key A is held down');
}
Он может даже проверять наличие нескольких клавиш одновременно:
if(keys.isDown(65, 66)) // true if 'a' or 'b' are held down.
Редактировать:
Это также очень помогает при тестировании с использованием компиляции (ctrl enter) для отключения сочетаний клавиш (control -> отключить сочетания клавиш).
Комментарии:
1. Почему Keys расширяет Sprite?
2. Поскольку Object не имеет свойства stage, поскольку это не DisplayObject.
3. @miguelSantirso Как тебе это подходит?
4. Но в опубликованном вами коде свойство stage передается в качестве параметра конструктору класса, поэтому я не понимаю, зачем вам расширять Sprite…
5. Этап не был передан конструктору, когда Keys расширял Sprite — это была всего лишь одна поправка — см. правки.