JavaScript+Canvas实现带跳动效果的粒子动画

实现带跳动效果的粒子动画可以使用JavaScript和Canvas,下面是具体步骤:

步骤一:创建画布和粒子对象

首先,在HTML中创建一个canvas画布,并用JavaScript获取该画布对象。然后,定义粒子对象,包括粒子的位置、半径、速度、弹性等属性,以及在画布上绘制粒子的方法。以下是示例代码:

<canvas id="myCanvas"></canvas>
const canvas = document.getElementById("myCanvas");
const ctx = canvas.getContext("2d");

class Particle{
  constructor(x, y, r, speedX, speedY, color){
    this.x = x;
    this.y = y;
    this.r = r;
    this.speedX = speedX;
    this.speedY = speedY;
    this.color = color;
    this.bounce = -0.7; // 弹性系数
  }
  draw(){
    ctx.beginPath();
    ctx.arc(this.x, this.y, this.r, 0, 2 * Math.PI);
    ctx.fillStyle = this.color;
    ctx.fill();
    ctx.closePath();
  }
  update(){
    this.x += this.speedX;
    this.y += this.speedY;
    if(this.y + this.r > canvas.height){ // 下落到画布底部时的弹性反弹
      this.y = canvas.height - this.r;
      this.speedY *= this.bounce;
    }
  }
}

步骤二:创建粒子数组

然后,定义一个数组来存储粒子对象,以及初始化该数组,生成一定数量的粒子对象。以下是示例代码:

const particles = [];

function init(){
  const particleNumber = 100;
  for(let i = 0; i < particleNumber ; i++){
    const x = Math.random() * canvas.width;
    const y = Math.random() * canvas.height;
    const r = 5 + Math.random() * 10;
    const speedX = -5 + Math.random() * 10;
    const speedY = -10 + Math.random() * 5;
    const color = `hsl(${Math.random() * 360},50%,50%)`;
    const particle = new Particle(x, y, r, speedX, speedY, color);
    particles.push(particle);
  }
}
init();

步骤三:实现画布清除和粒子更新

接下来,定义一个方法来清除画布,并在每一帧更新粒子数组,实现粒子位置的更新和画布的重绘。以下是示例代码:

function clear(){
  ctx.clearRect(0,0,canvas.width,canvas.height);
}

function update(){
  clear();
  particles.forEach((particle)=>{
    particle.update();
    particle.draw();
  });
}

步骤四:设置动画帧和粒子跳动效果

最后,在动画帧中调用update方法,实现动画效果。为了让粒子具有跳动的效果,需要在update方法中添加一个时间因子,使得粒子的y轴方向速度会随时间变化,从而实现跳动效果。以下是示例代码:

function animate(){
  requestAnimationFrame(animate);
  update();
  const time = Date.now() / 1000;
  particles.forEach((particle)=>{
    particle.speedY += Math.sin(time + particle.x) * 0.1;
  });
}
animate();

上述代码中,time是当前时间戳除以1000,得到单位为秒的时间因子;然后,通过sin函数计算出x和time的和值,再乘以0.1,得到y轴方向上的速度变化量,从而实现跳动效果。

示例说明1:增加粒子数量

我们可以增加粒子数量,让动画更加流畅。只需要修改init方法中的particleNumber值即可。

function init(){
  const particleNumber = 200; // 修改粒子数量
  for(let i = 0; i < particleNumber ; i++){
    const x = Math.random() * canvas.width;
    const y = Math.random() * canvas.height;
    const r = 5 + Math.random() * 10;
    const speedX = -5 + Math.random() * 10;
    const speedY = -10 + Math.random() * 5;
    const color = `hsl(${Math.random() * 360},50%,50%)`;
    const particle = new Particle(x, y, r, speedX, speedY, color);
    particles.push(particle);
  }
}

示例说明2:修改粒子弹性系数

我们也可以修改粒子的弹性系数,让粒子的跳动效果更加明显。只需要修改Particle类中的bounce值即可。

