Уже почти полгода пишу военную стратегию, написал огромное количество кода, и вот вчера заметил ону неприятную особенность клавиатурных событий.
К главному контейнеру, в котором происходят все боевые действия добавлены слуаштели KEY_UP и KEY_DOWN, ну и естественно обработчики событий.
Раньше игровая техника, солдаты и пр. управлялись мышкой, недавно добавил так же WASD управление + стрелки, ну и естественно контрол, шифт и т.п.
Чтобы не загромаждать классы транспорта обработчиками событий и не вешать лишних слушателей, все они обрабатываются в специальном классе-конструкторе, а в каждом транспортном средстве есть метод:

Код AS3:
public function setKeys(up:Boolean = false, down:Boolean = false, right:Boolean = false,
left:Boolean = false, space:Boolean = false, shift:Boolean = false, control:Boolean = false)
Действует такая конструкция отлично, за исключением клавишь shift и control.
Вот так обрабатываются нажатия клавишь в классе конструкторе:

Код AS3:
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) {
}
}
Всё на первый взгляд должно работать. Но по какой-то причине, если зажать контрол, то код для клавиши вверх или вниз, приянт не будет. И если поместить в обработчик клавиши вверх или вниз трейс, то он не сработает пока не будет отпущен контрол.
Как ни старался, обойти этот косяк пока не удалось.
Если кто-то подскажет какое-то решение, буду безмерно благодарен.
И кстати, это происходит в дебаговом плеере. Если запустить в отдельном, то не работают стрелки влево и вправо, а вверх вниз начинат работать. Уже и не знаю куда копать..