【发布时间】:2021-09-28 08:32:36
【问题描述】:
我正在尝试使用 javascript/canvas 创建一个矩形在屏幕上向下移动的动画。
我遇到的问题是它移动了矩形,但在它后面留下了一条轨迹,而不是仅仅移动矩形。 (小提琴:https://jsfiddle.net/winterswebs/hmgfwp9z/116/)
如何在不留下痕迹的情况下为对象设置动画?
let v = {
movingObjects: [{
path: new Path2D(),
y: 0,
img: {
width: 100,
height: 100,
}
}],
animationTime: 0,
lastFrameTime: 0,
testingCountOut: 0,
}
const canvas = document.querySelector("#canvas");
const ctx = canvas.getContext("2d");
canvas.width = 400;
canvas.height = 400;
function loop() {
//if (v.testingCountOut >= 10) return;
let now = Date.now();
let delta = v.lastFrameTime == 0 ? 0 : (now - v.lastFrameTime) / 1000;
v.lastFrameTime = now;
draw(delta);
//v.testingCountOut++;
requestAnimationFrame(loop);
}
function draw(delta) {
ctx.clearRect(0, 0, canvas.width, canvas.height);
v.animationTime = Number(v.animationTime) + Number(delta);
let movingObjVY = 100;
let movingObjYPos = v.animationTime * movingObjVY;
v.movingObjects.forEach((element, index) => {
ctx.save();
ctx.beginPath();
v.movingObjects[index].path.rect(
10,
element.y + movingObjYPos,
element.img.width,
element.img.height
);
ctx.fillStyle = "rgba(255,255,255,0.5)";
ctx.fill(v.movingObjects[index].path);
//ctx.strokeStyle = "rgba(0,0,0,1)";
//ctx.stroke(v.movingObjects[index].path);
ctx.restore();
});
}
loop();
body {
background-color: #777;
}
#canvas {
border: 1px solid #000;
}
<canvas id="canvas"></canvas>
【问题讨论】:
-
您对那个
path对象的使用真的很奇怪,而且您的问题的根源 - 您在每次迭代时向您绘制的路径添加一个新矩形。为什么你甚至存储路径而不是简单地在每个draw上创建一个新矩形? -
是的...我同意这有点奇怪;我希望它存储起来,以便我可以结合 isPointInPath (developer.mozilla.org/en-US/docs/Web/API/…) 引用它以进行碰撞检测
标签: javascript canvas requestanimationframe