|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
Регистрация: Mar 2015
Сообщений: 26
|
Клавиатура, мышь, слушатели событий.
Приятно времени суток всем. есть такой вопрос, внутри приложения должны быть непрекращающиеся события привязанные к клавиатуре и мыши. Но, при вызове "KeyboardEvent.KEY_DOWN", при удержании клавиши, сначала дергается объект в нужном направлении, потом замирает, а только потом едет как надо. Движение с комбинированными клавишами работает только в первом рывке. В чем проблема, кто-то знает как это решается?? С мышью еще хуже, событие "MouseEvent.MOUSE_DOWN" должно выполнятся пока кнопка нажата, и удерживается. но оно выполняется только в момент единичного нажатия. типа "CLICK".
|
|
|||||
...
модератор форума
Регистрация: Sep 2006
Адрес: Minsk
Сообщений: 4,286
|
К сожалению в AS3 нету такого свойства, которое бы позволяло получить состояние клавиши нажата/ненажата. Запоминайте состояние: нажали - едем (больше не слушаем событие), отпустили - не едем.
|
|
|||||
Регистрация: Oct 2006
Сообщений: 2,281
|
В таких случаях при первом нажатии вешается слушатель ENTER_FRAME. и в нем события KEY_PRESSED/CLICK повторяются циклически и по KEY_RELEASED/MOUSE_UP удаляем ENTER_FRAME
|
|
|||||
Вот готовый класс by caseyryan для клавиатуры.
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 = {}; 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 = {}; } } } Насчёт мыши вы неправы. Логически верно, что нажатие один раз, и отпускание один раз. Или вы не согласны?
__________________
There is no thing in this world that is not simple. |
|
|||||
Видел решение у одного разработчика:
stage.addEventListener(Event.ENTER_FRAME, onStage); stage.addEventListener(KeyboardEvent.KEY_DOWN, onDown); stage.addEventListener(KeyboardEvent.KEY_UP, onUp); function onDown(e:KeyboardEvent) { keypressed[e.keyCode] = true; } function onUp(e:KeyboardEvent) { keypressed[e.keyCode] = false; } function onStage(e:Event) { var hero_dx = stage.mouseX - hero.x; var hero_dy = stage.mouseY - hero.y; var hero_grad = Math.atan2(hero_dy,hero_dx) * 180 / Math.PI; hero.rotation = hero_grad; if (keypressed[37] || keypressed[65]) hero.x -= speed; if (keypressed[38] || keypressed[87]) hero.y -= speed; if (keypressed[39] || keypressed[68]) hero.x += speed; if (keypressed[40] || keypressed[83]) hero.y += speed; if (hero.x > 800 + hero.width) hero.x = 0 - hero.width; if (hero.y > 600 + hero.width) hero.y = 0 - hero.width; if (hero.x < 0 - hero.width) hero.x = 800 + hero.width; if (hero.y < 0 - hero.width) hero.y = 600 + hero.width; }
__________________
Надо сменить подпись... |
|
|||||
Регистрация: Mar 2015
Сообщений: 26
|
Не то чтобы согласен. Нажатие может быть продолжительным действием, ведь есть же просто действие CLICK, вот оно одноразовое по идее. Но видимо, мне придется использовать подобную технологию (одну из любезно предоставленных мне здесь), и для мыши.
|
|
|||||
Регистрация: Dec 2010
Адрес: Ярославль
Сообщений: 1,255
|
WaldeMar1321, найдите любое поле ввода, и зажмите любую буквенную клавишу на клавиатуре. Что происходит? Сначала появляется один символ, а через секунду символы появляются один за другим быстро. Вот и флешплеер обрабатывает нажатия так же.
|
|
|||||
WaldeMar1321, все события с устройств ввода делятся на 2 части - это начало и конец.
Например, событие клавиатуры KeyboardEvent.KEY_DOWN - это событие начала нажатия, а KeyboardEvent.KEY_UP - это отпускание клавиши. То, что при длительном нажатии клавиши он посылает событие многократно - неправильно с точки зрения логики, но с этим ничего не сделаешь. MouseEvent.MOUSE_DOWN же работает исключительно правильно с точки зрения логики, он отсылается один раз при нажатии левой кнопки мыши, и соответствующее событие ловится при отпускании - MouseEvent.MOUSE_UP. Представьте, какие трудности ждали бы программиста, если бы всё работало не так. Нужно, допустим, при нажатии на кнопку у клипа запустить анимацию, а при отпускании мыши - останавливать. Пишем var clip:MovieClip = new MovieClip();//допустим, это наш клип. var button:Button = new Button(); //допустим, это наша кнопка. button.addEventListener(MouseEvent.MOUSE_DOWN, function(e:Event):void { clip.gotoAndPlay(1); }); button.addEventListener(MouseEvent.MOUSE_UP, function(e:Event):void { clip.gotoAndStop(1); }); Логика этих событий такова, что есть MOUSE_DOWN - начало нажатия, и есть MOUSE_UP - конец нажатия, и всё, что между ними можно делать в обработчике ENTER_FRAME. Есть TouchEvent.TOUCH_BEGIN, а есть TouchEvent.TOUCH_END, что вызывается при нажатии на экран на сенсорном экране, и при отжатии. Есть KeyboardEvent.KEY_DOWN, а есть KeyboardEvent.KEY_UP.
__________________
There is no thing in this world that is not simple. |
|
|||||
Регистрация: Mar 2015
Сообщений: 26
|
наличие массива, там где он в принципе не нужен.
|
Часовой пояс GMT +4, время: 08:06. |
|
« Предыдущая тема | Следующая тема » |
Теги |
йй |
Опции темы | |
Опции просмотра | |
|
|