我正在尝试将一个图像从右边移到中间,我不确定这是否是最好的方法。
var imgTag = null;
var x = 0;
var y = 0;
var id;
function doCanvas()
{
var canvas = document.getElementById('icanvas');
var ctx = canvas.getContext("2d");
var imgBkg = document.getElementById('imgBkg');
imgTag = document.getElementById('imgTag');
ctx.drawImage(imgBkg, 0, 0);
x = canvas.width;
y = 40;
id = setInterval(moveImg, 0.25);
}
function moveImg()
{
if(x <= 250)
clearInterval(id);
var canvas = document.getElementById('icanvas');
var ctx = canvas.getContext("2d");
ctx.clearRect(0, 0, canvas.width, canvas.height);
var imgBkg = document.getElementById('imgBkg');
ctx.drawImage(imgBkg, 0, 0);
ctx.drawImage(imgTag, x, y);
x = x - 1;
}
有什么建议吗?
5条答案
按热度按时间0g0grzrc1#
这个问题已经有5年的历史了,但既然我们现在有了
requestAnimationFrame()
方法,这里有一个使用vanilla JavaScript的方法:0aydgbwb2#
drawImage()
允许定义在目标画布上绘制源图像的哪一部分。我建议为每个moveImg()
计算前一个图像的位置,用imgBkg
的那一部分覆盖前一个图像,然后绘制新图像。假设这将保存一些计算能力。elcex8rz3#
这就是我的答案。
m0rkklqb4#
对于无滞后动画,我通常使用kinetic.js。
如果你想看的话,这里有个例子。
http://www.html5canvastutorials.com/kineticjs/html5-canvas-kineticjs-animate-position-tutorial/
我建议这样做的原因是,setInterval或setTimeout是一个特殊的函数,当大量的动画同时发生时会引起问题,但是动态的。动画处理帧率更智能。
tyky79it5#
用示例解释
window.requestAnimationFrame()
在下面的代码片段中,我将使用一个图像作为将要设置动画的部分。
老实说......
window.requestAnimationFrame()
对我来说并不容易理解,这就是为什么我尽可能清晰直观地编写它,这样你就可以比我更容易理解它。在**start()**函数中,我们有:
这也可以写成:
window.requestAnimationFrame(gameLoop);
,它可能会工作,但我添加的brickImage.onload
,以确保图像已加载第一。如果没有,它可能会导致一些问题。window.requestAnimationFrame()
通常每秒循环60次。