Попробуй повесить слушатель события на stage.
А вообще (ничего, что я на ты?) – сложно ты всё придумал.
Заведи хэш

Код AS3:
private var _pressedKeys:Object = {}
Слушатели сделай элегантными

Код AS3:
private function gameKeysUp(e:KeyboardEvent):void{
_pressedKeys[e.keyCode] = false;
}
private function gameKeysDown(e:KeyboardEvent):void{
_pressedKeys[e.keyCode] = true;
}
Заведи метод для определения, нажата ли клавиша. Раз у тебя клавиши дублируются, не стесняйся создать "таблицу алиасов".

Код AS3:
private static const ALIASES:Object = { }
/* я неуверен, можно ли сразу создать значения из чисел прямо в определении, поэтому определю ниже */
{
ALIASES[65] = 37;
ALIASES[68] = 39;
ALIASES[87] = 38;
ALIASES[83] = 40;
};
private function isKeyDown(keyCode:int):Boolean{
//Все понятно, если кнопка зажата
if (_pressedKeys[keyCode]) return true;
//проверяем, есть ли такая кнопка в таблице алиасов. Если есть, то мы должны проверить ещё и её алиас
if (keyCode in ALIASES) return(_pressedKeys(ALIASES[keyCode]));
return false; //здесь если совсем ничего не зажато
}
Теперь тебе стоит работать только с клавишами 65, 68, 87 и 83. Запросив isKeyDown(65) метод вернёт истину, если нажата клавиша с кодом 65 или с кодом 37.
QA-секция:
Q: но ты совсем забыл про !gameMenuPaused условие! Я вставлю его сам.
A: конечно, отсюда не слишком понятна цель этого условия, но мне кажется, это чтобы персонаж не воспринимал кнопки во время паузы. Это неправильно представь ситуацию, что игрок зажал "вправо" и включил меню паузы, а потом отжал вправо. Убрав паузу игрок продолжит бежать вправо, потому что флаг правой клавиши не снялся как раз из за этого условия.
P.S. фигачил код прямо с форума, за работоспособность не ручаюсь.