美文网首页前端之路
canvas 会动的粒子效果

canvas 会动的粒子效果

作者: Duobe | 来源:发表于2017-03-22 13:21 被阅读235次

particle-field

canvas实现粒子场的动画效果

实现效果:粒子会动并且在一定范围内粒子之间出现连线。

效果图

演示

源码

以下是实现过程

一、获取canvas对象和画笔

var canvas = document.getElementById("canvas")
var ctx = canvas.getContext("2d")
// 保存canvas的宽、高
var w = canvas.offsetWidth
var h = canvas.offsetHeight
// 注意:canvas实际有2套尺寸,一个是本身大小,另一个是绘图表面的大小,这里处理使它们大小一致,不然会出现拉伸情况
canvas.width = w
canvas.height = h

二、创建点的类

从效果上看有很多个点,每个点都有它们有相同的属性比如坐标、半径、速度等

function Point(x, y) {
    this.x = x 
    this.y = y
    this.r = 1 + Math.random() * 2
    this.sx = Math.random() * 2 - 1
    this.sy = Math.random() * 2 - 1
}

三、给Point添加画点的方法

首先画布是没有东西的,所以先有了才可以继续下去动作

Point.prototype.draw = function(ctx) {
    ctx.beginPath()
    ctx.arc(this.x, this.y, this.r, 0, 2 * Math.PI)
    ctx.closePath()
    ctx.fillStyle = '#aaa'
    ctx.fill()
}

四、给Point添加点的动作

Point.prototype.move = function() {
    this.x += this.sx
    this.y += this.sy
    if(this.x > w || this.x < 0) this.sx = -this.sx
    if(this.y > h || this.y < 0) this.sy = -this.sy
}

五、点与点之间的连接 —— 画线

Point.prototype.drawLine = function(ctx, p) {
    var dx = this.x - p.x 
    var dy = this.y - p.y
    var d = Math.sqrt(dx * dx + dy * dy)
    if(d < 100) {
        var alpha = (100 - d) / 100 * 1 
        ctx.beginPath()
        ctx.moveTo(this.x, this.y)
        ctx.lineTo(p.x, p.y)
        ctx.closePath()
        ctx.strokeStyle = 'rgba(170, 170, 170, ' + alpha + ')'
        ctx.strokeWidth = 1
        ctx.stroke()
    }
}

六、实例化点

现在才开始拿到那些点,并把每个点放在一个数组里面保存。

var points = []

for(var i = 0; i < 40; i++) {
    points.push(new Point(Math.random() * w, Math.random() * h))
}

七、画点

把放在points数组里面的点一个个拿出来,调用上面写好点的方法:画点(draw)、点会动(move)、点连线,最后调用 paint() 方法执行。

function paint() {
    ctx.clearRect(0, 0, w, h) //清空画布
    for(var i = 0; i < points.length; i++) {
        points[i].move() 
        points[i].draw(ctx)
        for(var j = i + 1; j < points.length; j++) {
            points[i].drawLine(ctx, points[j])
        }
    }
}
// 这里使用requestAnimationFrame更新画面
function loop() {
    requestAnimationFrame(loop)
    paint()
}
loop()

相关文章

  • canvas 会动的粒子效果

    particle-field canvas实现粒子场的动画效果 实现效果:粒子会动并且在一定范围内粒子之间出现连线...

  • canvas粒子效果

    可以实现鼠标推移粒子,连线粒子,鼠标连线粒子,自定义颜色

  • 粒子和UI遮罩,层级

    粒子效果=>Rendering有一个layer,效果和canvas的layer相同 遮罩使用spriteMask就行

  • Canvas<粒子svg效果>

    效果图: 想了解基础的,可参考文章 ?此篇文章基本是针对粒子文字效果的改造或着复用,主要是通过对 svg 路径的处...

  • Canvas实现文字粒子效果

    最终实现效果 实现思路: 获取到canvas绘制后屏幕上像素点的数组,在目标像素点上绘制粒子替换掉原来的内容 绘制...

  • Canvas<粒子文字效果>

    效果图: 参考效果地址: (孰能生巧,现在只能先 “比葫芦画瓢”,慢慢来吧,注释很全,不过还是需要自己加以理解 ?...

  • H5 元素点击时候出现闪烁问题

    做一个 canvas 粒子效果的时候, 需要当手指或者鼠标点击页面的时候做一些操作。 由于我的 canvas 是铺...

  • 10、粒子效果和UI层级关系

    1、要控制粒子效果的层级和UI的关系,需要设置Canvas的模式为Screen Space - Camera 2、...

  • 使用canvas实现粒子流动效果

    使用canvas实现粒子流动效果 首先我们先来看下实现的效果吧~ (简书不支持插入视频,只能点击链接查看[htt...

  • Android Canvas小案例粒子爆炸效果

    概述 本文承接Android Canvas总结下述小案例仅为Canvas的api的试用总结,非项目使用demo!!...

网友评论

    本文标题:canvas 会动的粒子效果

    本文链接:https://www.haomeiwen.com/subject/bzannttx.html