class Particle{
  constructor(x, y, r, speedX, speedY, color){
    this.x = x;
    this.y = y;
    this.r = r;
    this.speedX = speedX;
    this.speedY = speedY;
    this.color = color;
    this.bounce = -0.9; // 修改弹性系数
  }
}

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaScript+Canvas实现带跳动效果的粒子动画 - Python技术站

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

相关文章

  • js实现截取某个字符串前面的内容

    让我来详细讲解如何使用JavaScript实现截取某个字符串前面的内容。下面是具体步骤: 1. 使用indexOf()获取关键字的位置 在JavaScript中,我们可以使用indexOf()函数来获取字符串中某个关键字的位置,该函数会返回第一个匹配到的关键字的索引值,如果没有匹配到关键字则返回-1。我们可以利用这个函数来获取关键字在原字符串中的位置,从而确…

    JavaScript 2023年5月28日
    00
  • 详解Vue-Router源码分析路由实现原理

    详解Vue-Router源码分析路由实现原理 前言 随着前端开发的不断发展,大型应用程序的前端实现也变得越来越复杂。前端路由就是其中非常重要的一部分,它可以帮助开发者构建起一个功能完善的单页面应用程序。而Vue-Router则是目前Vue.js框架中非常流行的前端路由方案。本文将详细讲解Vue-Router源码分析,帮助开发者更好地理解Vue-Router的…

    JavaScript 2023年6月11日
    00
  • JavaScript字符串转数字的简单实现方法

    为了方便讲解,我们先简要介绍一下 JavaScript 中的数字和字符串数据类型。 JavaScript 中的数字(Number)类型可以直接进行算术运算,而字符串(String)类型则是由一系列字符组成的序列,不能直接进行算术运算。在实际开发过程中,我们常常需要将字符串类型转换为数字类型,以便进行计算或比较。 那么,下面就来介绍一下 JavaScript …

    JavaScript 2023年5月28日
    00
  • 纯javascript代码实现计算器功能(三种方法)

    当我们想在网页中添加一个计算器功能的时候,可以使用Javascript来实现。以下是三种使用Javascript实现计算器功能的方法: 方法一:利用eval()函数计算表达式 在HTML文档中添加以下代码: <div id="container"> <input type="text" id=&quo…

    JavaScript 2023年5月27日
    00
  • JS表单传值和URL编码转换

    JS表单传值和URL编码转换是前端开发经常遇到的问题,接下来我将详细讲解这个话题的完整攻略。 表单传值 使用JS实现表单传值需要先获取表单元素,再获取元素中的值。下面是一个简单的示例: <!– HTML部分 –> <form id="myForm"> <input type="text&quot…

    JavaScript 2023年5月19日
    00
  • javascript Math.random()随机数函数

    下面是关于JavaScript中 Math.random() 随机数函数的详细讲解: 什么是Math.random()函数? Math.random() 是JavaScript的内置函数之一,用于生成一个伪随机数,范围在0到1之间(包含0但不包含1)。 在使用 Math.random()生成随机数时,我们经常会通过一些算法(比如乘以所需随机数范围,然后用 M…

    JavaScript 2023年5月27日
    00
  • 网页前台通过js非法字符过滤代码(骂人的话等等)

    网页前台通过js非法字符过滤代码的主要目的是防止用户输入一些恶意字符或代码,从而保护网站的安全,提高用户体验。本文将整理出一份完整的攻略,以实现该功能。 步骤一:准备过滤规则列表 在实现非法字符过滤功能前,需要准备好一份过滤规则列表,包括所有需要过滤的字符、字符串、HTML标签等。例如: var illegalChars = ["fuck&quot…

    JavaScript 2023年6月11日
    00
  • js显示时间 js显示最后修改时间

    下面是关于“js显示时间 js显示最后修改时间”的详细讲解及示例: 一、JS显示时间 1. 在HTML页面上显示当前时间 我们可以使用以下JavaScript代码来在HTML页面上显示当前时间: <p id="time"></p> <script> var now = new Date(); var h…

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