Я пытаюсь изучить JavaScript, и мне интересно, есть ли в JavaScript прослушиватель событий, такой как ENTER_FRAME в ActionScript. По сути, я хочу, чтобы этот прослушиватель событий прослушивал «все время», а не просто ждал какого-либо конкретного экземпляра (щелчок мыши, событие клавиатуры) события.
Версия JavaScript события ActionScript Event.ENTER_FRAME?
- да, в DOM браузера нет такой вещи, как фрейм, поэтому javascript нечего слушать. Обратитесь к правильным ответам ниже. 07.07.2011
Ответы:
Вы ищете setInterval(func, time)
. Если заставить его работать как ENTER_FRAME, время будет очень маленьким. Итак, если вы хотите имитировать частоту кадров, скажем, 30 раз в секунду:
// you will need to make sure you have good scoping around the function param.
setInterval(function(){console.log('enterframe')}, 33)
// 33 is about 1000 milliseconds / 30.
На самом деле, setInterval
есть и во Flash -- flash.utils.setInterval
.
В качестве примечания: к сожалению, setInterval
(как во Flash, так и в JS) может работать против собственной частоты обновления. Во Flash ENTER_FRAME избегает этого - вы выполняете рендеринг, когда swf повторно рендерится. В браузере setInterval
просто так не получится.
Это, вероятно, тоже стоит посмотреть: http://paulirish.com/2011/requestanimationframe-for-smart-animating/
HTML5 предоставляет доступ к requestAnimationFrame()
<canvas id="canvas" width="400" height="400"></canvas>
<script>
window.onload = function () {
var canvas = document.getElementById('canvas'),
context = canvas.getContext('2d'),
var counter = 0;
(function drawFrame () {
window.requestAnimationFrame(drawFrame, canvas);
context.clearRect(0, 0, canvas.width, canvas.height);
console.log(counter++);
// animation code goes here
}());
};
</script>
Кредит принадлежит Киту Питерсу за помощь в этом. Очень рекомендую его книгу «Анимация HTML5 с Javascript» от FriendsOfEd: http://www.apress.com/9781430236658
Я все еще учусь конвертировать AS3 в JavaScript, но не будет ли это этой функцией:
createjs.Ticker.addEventListener("tick", gameLoop);
gameLoop
— это пользовательская функция, которая будет вызываться при каждом «тике».
Посмотрите этот полезный пример написания игры в Adobe Animate CC с использованием JavaScript вместо AS3: https://software.intel.com/en-us/html5/hub/blogs/flash-cc-to-html5
Неа. Не совсем. Хорошей заменой будет setInterval
или setTimeout
:
function doAllTheTime() { }
function wrapper() {
doAllTheTime();
setTimeout(wrapper, 40);
}
wrapper();
Но даже в этом случае вы довольно ограничены, потому что у вас нет доступа ни к одному из свойств объекта события.