js canvas实现随机粒子特效

下面我来详细讲解一下“js canvas实现随机粒子特效”的完整攻略。

1. 前言

在介绍如何使用canvas实现随机粒子特效之前,我们需要了解几个基本的概念。

  • HTML5 Canvas:HTML5中的一个重要新特性,允许直接在浏览器中使用JavaScript绘制2D图形。
  • requestAnimationFrame:在浏览器重绘之前执行指定的函数,以使动画效果更加平滑流畅。
  • 粒子系统:一种用于模拟物体运动的技术,可以用来创建各种不同的动态效果,如烟雾、火焰、雨滴等。

了解以上基本概念之后,我们就可以开始使用canvas创建随机粒子特效了。

2. 创建Canvas画布

首先,我们需要在HTML中创建一个canvas标签,用来作为我们绘制粒子系统的画布。

<canvas id="myCanvas"></canvas>

接着,在JavaScript中获取到该canvas元素,并为其设置画布的宽高。

const canvas = document.getElementById('myCanvas');
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;

3. 创建粒子对象

接下来,我们需要创建一个Particle对象,用来代表粒子的属性和行为。

class Particle {
  constructor(x, y, radius, color, speed) {
    this.x = x;
    this.y = y;
    this.radius = radius;
    this.color = color;
    this.speed = speed;
    this.direction = Math.random() * Math.PI * 2;
  }

  move() {
    this.x += Math.cos(this.direction) * this.speed;
    this.y += Math.sin(this.direction) * this.speed;
  }
}

Particle对象的构造函数中,我们传入了粒子的初始位置、半径、颜色和移动速度,同时生成一个随机运动方向。

然后,在Particle对象中添加一个move方法,用于更新粒子的位置。

4. 绘制粒子系统

现在,我们可以开始在画布上绘制我们的粒子系统了。

首先,我们需要创建一个数组,用于存放所有的粒子对象。

const particles = [];

然后,我们需要编写一个函数,用于在画布上绘制所有的粒子。

function drawParticles() {
  // 清空画布
  context.clearRect(0, 0, canvas.width, canvas.height);

  // 遍历粒子数组,绘制每一个粒子
  particles.forEach(particle => {
    context.beginPath();
    context.arc(particle.x, particle.y, particle.radius, 0, Math.PI * 2, false);
    context.fillStyle = particle.color;
    context.fill();
    context.closePath();
  });
}

该函数中,我们首先使用clearRect方法清空画布,避免上一次绘制的粒子残留在画布上。

然后,遍历所有粒子对象,使用arc方法绘制一个圆形,并设置其颜色。最后,使用fill方法填充该圆形,完成绘制。

5. 动画效果

到这一步,我们已经完成了粒子系统的绘制,但是粒子并不会动起来。下面,我们需要实现一个动画效果,使粒子随机运动起来。

function animate() {
  // 使用requestAnimationFrame方法循环调用animate函数
  requestAnimationFrame(animate);

  // 遍历所有粒子对象,更新其位置
  particles.forEach(particle => {
    particle.move();

    // 如果粒子位置超出画布范围,则将其放回画布内部
    if (particle.x < 0 || particle.x > canvas.width || particle.y < 0 || particle.y > canvas.height) {
      particle.x = Math.random() * canvas.width;
      particle.y = Math.random() * canvas.height;
    }
  });

  // 绘制所有粒子
  drawParticles();
}

animate函数中,我们首先使用requestAnimationFrame方法循环调用自身。然后,遍历所有粒子对象,并执行其move方法进行位置更新。在更新粒子位置之后,我们需要判断粒子是否超出了画布范围,如果是则将其重新放回画布内部。

最后,使用drawParticles函数绘制所有的粒子。

6. 示例说明

下面,我将介绍两个使用canvas实现的随机粒子特效的示例。

示例一:彩色粒子

这个示例中,我们将以随机颜色绘制彩色粒子,并让它们不断在画布内部随机运动。

const canvas = document.getElementById('myCanvas');
const context = canvas.getContext('2d');
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;

class Particle {
  constructor(x, y, radius, color, speed) {
    this.x = x;
    this.y = y;
    this.radius = radius;
    this.color = color;
    this.speed = speed;
    this.direction = Math.random() * Math.PI * 2;
  }

