编辑:我误解了你的原始帖子。对于你的情况,你不需要清除先前的动画,只有当动画完成后才重新开始。
jsfiddle:http://jsfiddle.net/Grimbode/TCmrg/
以下是两个帮助我理解动画工作原理的网站。
http://www.williammalone.com/articles/create-html5-canvas-javascript-sprite-animation/
在这篇文章中,William谈到了精灵动画,当然这不是你感兴趣的。有趣的是,他使用了由Paul Irish创建的递归循环函数。
http://www.paulirish.com/2011/requestanimationframe-for-smart-animating/
这个函数会尝试每秒旋转60次(基本上是以60帧每秒的速度)。
(function() {
var lastTime = 0;
var vendors = ['webkit', 'moz'];
for(var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {
window.requestAnimationFrame = window[vendors[x]+'RequestAnimationFrame'];
window.cancelAnimationFrame =
window[vendors[x]+'CancelAnimationFrame'] || window[vendors[x]+'CancelRequestAnimationFrame'];
}
if (!window.requestAnimationFrame)
window.requestAnimationFrame = function(callback, element) {
var currTime = new Date().getTime();
var timeToCall = Math.max(0, 16 - (currTime - lastTime));
var id = window.setTimeout(function() { callback(currTime + timeToCall); },
timeToCall);
lastTime = currTime + timeToCall;
return id;
};
if (!window.cancelAnimationFrame)
window.cancelAnimationFrame = function(id) {
clearTimeout(id);
};
}());
所以大问题是,这是如何工作的?你基本上只需要这样做:
function gameLoop () {
window.requestAnimationFrame(gameLoop);
renderLine();
}
var counter = 0;
var old_position = {x: 0, y: 0};
var new_position = {x: 0, y: 0};
var width = 10;
var height = 10;
function renderLine(){
context.clearRect(old_position.x, old_position.y, width, height)
new_position = {x: 100, y: 200};
old_position = new_position;
}
在这一步之后,你的问题可能会是这样的:“好的,我有一些动画正在进行,但我不希望我的线条动画以60 fps旋转。”如果你读了威廉姆斯的文章,他使用“ticks”。
我链接的网站比我更好地解释了这个问题。我建议你阅读它们。[=我读它们很开心。
还有:这是你的jfiddle :)
http://jsfiddle.net/Grimbode/TCmrg/