Понимание этого явления требует базового понимания модели событий, на которой основан ввод с клавиатуры. В AS3 он работает иначе, чем в AS2.
Когда вы нажимаете клавишу, вызывается событие для вызова функции, но оно вызывается только один раз , когда клавиша нажата. Обработчики событий не проверяют, нажата ли клавиша. (Попробуйте добавить 5 к значению x / y вашего объекта вместо vx в функции onKeyDown; вы обнаружите, что ваш персонаж двигается только при нажатии клавиши, а не при ее удерживании.)
Аналогично, когда вы отпускаете клавишу, вызывается событие для вызова функции, но оно срабатывает только один раз, когда клавиша активно отпускается. Когда ключ просто сидит там, события не запускаются.
Опираясь на это ... вы можете найти источник вашей текущей проблемы?
function onKeyUp(event:KeyboardEvent):void
{
if (event.keyCode == Keyboard.LEFT || event.keyCode == Keyboard.RIGHT)
{
vx = 0;
}
else if (event.keyCode == Keyboard.DOWN || event.keyCode == Keyboard.UP)
{
vy = 0;
}
}
Если вы не нашли его, это этот блок.
if (event.keyCode == Keyboard.LEFT || event.keyCode == Keyboard.RIGHT)
{
vx = 0;
}
Это утверждение говорит вашей программе установить скорость равной нулю, если нажата правая или левая клавиши. Однако, поскольку Flash проверяет нажатие клавиши только при первом нажатии клавиши , удерживание клавиши не вызовет функцию onKeyDown. Следовательно, если вы держите левую и правую стороны и отпускаете одну, вы устанавливаете скорость на ноль.
У Кори здесь есть логическое решение, и есть несколько других причин, по которым вы хотите использовать переключенное логическое значение для проверки ввода с клавиатуры (основная причина в том, что вы не получите никакой задержки при повторении).
Надеюсь, этот ответ немного прояснил его - немного знаний может привести к великим вещам. Удачи.