|
|
|||||
Регистрация: Oct 2009
Сообщений: 52
|
Wolsh, сейчас попробую то что вы написали, наверное, это именно то, что мне и нужно было. Попозже напишу: получилось или нет!
Добавлено через 12 минут Только что протестил, конечно в одном вопросе-это мне помогло, но тот который я задавал, остался не решённым. Попробую грамотней изъяснить суть проблемы. Я написал код передвижения объекта. Код работает, но когда зажимаешь клавишу(по нажатию которой, движется объект). Изначально он перемещается на то количество пикселей, которое указано, а через пару секунд начинает двигаться непрерывно. А мне нужно, что бы он всегда двигался непрерывно(если это возможно!) |
|
|||||
В обработчике нажатия клавиши вы должны только выставить флаг "Нажата клавиша X" и все. Движение должно происходить отдельно в обработчике ENTER_FRAME или событий таймера, не важно. То что у вас происходит на данный момент связано с особенностями работы клавиатуры. Сперва возникает одиночное событие нажатия клавиши, а через определенное время (зависит от настроек драйвера в ОС) начинается его повтор.
__________________
משיח לא בא משיח גם לא מטלפן |
|
|||||
Регистрация: Oct 2009
Сообщений: 52
|
Спасибо большое, это очень дельный совет, я попозже немного попробую, если получиться, то буду вам очень благодарен
|
|
|||||
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
package { import flash.display.Sprite; import flash.events.Event; import flash.events.KeyboardEvent; import flash.ui.Keyboard; public class Main extends Sprite { private var _auto:Sprite; private var _keyW:Boolean = false; private var _keyS:Boolean = false; private var _keyA:Boolean = false; private var _keyD:Boolean = false; private var _speed:Number = 2; public function Main():void { if (stage) init(); else addEventListener(Event.ADDED_TO_STAGE, init); } private function init(e:Event = null):void { removeEventListener(Event.ADDED_TO_STAGE, init); //// рисуем "машинку" _auto = new Sprite(); _auto.graphics.beginFill(0x666666); _auto.graphics.drawRoundRectComplex(0, 0, 50, 100, 10, 10, 0, 0); this.addChild(_auto); _auto.x = 250; _auto.y = 250; //// слушатели клавиатуры this.stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler); this.stage.addEventListener(KeyboardEvent.KEY_UP, keyUpHandler); //// слушатель ентерфрейм this.addEventListener(Event.ENTER_FRAME, enterFrameHandler); } private function enterFrameHandler(event:Event):void { if (_keyA) _auto.x -= _speed; if (_keyD) _auto.x += _speed; if (_keyW) _auto.y -= _speed; if (_keyS) _auto.y += _speed; } private function keyUpHandler(event:KeyboardEvent):void { switch(event.keyCode) { case Keyboard.W : _keyW = false; break; case Keyboard.S : _keyS = false; break; case Keyboard.A : _keyA = false; break; case Keyboard.D : _keyD = false; break; } } private function keyDownHandler(event:KeyboardEvent):void { switch(event.keyCode) { case Keyboard.W : _keyW = true; break; case Keyboard.S : _keyS = true; break; case Keyboard.A : _keyA = true; break; case Keyboard.D : _keyD = true; break; } } } }
__________________
Reality.getBounds(this); |
|
|||||
Регистрация: Oct 2009
Сообщений: 52
|
Wolsh спасибо, но я это уже понял. Но у меня возникла ещё одна проблема, у вас в коде используеться под кнопки 4 переменных, а представте их будет больше?? Тогда ваш код увеличиться в разы, и я, поэтому решил вводить в одну переменную разные значения. Создать переменную у меня не составило труда, а обратиться не знаю как!? Если вам не трудно подскажите.
Добавлено через 5 минут Всё, я уже разобрался, всем спасибо) Больше пока нету вопросов) |
|
|||||
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Ну, мой-то вряд ли увеличится))) Скорее уменьшится:
package { import flash.display.Sprite; import flash.events.Event; import flash.events.KeyboardEvent; import flash.ui.Keyboard; public class Main extends Sprite { private var _auto:Sprite; private var _keys:Vector.<Boolean> = new Vector.<Boolean>(256); private var _speed:Number = 2; public function Main():void { if (stage) init(); else addEventListener(Event.ADDED_TO_STAGE, init); } private function init(e:Event = null):void { removeEventListener(Event.ADDED_TO_STAGE, init); //// рисуем "машинку" _auto = new Sprite(); _auto.graphics.beginFill(0x666666); _auto.graphics.drawRoundRectComplex(0, 0, 50, 100, 10, 10, 0, 0); this.addChild(_auto); _auto.x = 250; _auto.y = 250; //// слушатели клавиатуры this.stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler); this.stage.addEventListener(KeyboardEvent.KEY_UP, keyUpHandler); //// слушатель ентерфрейм this.addEventListener(Event.ENTER_FRAME, enterFrameHandler); } private function enterFrameHandler(event:Event):void { if (_keys[Keyboard.A]) _auto.x -= _speed; if (_keys[Keyboard.D]) _auto.x += _speed; if (_keys[Keyboard.W]) _auto.y -= _speed; if (_keys[Keyboard.S]) _auto.y += _speed; } private function keyUpHandler(event:KeyboardEvent):void { _keys[event.keyCode] = false; } private function keyDownHandler(event:KeyboardEvent):void { _keys[event.keyCode] = true; } } }
__________________
Reality.getBounds(this); |
|
|||||
Цитата:
__________________
משיח לא בא משיח גם לא מטלפן |
|
|||||
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Да я просто мысль пытался донести)) Словами не получается, значит кодом. Кроме того, автор упрямо скрывает детали задачи, отчего у нас уже три страницы на тему "как двигать квадратик". Вот теперь появилось "много клавиш", причем я это понимаю как "много клавиш для разных действий", а alatar — как много клавиш для тех же четырех действий. Я таки считаю что лучше хранить "слепок" клавиатуры в массиве или векторе, а логику движения разбирать там, где надо — в обработчике ентерфрейма. То есть проверка расширится, только и всего:
private function enterFrameHandler(event:Event):void { if (_keys[Keyboard.A] || _keys[Keyboard.LEFT]) _auto.x -= _speed; if (_keys[Keyboard.D] || _keys[Keyboard.RIGHT]) _auto.x += _speed; if (_keys[Keyboard.W] || _keys[Keyboard.UP]) _auto.y -= _speed; if (_keys[Keyboard.S] || _keys[Keyboard.DOWN]) _auto.y += _speed; }
__________________
Reality.getBounds(this); |
|
|||||
Регистрация: Oct 2009
Сообщений: 52
|
Спасибо вам всем, главное, я разобрался со своей проблемой. А то что вы написали про клавиши, немного не удобно. Не проще присваивать переменной значение клавиши, а дальше делать проверку?
Добавлено через 2 минуты А да, я давно хотел спросить, а :void для чего писать нужно? |
|
|||||
Зависит от конкретной задачи. В общем случае следует абстрагировать устройства ввода от команд, т.к. сегодня это клавиатура с мышью, а завтра тачскрин.
Добавлено через 3 минуты Цитата:
__________________
משיח לא בא משיח גם לא מטלפן |
Часовой пояс GMT +4, время: 16:07. |
|
« Предыдущая тема | Следующая тема » |
Теги |
addeventlistener |
|
|