Javascript 在画布上平滑地将对象从A移动到B
我正在尝试使用HTML画布和常规javascript将对象从点A平滑地移动到点B 点A是一组坐标 在这种情况下,点B是光标位置 到目前为止,我做了一个简单的介绍:Javascript 在画布上平滑地将对象从A移动到B,javascript,html,animation,canvas,Javascript,Html,Animation,Canvas,我正在尝试使用HTML画布和常规javascript将对象从点A平滑地移动到点B 点A是一组坐标 在这种情况下,点B是光标位置 到目前为止,我做了一个简单的介绍: while(sparket.mouseX>sparket.x&&sparket.mouseYsparket.x&&sparket.mouseY
while(sparket.mouseX>sparket.x&&sparket.mouseYsparket.x&&sparket.mouseY
从本质上说,我不知道要做什么,就是让while循环变慢(这样它看起来像是动画,而不是仅仅通过每次迭代来显示结果)
我也不知道如何防止圆弧复制,从而创建一条永久线,而不是看起来从点a移动到点b。这里的平滑动画实际上是确定循环每次迭代时对象移动的距离 这里涉及到一点数学,但也不算太糟 速度 在你的例子中,速度就是粒子在一段时间内沿任何给定方向运动的速度。如果希望粒子在4秒内以
200px
的速度移动,则速度将为50px/秒
有了这些信息,您可以轻松确定在给定任意时间长度的情况下移动(设置)粒子的像素数
pixels=pixelsPerSecond*seconds
知道要移动多少像素很好,但不能转换为单独的X和Y坐标。这就是向量的作用
载体
数学中的矢量是对方向和大小的测量。就我们的目的而言,这就像把速度和角度(47°)结合起来一样
向量的一个重要特性是,它可以分解为单独的X和Y分量(对于二维空间)
因此,如果我们想以50px/秒的速度以47°
的角度移动粒子,我们可以计算一个向量,如下所示:
function Vector(magnitude, angle){
var angleRadians = (angle * Math.PI) / 180;
this.magnitudeX = magnitude * Math.cos(angleRadians);
this.magnitudeY = magnitude * Math.sin(angleRadians);
}
var moveVector = new Vector(50, 47);
奇妙的是,这些值可以简单地添加到任意一组X和Y坐标中,根据速度计算移动它们
鼠标移动向量
以这种方式对对象进行建模还有一个额外的好处,那就是使事情变得美好,并且在数学上保持一致。粒子和鼠标之间的距离只是另一个向量
我们可以用更多的数学知识来计算距离和角度。还记得那个毕达哥拉斯吗?原来他很聪明
function distanceAndAngleBetweenTwoPoints(x1, y1, x2, y2){
var x = x2 - x1,
y = y2 - y1;
return {
// x^2 + y^2 = r^2
distance: Math.sqrt(x * x + y * y),
// convert from radians to degrees
angle: Math.atan2(y, x) * 180 / Math.PI
}
}
var mouseCoords = getMouseCoords();
var data = distanceAndAngleBetweenTwoPoints(particle.x, particle.y, mouse.x, mouse.y);
//Spread movement out over three seconds
var velocity = data.distance / 3;
var toMouseVector = new Vector(velocity, data.angle);
平滑动画
以一种不急促的方式在屏幕上制作动画意味着要执行以下操作:
尽可能快地运行动画循环
确定自上次以来经过了多少时间
根据经过的时间移动每个项目
重新粉刷屏幕
对于动画循环,我将使用API而不是setInterval
,因为它将具有更好的整体性能
清除屏幕
另外,当你重新绘制屏幕时,只需在整个屏幕上绘制一个大矩形,背景颜色为你想要的任何颜色,然后再重新绘制项目
ctx.globalCompositeOperation = "source-over";
ctx.fillStyle = "black";
ctx.fillRect(0, 0, canvas.width, canvas.height);
把它们放在一起
这里有一把小提琴演示了所有这些技术:这里的平滑动画实际上是关于确定在循环的每次迭代中移动对象的距离
这里涉及到一点数学,但也不算太糟
速度
在你的例子中,速度就是粒子在一段时间内沿任何给定方向运动的速度。如果希望粒子在4秒内以200px
的速度移动,则速度将为50px/秒
有了这些信息,您可以轻松确定在给定任意时间长度的情况下移动(设置)粒子的像素数
pixels=pixelsPerSecond*seconds
知道要移动多少像素很好,但不能转换为单独的X和Y坐标。这就是向量的作用
载体
数学中的矢量是对方向和大小的测量。就我们的目的而言,这就像把速度和角度(47°)结合起来一样
向量的一个重要特性是,它可以分解为单独的X和Y分量(对于二维空间)
因此,如果我们想以50px/秒的速度以47°
的角度移动粒子,我们可以计算一个向量,如下所示:
function Vector(magnitude, angle){
var angleRadians = (angle * Math.PI) / 180;
this.magnitudeX = magnitude * Math.cos(angleRadians);
this.magnitudeY = magnitude * Math.sin(angleRadians);
}
var moveVector = new Vector(50, 47);
奇妙的是,这些值可以简单地添加到任意一组X和Y坐标中,根据速度计算移动它们
鼠标移动向量
以这种方式对对象进行建模还有一个额外的好处,那就是使事情变得美好,并且在数学上保持一致。粒子和鼠标之间的距离只是另一个向量
我们可以用更多的数学知识来计算距离和角度。还记得那个毕达哥拉斯吗?原来他很聪明
function distanceAndAngleBetweenTwoPoints(x1, y1, x2, y2){
var x = x2 - x1,
y = y2 - y1;
return {
// x^2 + y^2 = r^2
distance: Math.sqrt(x * x + y * y),
// convert from radians to degrees
angle: Math.atan2(y, x) * 180 / Math.PI
}
}
var mouseCoords = getMouseCoords();
var data = distanceAndAngleBetweenTwoPoints(particle.x, particle.y, mouse.x, mouse.y);
//Spread movement out over three seconds
var velocity = data.distance / 3;
var toMouseVector = new Vector(velocity, data.angle);
平滑动画
以一种不急促的方式在屏幕上制作动画意味着要执行以下操作:
尽可能快地运行动画循环
确定自上次以来经过了多少时间
根据经过的时间移动每个项目
重新粉刷屏幕
为了