1

Я использую window.requestAnimationFrame для создания игрового цикла.addEventListener с requestAnimationFrame

Все работает отлично, но когда я пытаюсь добавить слушателя событий, он срабатывает сотни раз очень быстро.

Я пробовал использовать закрытие, но это, похоже, не работает.

game.update = function(){ 
    //code that runs every frame 
    window.addEventListener('keydown', function(){ 
     console.log("message"); 
    },false); 
} 

Я хочу, чтобы вызвать функцию РАЗ на KeyDown событие не несколько раз.

+0

* «Я хочу вызвать функцию ONCE в событии keydown не многократно». * Затем вам нужно отпереть функцию после ее вызова. Почему вы все равно привязываете обработчик событий внутри цикла? Почему не на улице? Вы хотите, чтобы обработчик выполнялся один раз за кадр? Пожалуйста, объясните, какую проблему вы пытаетесь решить. –

+0

Вам нужно добавить прослушивателей событий один раз, а не внутри цикла обновления. Ваш цикл обновления должен только добавлять прослушиватели событий к объектам, которые он создает при их создании. –

+0

Просто не запускайте этот код внутри функции, которая запускается каждый кадр –

ответ

0

Слушатель событий добавляется только в том случае, если добавлен новый прослушиватель. Добавление таких же слушателей более одного раза no effectby design.

Переместите функцию слушателя из функции вы присваивающей к game.update так, что новая копия слушателя не будет создаваться каждый раз, когда вы звоните addEventListener():

var updateListener = function() { 
    console.log('message'); 
}; 

game.update = function() { 
    //code that runs every frame 
    window.addEventListener('keydown', updateListener, false); 
}; 
+0

Хорошо, что сработало. Это просто сделано, потому что почему-то бросить его в петлю. – CriticalTheWizard

0

Может быть, немного поздно, но это не имеет для меня никакого смысла. Слушатель не должен быть добавлен в RAF. Если вы поместите его снаружи и присвоите результат обработчику переменной, тогда RAF получит результат и очистит переменную, у вас будет как более высокая, так и стабильная/прогнозируемая производительность. Это становится очевидным для подобных задач, таких как использование прослушивателей ориентации устройства для ввода контроллера на мобильном устройстве. События не нужно зацикливать. Установите его один раз, он будет срабатывать один раз при каждом нажатии клавиши. RAF следует использовать только для обновления графики. Любая другая логика должна быть вне его. Например, движение и игровая механика должны быть в setInterval, указывая свои результаты на переменные и объекты снаружи, но доступные для RAF. RAF должен только подбирать новые значения позиции и устанавливать преобразования. Затем он будет работать более плавно, и «время» не будет ускоряться или замедляться и быть последовательным на разных устройствах, независимо от частоты кадров.

Смежные вопросы