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实现横向百叶窗效果网页切换动画效果的方法

    实现横向百叶窗效果网页切换动画效果,可以通过以下步骤来进行: 准备工作 准备HTML结构,结构中至少包含两个需要进行切换的元素。 <div class="container"> <div class="panel">内容1</div> <div class="pane…

    JavaScript 2023年6月11日
    00
  • JS匹配日期和时间的正则表达式示例

    当需要从文本中匹配日期和时间信息时,可以使用正则表达式来准确地实现。下面是关于“JS匹配日期和时间的正则表达式示例”的完整攻略。 1. 正则表达式基础知识 在进行日期和时间信息的正则匹配时,需要掌握一些基础知识。 字符集:用于匹配多个字符中的任意一个字符,用方括号([])来表示。如[abc]匹配字符a、b或c中的任意一个字符。 重复次数:用于匹配前面一个字符…

    JavaScript 2023年5月27日
    00
  • JavaScript判断变量是否为数组的方法(Array)

    JavaScript提供了多种方法来判断一个变量是否为数组。下面是两种常见的方式: 1. 使用Array.isArray()方法 Array.isArray()是ES5中添加的一个方法,用于判断一个变量是否为数组类型。它接受一个参数,该参数可以是任何类型的变量,如果是数组,则返回true;否则返回false。 var arr = [1, 2, 3]; con…

    JavaScript 2023年5月27日
    00
  • JS 中document.write()的用法和清空的原因浅析

    标题:JS 中 document.write() 的用法和清空的原因浅析 什么是 document.write() ? 在 JavaScript 中,document.write() 是一种常用的方法。它可以将文本或 HTML 代码写入到文档中。当此方法被调用时,输出的内容将被添加到 HTML 页面上当前正在解析的位置。在许多情况下,它用于在页面加载时实时生…

    JavaScript 2023年5月28日
    00
  • javascript实现日期按月份加减

    下面是详细的讲解“javascript实现日期按月份加减”的完整攻略。 一、需求分析 在实现日期按月份加减之前,我们首先需要理清楚需求,明确具体的要求和目标: 输入一个日期和月份增减的数字,输出增减后的日期 增减的数字可以是正数(表示加),也可以是负数(表示减) 如果增减后的日期超出了月份的天数限制,则应该自动调整至该月最后一天 输入的日期格式可以是常用的 …

    JavaScript 2023年5月27日
    00
  • JavaScript实现简单获取当前网页网址的方法

    获取当前网页网址是JavaScript中的一个基础操作,可以通过location对象的属性来实现。下面是获取当前网页网址的几个常用方法: 1. location.href 利用location对象的href属性可以获取当前网页的完整URL地址,包括协议、主机名、端口号、路径和查询字符串等信息。 var currentUrl = location.href; …

    JavaScript 2023年6月11日
    00
  • javascript 终止函数执行操作

    如果在 JavaScript 函数中需要提前结束函数的执行,有几种方法可以实现终止函数执行操作。下面是几种常用的方式: 1. 使用return语句 在 JavaScript 函数中,可以使用return语句来提前结束函数的执行。当函数执行到return语句时,函数将立即停止执行并返回指定的值。如果return语句没有指定一个值,函数将返回undefined。…

    JavaScript 2023年5月27日
    00
  • JS常见算法详解

    JS常见算法详解 前言 本文将给读者介绍JS中常见的算法,包括排序、查找等。算法是程序设计的基础,对于程序员来说,学好算法是非常重要的。相信通过学习本文,读者可以对算法有更加深入的理解。 排序算法 冒泡排序 冒泡排序算法采用交换方式,将待排序数组中相邻的两个数进行比较,较大的数后移一位,较小的数前移一位。经过一次遍历,最大的数就被交换到了最后。不断重复这个过…

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