simplex-noise实现canvas闪电交互动画效果代码
代码语言:html
所属分类:动画
代码描述:simplex-noise实现canvas闪电交互动画效果代码
代码标签: simplex-noise canvas 闪电 交互 动画
下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开
<!DOCTYPE html> <html lang="en" > <head> <meta charset="UTF-8"> <style> body { font-family: Helvetica sans-serif; padding: 0; margin: 0; background-color: #222; overflow: hidden; -webkit-user-select: none; -moz-user-select: none; -o-user-select: none; -ms-user-select: none; user-select: none; } canvas { position: absolute; top: 0; left: 0; } </style> </head> <body > <canvas id='c'></canvas> <script type="text/javascript" src="//repo.bfw.wiki/bfwrepo/js/simplex-noise.js"></script> <script> /** * requestAnimationFrame */ window.requestAnimationFrame = function () { return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || function (callback) {window.setTimeout(callback, 1000 / 60);}; }(); /** * Lightning */ var Lightning = function (window) { /** * LightningAbstract */ var LightningAbstract = { points: null, children: null, _simplexNoise: new SimplexNoise(), render: function (ctx, controls) { this._update(controls); this._draw(ctx); }, _update: function (controls) { throw new Error('Not override'); }, _draw: function (ctx) { var points = this.points, isRoot = false,opts, p,p1,dx,dy,dist, lineWidth, i,len; isRoot = !this.parent; opts = isRoot ? this : this.parent; if (isRoot) {// is root var radius,gradient, children = this.children,c; ctx.save(); for (i = 0, len = points.length; i < len; i += len - 1) { p = points[i]; radius = Math.random() * (8 - 3) + 3; gradient = ctx.createRadialGradient(p.x, p.y, radius / 3, p.x, p.y, radius); gradient.addColorStop(0, this._colorToString(1)); gradient.addColorStop(1, this._colorToString(0)); ctx.fillStyle = gradient; ctx.beginPath(); ctx.arc(p.x, p.y, radius, 0, Math.PI * 2, false); ctx.fill(); } ctx.restore(); for (i = 0, len = children.length; i < len; i += len - 1) { children[i].render(ctx); } } ctx.save(); ctx.globalCompositeOperation = 'lighter'; ctx.lineCap = 'round'; ctx.fillStyle = 'rgba(0, 0, 0, 1)'; ctx.shadowBlur = opts.blur; ctx.shadowColor = this._colorToString(1); ctx.beginPath(); for (i = 0, len = points.length; i < len; i++) { p = points[i]; if (len > 1) { p1 = points[i === len - 1 ? i - 1 : i + 1]; dx = p.x - p1.x; dy = p.y - p1.y; dist = Math.sqrt(dx * dx + dy * dy); } else { dist = 0; } if (dist > 30) dist = 30; ctx.moveTo(p.x + dist, p.y); ctx.arc(p.x, p.y, dist, 0, Math.PI * 2, false); } ctx.fill(); ctx.restore(); ctx.save(); ctx.beginPath(); ctx.strokeStyle = this._colorToString(Math.random() * (opts..........完整代码请登录后点击上方下载按钮下载查看
网友评论0