  move() {
    this.x += Math.cos(this.direction) * this.speed;
    this.y += Math.sin(this.direction) * this.speed;
  }
}

const particles = [];

for (let i = 0; i < 100; i++) {
  const particle = new Particle(
    Math.random() * canvas.width,   // x坐标
    Math.random() * canvas.height,  // y坐标
    Math.random() * 5 + 5,          // 半径
    `rgb(${Math.random() * 255}, ${Math.random() * 255}, ${Math.random() * 255})`, // 随机颜色
    2                              // 移动速度
  );

  particles.push(particle);
}

function drawParticles() {
  context.clearRect(0, 0, canvas.width, canvas.height);

  particles.forEach(particle => {
    context.beginPath();
    context.arc(particle.x, particle.y, particle.radius, 0, Math.PI * 2, false);
    context.fillStyle = particle.color;
    context.fill();
    context.closePath();
  });
}

function animate() {
  requestAnimationFrame(animate);

  particles.forEach(particle => {
    particle.move();

    if (particle.x < 0 || particle.x > canvas.width || particle.y < 0 || particle.y > canvas.height) {
      particle.x = Math.random() * canvas.width;
      particle.y = Math.random() * canvas.height;
    }
  });

  drawParticles();
}

animate();

示例二:粒子互动效果

这个示例中,我们将为粒子之间添加互动效果,让它们在一定范围内相互吸引,并形成一个动态的“星空”效果。

const canvas = document.getElementById('myCanvas');
const context = canvas.getContext('2d');
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;

class Particle {
  constructor(x, y, radius, color, speed) {
    this.x = x;
    this.y = y;
    this.radius = radius;
    this.color = color;
    this.speed = speed;
    this.direction = Math.random() * Math.PI * 2;
  }

  move() {
    this.x += Math.cos(this.direction) * this.speed;
    this.y += Math.sin(this.direction) * this.speed;
  }

  interact(particles) {
    // 遍历所有粒子,计算与当前粒子的距离
    particles.forEach(particle => {
      const distance = Math.sqrt((this.x - particle.x) ** 2 + (this.y - particle.y) ** 2);

      // 当距离小于一定范围时,相互吸引
      if (distance < 100) {
        const lineWidth = (100 - distance) / 20;
        context.beginPath();
        context.lineWidth = lineWidth;
        context.moveTo(this.x, this.y);
        context.lineTo(particle.x, particle.y);
        context.strokeStyle = '#ffffff';
        context.stroke();
        context.closePath();

        const dx = particle.x - this.x;
        const dy = particle.y - this.y;
        const angle = Math.atan2(dy, dx);

        this.direction += angle / 100;
        particle.direction -= angle / 100;
      }
    });
  }
}

const particles = [];

for (let i = 0; i < 50; i++) {
  const particle = new Particle(
    Math.random() * canvas.width,   // x坐标
    Math.random() * canvas.height,  // y坐标
    Math.random() * 2 + 1,          // 半径
    '#ffffff',                      // 颜色
    Math.random() * 2 + 1           // 移动速度
  );

  particles.push(particle);
}

function drawParticles() {
  context.clearRect(0, 0, canvas.width, canvas.height);

  // 对每个粒子进行互动计算
  particles.forEach(particle => {
    particle.interact(particles);
  });

  // 绘制所有粒子
  particles.forEach(particle => {
    context.beginPath();
    context.arc(particle.x, particle.y, particle.radius, 0, Math.PI * 2, false);
    context.fillStyle = particle.color;
    context.fill();
    context.closePath();
  });
}

function animate() {
  requestAnimationFrame(animate);

  particles.forEach(particle => {
    particle.move();

    if (particle.x < 0 || particle.x > canvas.width || particle.y < 0 || particle.y > canvas.height) {
      particle.x = Math.random() * canvas.width;
      particle.y = Math.random() * canvas.height;
    }
  });

  drawParticles();
}

animate();

在这个示例中,我们首先为每个粒子对象添加了一个interact方法,用于计算与其他粒子的距离,并实现相互间的吸引效果。

然后,我们在drawParticles函数中,调用每个粒子对象的interact方法,并且在粒子间绘制了白色的线条。这样,当两个粒子距离较近时就可以呈现出互动效果。

最后,加入了requestAnimationFrame来实现动画效果。

