![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Banned
[+1 05.11.11]
[+1 09.08.11] Регистрация: Jan 2010
Адрес: РФ. Кемеровская область
Сообщений: 3,243
|
Уже почти полгода пишу военную стратегию, написал огромное количество кода, и вот вчера заметил ону неприятную особенность клавиатурных событий.
К главному контейнеру, в котором происходят все боевые действия добавлены слуаштели KEY_UP и KEY_DOWN, ну и естественно обработчики событий. Раньше игровая техника, солдаты и пр. управлялись мышкой, недавно добавил так же WASD управление + стрелки, ну и естественно контрол, шифт и т.п. Чтобы не загромаждать классы транспорта обработчиками событий и не вешать лишних слушателей, все они обрабатываются в специальном классе-конструкторе, а в каждом транспортном средстве есть метод: public function setKeys(up:Boolean = false, down:Boolean = false, right:Boolean = false, left:Boolean = false, space:Boolean = false, shift:Boolean = false, control:Boolean = false) Вот так обрабатываются нажатия клавишь в классе конструкторе: if (e.kif (e.keyCode == Keyboard.CONTROL) { _controlPressed = true; keyCheckTimer.start(); pointer.pointer.gotoAndStop(2);// превращает курсор в прицел if (objectToMove.length >= 1) { if (objectToMove[0] is PlayerHeli) { if (mouseDown) { objectToMove[0].launchRocket(); } } else if (objectToMove[0] is PlayerTank) { if (mouseDown) { objectToMove[0].shoot(); } } else if (objectToMove[0] is PCN) { if (mouseDown) { objectToMove[0].shoot(); } } else if (objectToMove[0] is PSU) { for (var i in objectToMove) { if (mouseDown) { objectToMove[i].shoot(); } } } else { if (mouseDown) { objectToMove[0].shoot(); } } } } else { if (objectToMove[0] is PSU) { stopFire(); } } if (e.keyCode == Keyboard.SHIFT) { _shiftPressed = true; keyCheckTimer.start(); } if (e.keyCode == Keyboard.SPACE) { _spacePressed = true; } // ДО СЮДА ВЫПОЛНЕНИЕ КОНЕЧНО ДОХОДИТ, НО ЕСЛИ КОНТРОЛ НАЖАТ, ТО ПРОГРАММА НЕ ПОНИМАЕТ КОДА ДЛЯ КЛАВИШИ ВВЕРХ if (e.keyCode == Keyboard.UP || e.keyCode == 87) { _upPressed = true; } if (e.keyCode == Keyboard.DOWN || e.keyCode == 83) { _downPressed = true; } if (e.keyCode == Keyboard.RIGHT || e.keyCode == 68) { _rightPressed = true; } if (e.keyCode == Keyboard.LEFT || e.keyCode == 65) { _leftPressed = true; } // посылание значений клавишь в транспортные средства. Остальное обрабатывается уже в их классах if (!(objectToMove[0] is PSU)) { try { objectToMove[0].setKeys(_upPressed, _downPressed, _rightPressed, _leftPressed, _spacePressed, _shiftPressed, _controlPressed); } catch (e:Error) { } } Как ни старался, обойти этот косяк пока не удалось. Если кто-то подскажет какое-то решение, буду безмерно благодарен. И кстати, это происходит в дебаговом плеере. Если запустить в отдельном, то не работают стрелки влево и вправо, а вверх вниз начинат работать. Уже и не знаю куда копать.. Последний раз редактировалось iNils; 24.11.2010 в 13:43. |
|
|||||
|
Негуру
администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,883
Записей в блоге: 7
|
В обработчике у event может быть только одно значение keyCode, поэтому проверять на равность кода к контролу, а потом к другому коду - бесполезно.
KeyboardEvent(type:String, bubbles:Boolean = true, cancelable:Boolean = false, charCode:uint = 0, keyCode:uint = 0, keyLocation:uint = 0, [COLOR="rgb(0, 191, 255)"]ctrlKey:Boolean = false[/color], altKey:Boolean = false, shiftKey:Boolean = false) Цитата:
И еще, не надо писать кучу отдельных if, надо писать if - else, иначе после первого же совпадения, вы в холостую будете продолжать сравнивать коды. А еще лучше для такого подойдет switch-case |
|
||||||
|
Banned
[+1 05.11.11]
[+1 09.08.11] Регистрация: Jan 2010
Адрес: РФ. Кемеровская область
Сообщений: 3,243
|
iNils, не внимательно читаете
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
![]() ------------------ позже ------------ Нет, ничего не меняется Похоже это косяк флеш плеера, а не моего кода. Так как убираю из кода вообще все, что связано с контролом, и все равно клавиши перестают работать при нажатии ктрлДобавлено через 50 минут Проблема найдена! ![]() Это действительно косяк флеш плеера, который исправлен в новой версии. Скачал с офсайта новый плеер и вуаля. Всё пашет! Тему можно закрыть. Последний раз редактировалось goodguy; 24.11.2010 в 13:42. |
|
|||||
|
Негуру
администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,883
Записей в блоге: 7
|
goodguy, для того что бы внимательно читать, нужно код с нормальным форматирование выкладывать. Когда я вижу, что код смещен табуляций относительно первой строчки, то он автоматически считается вложенным.
Цитата:
Когда возникают подобные ошибки в большом коде, открываете новый проект и выносите туда проблемную часть в упрощенном виде. То есть вам нужно просто проверить реакцию на клавиши. Типа этого function down (e:KeyboardEvent):void { if (e.keyCode == Keyboard.CONTROL) { trace ("ctrl") } else { trace ("no ctrl") } switch (e.keyCode) { case Keyboard.SHIFT: trace ("shift") break; case Keyboard.SPACE: trace ("space") break; case Keyboard.UP: case 87: trace ("up") break; case Keyboard.DOWN: case 83: trace ("down") break; case Keyboard.RIGHT: case 68: trace ("right") break; case Keyboard.LEFT: case 65: trace ("left") break; } } stage.addEventListener (KeyboardEvent.KEY_DOWN, down); Но я кажется понял в чем проблема. Вы наверно в Flash IDE разрабатываете, а там комбинация ctrl+стрелки перехватывается интерфейсом плеера. Вам нужно в меню плеера отключить это: Control > Disable Keyboard Shortcuts |
|
|||||
|
Banned
[+1 05.11.11]
[+1 09.08.11] Регистрация: Jan 2010
Адрес: РФ. Кемеровская область
Сообщений: 3,243
|
Цитата:
Цитата:
Цитата:
![]() Цитата:
---- позже---- аа, так это в самом плеере, а я в ide ищу ![]() Помогло! Спасибо! Теперь и в дебаговом плеере все работаетПоследний раз редактировалось goodguy; 24.11.2010 в 15:22. |
![]() |
![]() |
Часовой пояс GMT +4, время: 00:57. |
|
|
« Предыдущая тема | Следующая тема » |
|
|