ActionScript 3 эквивалент KeyboardEvent.Repeat
Я очень начинающий, когда дело доходит до программирования; Я делаю флэш-игру для своего класса 2D-игр на Adobe Animator, и у меня возникли сомнения по поводу кода, который мой преподаватель не мог ответить сам. Короче говоря, я хочу, чтобы скорость персонажа увеличивалась в зависимости от того, как долго была нажата клавиша, поэтому я придумал это:
spdX = spdX + aclMov*(tempo) - aclFrc*(tempo);
Где переменная темп будет увеличиваться, пока удерживается клавиша, и я бы проверил, если это с KeyboardEvent.repeat, как в:
if(heldDown){while(heldDown){tempo += 1}}
else{tempo = 0}
spdX = spdX + aclMov*(tempo) - aclFrc*(tempo);
Однако, когда я пытаюсь сделать это, вывод отвечает " Свойство повтора не найдено на flash.events.KeyboardEvent, и значение по умолчанию отсутствует ". Я предполагаю, что это потому, что KeyboardEvent.repeat не определен в среде, которую я использую. Могу ли я в любом случае воспроизвести тот же эффект KeyboardEvent.repeat, возможно, создав функцию, которая имитирует то, что она сделала бы?
Заранее спасибо.
(Изменить 1)
Я начинаю извиняться за свою нехватку разъяснений, а также за свое невежество в этой теме, поскольку я едва начинающий, когда дело доходит до as3, и еще не представлен должным образом во многих терминах, которые я прочитал.
Итак, благодаря содержательному вкладу комментариев, я уже получил представление о том, какой обходной путь мне нужно будет сделать, чтобы заменить KeyboardEvent.repeat. Есть и другие части кода, имеющие отношение к проблеме, а также:
stage.addEventListener(KeyboardEvent.KEY_DOWN,pressKey)
function pressKey (Event){
(...)
if(Event.keyCode == (Keyboard.A)) {left = true;}
(...)
}
stage.addEventListener(KeyboardEvent.KEY_UP,releaseKey)
function releaseKey (Event){
(...)
if(Event.keyCode == (Keyboard.A)) {left = false;}
(...)
}
Вот как должен был идти код. Было предложено использовать метод getTimer() для записи момента, когда происходит событие KEY_DOWN, и останавливается, когда KEY_UP вступает в силу. Проблема в том, как я могу увеличить код, чтобы он различал эти два события, и, в частности, как я могу адаптировать событие ENTER_FRAME, чтобы дифференцирование между ними все еще работало с ним? Вот наиболее важные части этого, кстати:
addEventListener(Event.ENTER_FRAME,walk);
function walk(Event) {
if(left) {
(...)
char.x -= spdX;
(...)
}
Я предполагаю, что код работал до сих пор, потому что, поскольку состояние "left" постоянно переключалось между "true" и "false", условие if неоднократно выполнялось, что приводило к перемещению символа. Однако, если я попытаюсь сделать так, чтобы условие зависело от того, что "left" остается "true" в течение определенного времени, код становится несовместимым с самим собой.
Короче говоря, это ставит вопрос о том, как адаптировать прослушиватели событий "KEY_[]" и функцию "ходьбы" для работы при использовании метода getTimer() для совместной работы.
Еще раз спасибо заранее.
1 ответ
Я считаю, что это будет как-то само за себя.
stage.addEventListener(KeyboardEvent.KEY_DOWN, onDown);
stage.addEventListener(KeyboardEvent.KEY_UP, onUp);
addEventListener(Event.ENTER_FRAME, onFrame);
var pressedKeyA:int;
// Never name variables and arguments with the same name
// as existing classes, however convenient that might seem.
function onDown(e:KeyboardEvent):void
{
if (e.keyCode == Keyboard.A)
{
// Let's record the moment it was pressed.
pressedKeyA = getTimer();
}
}
function onUp(e:KeyboardEvent):void
{
if (e.keyCode == Keyboard.A)
{
// Mark the key as not pressed.
pressedKeyA = 0;
}
}
function onFrame(e:Event):void
{
// It is true if it is not 0.
if (pressedKeyA)
{
// That's how long it has been pressed. In milliseconds.
var pressedFor:int = getTimer() - pressedKeyA;
// Change the position with regard to it.
// For example 1 base + 1 per second.
char.x -= 1 + pressedFor / 1000;
}
}