Ну суть бага в том, что у Вас в приемнике Фрэйма стоит порядок движения, т.е если у Вас нажата кнопочка, которая раньше зарегистрирована, то это движение из двух, трех, четырех он выберет.
Т.е. Если нажата Вверх и вниз - пойдет вверх, влево и вниз - пойдет влево.
Т.е приоритеты :
1. up
2. left
3. down
4. right
Приоритет определяет направление, чем ниже он - туда и будет двигаться. А почему происходит поворот? Потому что рассылка события заходит в приемник keyPressedListener и делает поворот.
Исправить этот баг - просто, просто нужно обнулять переменные ненужных нам направлений в приемнике:

Код AS3:
private function keyPressedListener(e:KeyboardEvent){
var key:uint=e.keyCode;
if(key==87||key==38){//W or UP key
this.gotoAndPlay("goUp");
moveUp = true;
moveRight=false;
moveDown = false;
moveLeft=false;
}else if(key==65||key==37){//A or LEFT key
this.gotoAndPlay("goLeft");
moveLeft = true;
moveUp = false;
moveRight=false;
moveDown=false;
}else if(key==83||key==40){//S or DOWN key
this.gotoAndPlay("goDown");
moveDown = true;
moveUp = false;
moveRight=false;
moveLeft=false;
return;
}else if(key==68||key==39){//D or RIGHT
this.gotoAndPlay("goRight");
moveRight = true;
moveUp = false;
moveDown=false;
moveLeft=false;
}
}
Если же Вы хотите, чтобы после отпускания одной из двух клавиш Ваш персонаж продолжал движение, то Вам придется завести что-то типа переменной приоритета и менять при получении события, т.е где я менял значения переменных, там обновлять этот приоритет при получении событий, а в приемнике фрейма отталкиваться от значений :
1. Нажата ли кнопочка?
2. Если нажата, то проверять приоритет.
