Показать сообщение отдельно
Старый 24.11.2010, 11:51
goodguy вне форума Посмотреть профиль Найти все сообщения от goodguy
  № 1  
Ответить с цитированием
goodguy
Banned

Регистрация: Jan 2010
Адрес: РФ. Кемеровская область
Сообщений: 3,243
Attention Control препятствует нажатию клавиш вверх и вниз

Уже почти полгода пишу военную стратегию, написал огромное количество кода, и вот вчера заметил ону неприятную особенность клавиатурных событий.

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


Как ни старался, обойти этот косяк пока не удалось.
Если кто-то подскажет какое-то решение, буду безмерно благодарен.

И кстати, это происходит в дебаговом плеере. Если запустить в отдельном, то не работают стрелки влево и вправо, а вверх вниз начинат работать. Уже и не знаю куда копать..


Последний раз редактировалось iNils; 24.11.2010 в 13:43.