Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 21.08.2014, 14:55
Интересующийся
Отправить личное сообщение для Straj Посмотреть профиль Найти все сообщения от Straj
 
Регистрация: 05.08.2014
Сообщений: 16

requestAnimationFrame или setInterval
Змейка. Допустим мне надо сделать что бы она двигалась на 2 клетки в секунду. Щас у меня есть основной цикл через requestANimationFrame.

Нужно ли мне делать это перемещение c пом. переменной, которая итерируется каждый тик цикла, и при значении кратном 30 (60 кадров в секунду = 1 клетка каждые 30 кадров), запускалась функция движения. Или вместо реквестФрейма, мутить через setInterval? Какие подводные камни?

Последний раз редактировалось Straj, 21.08.2014 в 16:15.
Ответить с цитированием
  #2 (permalink)  
Старый 21.08.2014, 15:05
Аватар для ixth
Профессор
Отправить личное сообщение для ixth Посмотреть профиль Найти все сообщения от ixth
 
Регистрация: 19.01.2010
Сообщений: 354

Ничего из сказанного не понял.

Через setInterval меняй положение змейки. Через requestAnimationFrame — обновляй canvas.
Ответить с цитированием
  #3 (permalink)  
Старый 21.08.2014, 15:25
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

ixth,
Лучше через setTimeout эмулировать setInterval, тогда вызовы будут идти с более равными промежутками времени
Ответить с цитированием
  #4 (permalink)  
Старый 21.08.2014, 15:48
Аватар для ixth
Профессор
Отправить личное сообщение для ixth Посмотреть профиль Найти все сообщения от ixth
 
Регистрация: 19.01.2010
Сообщений: 354

Если честно, ни разу не сталкивался с проблемами, используя setInterval.
Ответить с цитированием
  #5 (permalink)  
Старый 21.08.2014, 15:56
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

А я сталкивался
Ответить с цитированием
  #6 (permalink)  
Старый 21.08.2014, 16:33
Интересующийся
Отправить личное сообщение для Straj Посмотреть профиль Найти все сообщения от Straj
 
Регистрация: 05.08.2014
Сообщений: 16

Подредактировал описание, возможно не совсем точно выразился.
Но ваш ответ подходит.

Т.е. мне в цикле
function loop () {
	requestAnimationFrame(loop);
	//...	
}


Нужно добавить таймер setInterval, который при срабатывании будет вызывать обновление змейки?
Ответить с цитированием
  #7 (permalink)  
Старый 21.08.2014, 16:37
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

Straj, в змейке наверно проблем не будет с интервалом, но в дальнейшем во избежания багов рекомендую пользваться таймаутом.
http://learn.javascript.ru/settimeout-setinterval
Ответить с цитированием
  #8 (permalink)  
Старый 21.08.2014, 17:12
Интересующийся
Отправить личное сообщение для Straj Посмотреть профиль Найти все сообщения от Straj
 
Регистрация: 05.08.2014
Сообщений: 16

Сообщение от tsigel Посмотреть сообщение
Straj, в змейке наверно проблем не будет с интервалом, но в дальнейшем во избежания багов рекомендую пользваться таймаутом.
http://learn.javascript.ru/settimeout-setinterval
Понял, спасибо. Просто я пока прототип сделать пытаюсь, так что с оптимизацией не сильно заморачиваюсь. На будущее учту.
Ответить с цитированием
  #9 (permalink)  
Старый 21.08.2014, 18:39
Аватар для MallSerg
Профессор
Отправить личное сообщение для MallSerg Посмотреть профиль Найти все сообщения от MallSerg
 
Регистрация: 07.03.2011
Сообщений: 1,127

Вообще не рекомендую пользоваться таймаутами в любом виде это лишние события лишние функции да и как правило гораздо больше бесполезных вычислений и изменений которые пользователь никогда не увидит лучше и проще привязываться к времени начала анимации и момент вызова requestAnimationFrame вычислять разницу между текущем временем и временем начала анимации.
Ответить с цитированием
  #10 (permalink)  
Старый 21.08.2014, 19:11
Аватар для MallSerg
Профессор
Отправить личное сообщение для MallSerg Посмотреть профиль Найти все сообщения от MallSerg
 
Регистрация: 07.03.2011
Сообщений: 1,127

Небольшой примерчик
<div id="moved" style="position: absolute;width:30px;height: 30px;background: red;"></div>
    <br>
    <input type="button" onclick="but1()" value="кнопка 1"> <br>
    <input type="button" onclick="but2()" value="кнопка 2">
    <script type="text/javascript">
var RequestAnimationFrame = requestAnimationFrame || mozRequestAnimationFrame || webkitRequestAnimationFrame || msRequestAnimationFrame;
function but1 (){
    var element = document.getElementById("moved");
    animateMove( element , 800 , 100 , 1500 , function () {
        animateMove( element , -750 , 10 , 200 ,function (){
            animateMove( element , 150 , -60 , 1000 ,function (){
                element.style.background = ("#" + ( Math.random() * (999-100)+100 )).substr(0,4) ;
                element.style.top = "30px";
                element.style.left = "100px";
            })
        })
    })
}
function but2 (){
    var element = document.getElementById("moved");
    var animation = animateMove( element , 100 , 0 , 10000 );
    element.onclick = function () {
        animation.time = 1;
        animation.onFinish = null;
    };
    animation.onFinish = function (){
        animateMove( element , -100 , 50 , 5000 );
        element.onclick = null;
    };
}
function animateMove ( element , x , y , time ,callBack){
    var j = animateMove;
    j.time = time || 1000;
    j.x = x;
    j.y = y;
    j.statX = element.offsetLeft;
    j.startY = element.offsetTop;
    j.onFinish = callBack;
    j.animate = function (){
        if ( j.startTime == undefined ){ j.startTime = new Date().getTime() }
	    var Time = new Date().getTime();
        var EA =  ( (Time - j.startTime) || 1 )/j.time;
        if ( EA < 1) {
            element.style.left = j.statX + (j.x * EA) + "px";
            element.style.top = j.startY + (j.y * EA) + "px";
            RequestAnimationFrame(j.animate );
        }else{
            delete j.startTime;
            j.onFinish? j.onFinish():0;
        }
	};
    j.animate();
    return j;
}
</script>
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
SetInterval в MVC! Важно! espltd AJAX и COMET 3 08.04.2014 12:49
Javascript чат-бот FanAizu Общие вопросы Javascript 5 30.01.2014 03:00
подключать jquery-ui.custom.js или jquery-ui.custom.min.js? Faab jQuery 4 11.10.2013 20:53
В зависимости от referrer выводить рекламу adsene или зорьки wlad2 Общие вопросы Javascript 12 19.12.2010 01:02
Проблема в document.write при использовании setInterval() GOll Общие вопросы Javascript 21 06.10.2008 17:38