ActionScript 3 эквивалент KeyboardEvent.Repeat - PullRequest
0 голосов
/ 28 октября 2018

Я очень начинающий, когда дело доходит до программирования; Я делаю флэш-игру для своего класса 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 Ответ

0 голосов
/ 29 октября 2018

Полагаю, это было бы как-то само собой разумеющимся.

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;
    }
}
...