![]() |
|
||||||||||
|
|||||
|
Регистрация: Feb 2014
Сообщений: 192
|
Подскажите! Вообще мозги отрофировались. Хочу сделать класс отслеживающий какие клавиши нажаты, а какие отпущены. Но каким образом другие классы могут получать эти данные? Посмотрите мой код для одной клавиши:
package { import flash.display.DisplayObject; import flash.events.Event; import flash.events.KeyboardEvent; import flash.ui.Keyboard; public class MyKey extends DisplayObject { public var downKey:Boolean; public function MyKey() { this.addEventListener(KeyboardEvent.KEY_DOWN,downK); } public function downK(e:KeyboardEvent):void { trace("нажата клавиша"); } } } package { import flash.display.MovieClip; public class ClassA extends MovieClip { public function ClassA() { var myKey:MyKey = new MyKey(); trace(myKey.downKey); } } } at ClassA() А вообще, хочу сделать типа таблицу флагов нажатых клавиш, но как к ним обращаться из других классов?? Последний раз редактировалось Dmitriy154; 10.06.2014 в 19:28. |
|
|||||
|
такой, например, вариант: в 'статическом' классе держим список нажатых клавиш, ну и соответственно всегда можем узнать нажата та или иная клавиша
сам класс /* The MIT License, Copyright (c) 2011. silin (http://silin.su#AS3) */ package silin.utils { import flash.display.*; import flash.events.*; /** * отслеживание нажатых клавиш; <br/> * перед использованием обязателен вызов Key.register() * @author silin */ public class Key { private static var _keys:Array = []; private static var _stage:Stage; private static var _enabled:Boolean = true; /** * не конструктор, экземпляры не создаем */ public function Key() { throw(new Error("Key is a static class and should not be instantiated.")) } /** * привязка к stage <br/> * обязательный метод * @param stage ссылка на stage */ public static function register(stage:Stage):void { _stage = stage; if (_enabled) { _stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler); _stage.addEventListener(KeyboardEvent.KEY_UP, keyUpHandler); } } private static function keyUpHandler(evnt:KeyboardEvent):void { for (var i:int = 0; i < _keys.length; i++) { if (_keys[i] == evnt.keyCode) _keys.splice(i, 1); } } private static function keyDownHandler(evnt:KeyboardEvent):void { var key:int = evnt.keyCode; for (var i:int = 0; i < _keys.length; i++) { if (_keys[i] == key) return; } _keys.push(key); } /** * нажата ли клавиша с кодом key * @param key * @return */ public static function isKeyDown(key:int):Boolean { for (var i:int = 0; i < _keys.length; i++) { if (_keys[i] == key) return true; } return false; } /** * последняя нажатая клавиша, если все отпущены, то 0 */ public static function get lastPressed():int { return _keys.length ? _keys[_keys.length - 1] : 0; } /** * включает/выключает прослушивание/сохранение нажатий клавиш */ public static function get enabled():Boolean { return _enabled; } public static function set enabled(value:Boolean):void { if (_enabled == value) return; _enabled = value; _keys = []; if (_enabled) { _stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler); _stage.addEventListener(KeyboardEvent.KEY_UP, keyUpHandler); }else { _stage.removeEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler); _stage.removeEventListener(KeyboardEvent.KEY_UP, keyUpHandler); } } } } package { import flash.display.Sprite; import flash.events.KeyboardEvent; import flash.ui.Keyboard; import flash.utils.describeType; import silin.utils.Key; public class Main extends Sprite { private var keyList:XMLList; public function Main():void { // cписок клавиш keyList = describeType(Keyboard).descendants("constant").(@type == "uint").@name; Key.register(stage); // при нажатии и отпусканиии смотрим stage.addEventListener(KeyboardEvent.KEY_UP, stage_keyEvent); stage.addEventListener(KeyboardEvent.KEY_DOWN, stage_keyEvent); } private function stage_keyEvent(e:KeyboardEvent):void { var res:Array = []; for ( var i:String in keyList ) { var keyName:String = keyList[i]; if (Key.isKeyDown(Keyboard[keyName])) { res.push(keyName); } } if(res.length)trace(res + " is pressed"); } } } |
|
|||||
|
Регистрация: Jul 2009
Сообщений: 149
|
Не понятен смысл вот этой проверки в слушателе keyDownHandler
Цитата:
private static function keyUpHandler(evnt:KeyboardEvent):void { for (var i:int = 0; i < _keys.length; i++) { if (_keys[i] == evnt.keyCode) _keys.splice(i, 1); } } ![]() |
|
|||||
|
дада, скорее всего вы правы и проверка лишняя
а может и не лишняя, я сейчас не могу вспомнить откуда она взялась, но клавиатуры при нажатии сразу нескольких клавиш не всегда понятно что выдают, может отсюда. а может тупо перестраховался |
|
|||||
|
Есть вариант по-проще
package { import flash.display.Stage; import flash.events.Event; import flash.events.KeyboardEvent; public class Key { private static var initialized:Boolean = false; private static var keysDown:Object = new Object(); public static function initialize(stage:Stage):void { if (!initialized) { stage.addEventListener(KeyboardEvent.KEY_DOWN, keyPressed); stage.addEventListener(KeyboardEvent.KEY_UP, keyReleased); stage.addEventListener(Event.DEACTIVATE, clearKeys); initialized = true; } } public static function isDown(keyCode:uint):Boolean { if (!initialized) { throw new Error("Key class has not yet been initialized."); } return Boolean(keyCode in keysDown); } private static function keyPressed(event:KeyboardEvent):void { keysDown[event.keyCode] = true; } private static function keyReleased(event:KeyboardEvent):void { if (event.keyCode in keysDown) { delete keysDown[event.keyCode]; } } private static function clearKeys(event:Event):void { keysDown = new Object(); } } } // в документ классе Key.initialize(stage); // а в любом другом месте проверяем trace(Key.isDown(Keyboard.SPACE)); Цитата:
__________________
Ко мне можно и нужно обращаться на ты) |
|
|||||
|
[+1 22.07.14]
[+4 12.08.14] [+1 09.02.15] Регистрация: May 2014
Сообщений: 182
|
Мне вот всегда интересно, почему используют Object, который переводит keyCode в String,
когда можно использовать более подходящий для этого Dictionary. |
|
|||||
|
Регистрация: Feb 2014
Сообщений: 192
|
спасибо вам!
|
|
|||||
|
Здесь это не принципиально, явно этот класс не самое слабое место в программе). Но если быть совсем дотошным, и пытаться выжать максимум везде, то да, лучше заменить на Dictionary
__________________
Ко мне можно и нужно обращаться на ты) |
|
|||||
|
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Цитата:
Как Вы делаете, когда надо получить ----------------------------------------------------
__________________
Reality.getBounds(this); |
|
|||||
|
Регистрация: Feb 2014
Сообщений: 192
|
caseyryan - не получается trace(Key.isDown(Keyboard.SPACE)); пишет ошибку - Обращение несуществующего свойства Keyboard.
|
![]() |
![]() |
Часовой пояс GMT +4, время: 09:17. |
|
|
« Предыдущая тема | Следующая тема » |
|
|