2025-02-08
web
00
请注意,本文编写于 67 天前,最后修改于 67 天前,其中某些信息可能已经过时。

canvas 实现粒子效果案例~

html
<html> <head> </head> <body> <canvas id="canvas"></canvas> <script> class Vector2 { constructor(x, y) { this.x = x; this.y = y; } set(x, y) { this.x = x; this.y = y; return this; } clone() { return new Vector2(this.x, this.y); } add(v) { this.x += v.x; this.y += v.y; return this; } sub(v) { this.x -= v.x; this.y -= v.y; return this; } mult(v) { this.x *= v.x; this.y *= v.y; return this; } magnitude() { return Math.sqrt(this.x * this.x + this.y * this.y); } setFromScalarAngle(scalar, angle) { this.x = Math.cos(angle) * scalar; this.y = Math.sin(angle) * scalar; } } class Particle { constructor(canvas, x, y, scalar, direction, radius, color) { this.canvas = canvas; this.position = new Vector2(x, y); this.velocity = new Vector2(); this.velocity.setFromScalarAngle(scalar, direction); this.radius = radius; this.color = color; this.range = 100; } update() { this.position.add(this.velocity); if (this.position.x - this.range > this.canvas.width) { this.position.x = this.canvas.width / 2; this.position.y = this.canvas.height / 2; } if (this.position.x + this.range < 0) { this.position.x = this.canvas.width / 2; this.position.y = this.canvas.height / 2; } if (this.position.y - this.range > this.canvas.height) { this.position.x = this.canvas.width / 2; this.position.y = this.canvas.height / 2; } if (this.position.y + this.range < 0) { this.position.x = this.canvas.width / 2; this.position.y = this.canvas.height / 2; } } } window.onload = function () { var canvas = document.getElementById("canvas"), ctx = canvas.getContext("2d"), width = (canvas.width = window.innerWidth), height = (canvas.height = window.innerHeight), particles = [], particleNum = 100, colors = [ "#0952BD", "#A5BFF0", "#118CD6", "#1AAEE8", "#F2E8C9", ]; window.onresize = () => { width = canvas.width = window.innerWidth; height = canvas.height = window.innerHeight; }; function randomIntFromRange(min, max) { return Math.floor(Math.random() * (max - min + 1) + min); } function randomColor(colors) { return colors[Math.floor(Math.random() * colors.length)]; } for (let i = 0; i < particleNum; i++) { particles.push( new Particle( canvas, canvas.width / 2, canvas.height / 2, Math.random() * 8 + 2, Math.random() * Math.PI * 2, randomIntFromRange(5, 7), randomColor(colors), ), ); } function draw() { for (let i = 0; i < particleNum; i++) { var p = particles[i]; p.update(); ctx.save(); ctx.beginPath(); ctx.arc( p.position.x, p.position.y, p.radius, 0, Math.PI * 2, ); ctx.shadowColor = p.color; ctx.shadowBlur = 5; ctx.shadowOffsetX = 0; ctx.shadowOffsetY = 0; ctx.globalAlpha = "1"; ctx.fillStyle = p.color; ctx.fill(); ctx.restore(); } } render(); function render() { ctx.fillStyle = "hsla(260,40%,5%,.2)"; ctx.fillRect(0, 0, width, height); draw(); requestAnimationFrame(render); } }; </script> </body> </html>
如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay

本文作者:42tr

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!