2015-05-17 4 views
3

Обратитесь к этой скрипке - http://jsfiddle.net/rnqLfz14/28/Почему cancelAnimationFrame не работает?

[Этот код не мой - http://www.isaacsukin.com/news/2015/01/detailed-explanation-javascript-game-loops-and-timing]

//.... 

function stop() { 
    running = false; 
    started = false; 
    cancelAnimationFrame(frameID); 
} 

//... 

function mainLoop(timestamp) { 
    // Throttle the frame rate. 
    if (timestamp < lastFrameTimeMs + (1000/maxFPS)) { 
     frameID = requestAnimationFrame(mainLoop); 
     return; 
    } 
    delta += timestamp - lastFrameTimeMs; 
    lastFrameTimeMs = timestamp; 

    begin(timestamp, delta); 

    if (timestamp > lastFpsUpdate + 1000) { 
     fps = 0.25 * framesThisSecond + 0.75 * fps; 

     lastFpsUpdate = timestamp; 
     framesThisSecond = 0; 
    } 
    framesThisSecond++; 

    var numUpdateSteps = 0; 
    while (delta >= timestep) { 
     update(timestep); 
     delta -= timestep; 
     if (++numUpdateSteps >= 240) { 
      panic(); 
      break; 
     } 
    } 

    draw(delta/timestep); 

    T.textContent = timestamp; 

    if (timestamp >= 6000.0) { 
     T.textContent = "Stopped!"; 
     stop(); 
    } 

    end(fps); 

    frameID = requestAnimationFrame(mainLoop); 
} 
//... 

Функция cancelAnimationFrame не останавливает цикл животворящего. Есть предложения? Я поцарапал себе голову над ним в течение долгого времени, пожалуйста, любые предложения будут оценены.

+2

Похоже, вы назвали бы 'requestAnimationFrame (MainLoop);' так или иначе, в конце 'mainLoop'. – Teemu

+0

Да ... Мой плохой ... Также создатель кода не думал об этом? –

+0

Я чуть не взорвал свои мозги. Ответ довольно хорош! –

ответ

7

Когда условие для stop() выполнено, вызывается stop(), но код продолжает работу, так что будет запрошен новый rAF.

Просто добавьте возврат после остановки вызова, чтобы этого не происходит (или используйте else):

... 
if (timestamp >= 6000.0) { 
    T.textContent = "Stopped!"; 
    stop(); // stop() is just a sub-routine here and will continue after being called 
    return; // <--- here 
} 
... 

Modified fiddle

+0

Спасибо! Также вы можете предположить, что базовая структура этого кода хороша для создания игр? Мой код несколько основан на этом, по крайней мере, на принципе. –

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

  • Нет связанных вопросов^_^