给我写一个完整的动态粒子跟随的canvas代码
时间: 2024-05-04 20:21:18 浏览: 78
当然可以,以下是一个简单的动态粒子跟随的canvas代码示例:
```html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>动态粒子跟随的canvas</title>
<style>
canvas {
display: block;
margin: 0 auto;
}
</style>
</head>
<body>
<canvas id="canvas"></canvas>
<script>
const canvas = document.getElementById('canvas');
const ctx = canvas.getContext('2d');
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
class Particle {
constructor(x, y, radius, color) {
this.x = x;
this.y = y;
this.radius = radius;
this.color = color;
this.radians = Math.random() * Math.PI * 2;
this.velocity = 0.05;
this.distanceFromCenter = Math.random() * 100 + 50;
this.lastMouse = {
x: x,
y: y
};
}
draw(lastPoint) {
ctx.beginPath();
ctx.strokeStyle = this.color;
ctx.lineWidth = this.radius;
ctx.moveTo(lastPoint.x, lastPoint.y);
ctx.lineTo(this.x, this.y);
ctx.stroke();
ctx.closePath();
}
update(mouse) {
const lastPoint = {
x: this.x,
y: this.y
};
this.lastMouse.x += (mouse.x - this.lastMouse.x) * 0.05;
this.lastMouse.y += (mouse.y - this.lastMouse.y) * 0.05;
this.radians += this.velocity;
this.x = this.lastMouse.x + Math.cos(this.radians) * this.distanceFromCenter;
this.y = this.lastMouse.y + Math.sin(this.radians) * this.distanceFromCenter;
this.draw(lastPoint);
}
}
let particles = [];
function init() {
for (let i = 0; i < 50; i++) {
const radius = Math.random() * 2 + 1;
particles.push(new Particle(canvas.width / 2, canvas.height / 2, radius, '#fff'));
}
}
function animate() {
requestAnimationFrame(animate);
ctx.fillStyle = 'rgba(0, 0, 0, 0.05)';
ctx.fillRect(0, 0, canvas.width, canvas.height);
particles.forEach(particle => {
particle.update({
x: event.x,
y: event.y
});
});
}
init();
animate();
</script>
</body>
</html>
```
在这个示例中,我们首先定义了一个 `Particle` 类,它包含了粒子的坐标、半径、颜色、运动方向、速度等属性,以及 `draw` 和 `update` 方法。`draw` 方法用于绘制线段,`update` 方法则用于更新粒子的位置和状态。
然后我们通过一个循环生成了50个粒子,并将它们存储在一个数组中。在 `animate` 函数中,我们使用 `requestAnimationFrame` 方法来实现动画效果。首先我们清空画布,然后对每个粒子调用 `update` 方法,传入鼠标的位置作为参数。在 `update` 方法中,我们根据粒子与鼠标的距离和角度,计算出粒子的新坐标,并调用 `draw` 方法绘制线段。
最后,我们在页面加载完成后调用 `init` 和 `animate` 函数,即可看到动态粒子跟随的canvas效果。
阅读全文