总之,以上便是“js canvas实现随机粒子特效”的完整攻略。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:js canvas实现随机粒子特效 - Python技术站

(0)
上一篇 2023年6月11日
下一篇 2023年6月11日

相关文章

  • JavaScript中Reduce10个常用场景技巧

    JavaScript中reduce是一个非常有用的数组方法,它可以对一个数组的所有元素进行迭代,并返回一个最终的结果。reduce方法有很多应用场景,下面将介绍十个常用场景技巧。 1. 数组求和 使用reduce方法可以很方便地对数组中的数值进行求和。只需将reduce方法的初始值设置为0,每次迭代时将两个数值相加即可。 const arr = [1, 2,…

    JavaScript 2023年6月10日
    00
  • XMLHttpRequest对象_Ajax异步请求重点(推荐)

    XMLHttpRequest对象_Ajax异步请求重点(推荐) 什么是Ajax异步请求 Ajax全称为Asynchronous Javascript And XML,翻译成中文是“异步的 JavaScript 和 XML”。Ajax技术是一种在不重新加载整个页面的情况下,通过后台与服务器进行少量数据交换,实现页面的局部刷新,从而提高页面的响应速度和用户体验。…

    JavaScript 2023年6月11日
    00
  • jquery tools之tabs 选项卡/页签

    下面我将为您讲解“jquery tools之tabs选项卡/页签”的完整攻略。 1. 简介 jQuery Tools是一个jQuery插件集合,其中包含了一些常用的UI组件,它们可以方便地通过jQuery来实现。 Tabs(选项卡/页签)是jQuery Tools的一个组件,它可以帮助我们实现简单易用的选项卡功能。 2. 引入jQuery和jQuery To…

    JavaScript 2023年6月11日
    00
  • JS逆向之浏览器补环境图文详解

    JS逆向技术是黑客攻击的重要手段之一,它可以帮助黑客突破各种安全防线,获得非法访问权限。其中,浏览器补环境是逆向技术中的一项重要内容,下面我将为大家详细讲解相关攻略。 什么是浏览器补环境? 浏览器补环境,或者说沙盒环境,是指浏览器运行JS脚本时,为了确保安全性而对JS代码的执行环境进行隔离。在这种沙盒环境下,JS脚本只能访问指定的环境变量和API,且对于底层…

    JavaScript 2023年5月28日
    00
  • 利用JS实现浏览器的title闪烁

    要实现浏览器中Title的闪烁,可以使用 JavaScript 语言来完成。下面是两种实现闪烁效果的方式。 方式一:使用 setInterval 实现闪烁效果 <script> // 定义变量 var title = document.title; var char = ‘●’; // 闪烁字符 var timer = null; // 创建函数…

    JavaScript 2023年6月11日
    00
  • Javascript四舍五入Math.round()与Math.pow()使用介绍

    Javascript四舍五入Math.round()与Math.pow()使用介绍 Math.round() 在Javascript中,可以使用Math.round()方法将小数进行四舍五入。 其语法如下: Math.round(x) 其中,x为需要四舍五入的数字。 例如,对于数字1.2使用Math.round()方法进行四舍五入: var rounded …

    JavaScript 2023年6月10日
    00
  • 详解用场景去理解函数柯里化(入门篇)

    详解用场景去理解函数柯里化(入门篇)完整攻略 什么是函数柯里化? 函数柯里化是一种将具有 n 个参数的函数转换成只接受一个参数的函数,并返回一个新函数的技术。这个新函数会接受剩余的参数并返回结果。这个过程就像为函数的第一个参数绑定值一样,常用的方式是使用闭包保存参数和状态,再通过函数的多次调用形成链式调用的效果。 柯里化的优势和适用场景 函数柯里化可以让你更…

    JavaScript 2023年5月19日
    00
  • javascript typeof id===’string’?document.getElementById(id):id解释 原创

    “javascript typeof id===’string’?document.getElementById(id):id” 是一段 JavaScript 三元运算符语句。这段代码的作用是:判断变量 id 是否是字符串类型,如果是,则执行 document.getElementById(id),否则返回变量 id。 具体来说,其中涉及到以下部分: “ty…

    JavaScript 2023年6月10日
    00
合作推广
合作推广
分享本页
返回顶部