(我是 Javascript/HTML/CSS 编码的新手,所以请原谅我糟糕的风格!)
我想以静态速度沿该数组中的一组坐标为数组中的对象设置动画:
数组示例:
_myPtArr = [{x:297, y:30},{x:299,y:47},{x:350,y:56},{x:305,y:176},{x:278,y:169},
{x:303,y:108},{x:269,y:79},{x:182,y:90},{x:137,y:81},{x:173,y:33},{x:231,y:38}];
我所做的是;创建一个在程序开始时运行的函数以接收任何数组,并将距离属性(名为“dis”)添加到它计算距离的两个点中的第一个点,如下所示:
function findDist(array) {
for (var i = 0; i<array.length-1;i++){
var p = array[i],
q = array[i+1],
dx = p.x - q.x,
dy = p.y - q.y,
dist = Math.sqrt(dx*dx + dy*dy);
array[i].dis=dist;
}
}
我这样做是因为我为它们设置动画的方式是创建一个名为“_tick”的变量,它将通过从 0 到 1 递增将它们从一个点移动到另一个点,0 是起点,1 是终点。我打算将刻度乘以距离,以便不同的线条长度以相同的速度进行动画处理。但我还没有得到这样的工作!我被困住了!这是我刚才所说的功能:
function calculateInnerPts(pts, pos){
var ptArr = [];
console.log(pts.length);
for(var i = 0; i < pts.length-1; i++){
ptArr[i] = {x: pts[i].x + (pts[i+1].x - pts[i].x) * pos, y: pts[i].y +
(pts[i+1].y - pts[i].y) * pos};
}
return ptArr;
}
在这样的系列中被调用:
在 enterFrameHandler (不断迭代)中,“section”只是递增以获取每组 2 个点/对象,所以在 _tick 达到“1”之后,section++。:
ballAnim([_myPtArr[_section],_myPtArr[_section+1]],_tick);
然后在外面:
function ballAnim(pts,pos){
var iPts = pts;
for(var i = 0; i < pts.length-1; i++){
iPts = calculateInnerPts(iPts, pos);
}
drawBall(iPts[0]);
}
最后,我画了一个球:
function drawBall(pts){
var w = 6,
h = 2;
ctx.clearRect(0,0,400,300);
ctx.beginPath();
ctx.arc(pts.x, pts.y, 5, 0, Math.PI * 2);
ctx.fillStyle="blue";
ctx.fill();
ctx.strokeStyle="black";
ctx.closePath();
ctx.stroke();
}
鉴于这个系统,或者甚至是实现相同效果的另一种更好的方法,任何人都可以阐明我如何实现这一点吗?我想放入任何数组并获得相同的结果(意味着球以静态速度动画)!
注意:除了普通的 Javascript/HTML/CSS,我不想使用任何东西;没有API!
非常感谢大家,这个社区太棒了,这是我的第一篇文章,所以放轻松!XD