Кстати во всех подобных реализациях движения по диагонали не учитывается общий модуль скорости. Если при такой реализации двигаться по диагонали, то движение по модулю будет быстрее, чем движение (по модулю) по каждой из осей в отдельности. По отдельным осям скорость будет
SPEED, а по диагонали будет
корень из двух на SPEED
Поэтому нужно заиметь константу SPEED_MAGNITUDE, и по ней вычислять ONE_AXIS_SPEED_MAGNITUDE, которая будет равна SPEED_MAGNITUDE * корень из двух делить на два. Если движемся по диагонали, двигаем обе координаты со скоростью ONE_AXIS_SPEED_MAGNITUDE, а если горизонтально или вертикально, то со скоростью SPEED_MAGNITUDE
Потом проверять, нажаты ли обе кнопки, и проверять простым перебором (да, это долго) все варианты нажатий. И еще можно проверять через atan2 куда двигать.
У меня где-то был готовый код, скину если найду
===UPDATE===
Нашел код, только он немного не на AS3, но рабочий
Оказывается устанавливается скорость по горизонтали, а диагональная вычисляется по формуле

Код AS3:
speedDiag = Math.sqrt(SPEED * SPEED / 2);
Но это не критично

Код AS3:
if (FlxG.keyboard.pressed("DOWN", "S"))
{
if (FlxG.keyboard.pressed("LEFT", "A"))
{
newLocX = x - speedDiag;
newLocY = y + speedDiag;
angle = 135;
}
else
{
if (FlxG.keyboard.pressed("RIGHT", "D"))
{
newLocX = x + speedDiag;
newLocY = y + speedDiag;
angle = 45;
}
else
{
newLocY = y + SPEED;
angle = 90;
}
}
}
else
{
if (FlxG.keyboard.pressed("UP", "W"))
{
if (FlxG.keyboard.pressed("LEFT", "A"))
{
newLocX = x - speedDiag;
newLocY = y - speedDiag;
angle = -135;
}
else
{
if (FlxG.keyboard.pressed("RIGHT", "D"))
{
newLocX = x + speedDiag;
newLocY = y - speedDiag;
angle = -45;
}
else
{
newLocY = y - SPEED;
angle = -90;
}
}
}
else
{
if (FlxG.keyboard.pressed("LEFT", "A"))
{
newLocX = x - SPEED;
angle = -180;
}
else if (FlxG.keyboard.pressed("RIGHT", "D"))
{
newLocX = x + SPEED;
angle = 0;
}
}
}
Еще можно делать простые условия а-ля какая кнопка нажата и вычислять atan2 по значениям нажатых кнопок (допустим, если нажата кнопка ВЛЕВО и ВВЕРХ, то x и y будут равны -1 1 соответственно) Но я почему-то отказался потом от этого метода (не помню почему, но видимо была причина)