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日

相关文章

  • 谈谈我对JavaScript原型和闭包系列理解(随手笔记6)

    来详细讲解一下“谈谈我对JavaScript原型和闭包系列理解(随手笔记6)”这篇文章。 标题 文章的标题是“谈谈我对JavaScript原型和闭包系列理解(随手笔记6)”,主要内容是探讨JavaScript中的原型和闭包。 正文 原型 在JavaScript中,每个对象都有一个原型对象(即 prototype 属性)。原型对象是一个普通的对象,它有可能也有…

    JavaScript 2023年6月10日
    00
  • 如何在一个页面显示多个百度地图

    下面我将为你详细介绍如何在一个页面显示多个百度地图的完整攻略。 0. 前置条件 在开始之前,你需要注册百度地图开发者账号,并创建应用,获取到相应的AK(Access Key)。 1. 引入地图API 在HTML中引入单个百度地图,需要引入百度地图的JavaScript API文件。具体步骤如下: 在<head>标签内引入地图API文件: <…

    JavaScript 2023年6月1日
    00
  • 通过本地加载ga.js文件提高Google Anlytics性能

    通过本地加载ga.js文件提高Google Analytics性能是一种优化页面加载速度的常用技巧。下面将详细讲解如何进行操作。 什么是本地加载GA.js文件? Google Analytics(以下简称GA)是一个重要的在线统计分析工具,代码嵌入网页中,访问时需要从Google服务器上下载GA.js文件来渲染页面。 如果网站在中国内地运营,而GA服务器在境…

    JavaScript 2023年6月11日
    00
  • javascript 小时:分钟的正则表达式

    首先,为了匹配符合“小时:分钟”格式的字符串,我们需要使用正则表达式。下面是一个简单的正则表达式: /^\d{1,2}:\d{1,2}$/ 这个正则表达式使用了^和$锚定符来确保整个字符串都与模式匹配。模式由两个数字组成,由一个冒号分隔。d{1, 2}表示可以匹配1-2位的数字。因此,模式可以匹配 1:30、10:45、21:00 等。 如果你需要限制小时必…

    JavaScript 2023年5月27日
    00
  • js 获取本周、上周、本月、上月、本季度、上季度的开始结束日期

    先来解释一下获取日期的方式:可以通过 JS 内置对象 Date() 进行日期的获取,以下是获取日期的方法: getFullYear():获取年份 getMonth():获取月份(注意:返回值是0-11,0代表一月,11代表十二月) getDate():获取日(注意:返回值是1-31之间的整数) getDay():获取星期几(注意:返回值是0-6,0代表星期日…

    JavaScript 2023年5月27日
    00
  • Java中的Unsafe在安全领域的使用总结和复现(实例详解)

    下面是详细的解答。 Java中的Unsafe在安全领域的使用总结和复现(实例详解) 什么是Unsafe Unsafe是Java中提供的一个类,它提供了直接操作其内存的方法。虽然该类被标记为不稳定的,但是Unsafe在Java中广泛使用,特别是在JDK内部(例如Java Collections、Java Concurrent包)中。 在安全领域中的使用总结 U…

    JavaScript 2023年6月10日
    00
  • Window.Open打开窗体和if嵌套代码

    下面我就来详细讲解一下“Window.Open打开窗体和if嵌套代码”的完整攻略。 Window.Open打开窗体 Window.Open 是一种在浏览器中打开新窗口的方法。它有几个参数可以设置:新窗口的 URL 地址、窗口大小和位置、是否允许调整窗口大小、是否允许工具栏和状态栏等。 下面是一个示例,展示如何通过 Window.Open 打开一个新窗口: &…

    JavaScript 2023年6月11日
    00
  • 浅谈javascript中的作用域

    下面就来详细讲解Javascript中的作用域: 什么是作用域? 作用域(Scope)是Javascript中的一个重要概念。它决定了代码中变量的可见性。 Javascript使用了词法作用域(Lexical Scope)的模型。简而言之,就是在函数被定义的时候就已经确定了函数的作用域,与调用时的上下文无关。 全局作用域 Javascript中最外层的作用域…

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