iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >JavaScript利用canvas绘制流星雨效果
  • 836
分享到

JavaScript利用canvas绘制流星雨效果

摘要

目录前言需求分析实现过程1.绘制满天繁星2.满天繁星闪起来3.绘制流星4.流星划过夜空5.流星雨6.merge视觉盛宴前言 最近总是梦见一些小时候的故事,印象最深刻的就是夏天坐在屋顶

前言

最近总是梦见一些小时候的故事,印象最深刻的就是夏天坐在屋顶上,看着满天的繁星,一颗,两颗,三颗...不由自主地开始了数星星的过程。不经意间,一颗流星划过夜间,虽然只是转瞬即逝,但它似乎比夜空中的其它繁星更吸引着我。听老人说,看见流星的时候许愿,愿望是可以实现的,此时早已把数星星抛之脑后,开始期待着下一颗流星的出现。但是那天晚上,流星再也没有出现,这也成了自己小时候的一个遗憾。

今天,我决定用canvas为大家带来一场流星雨视觉盛宴。

需求分析

首先我们需要的元素有:夜空、满天繁星、流星雨。

满天繁星: 这个其实就是画上一个个点,然后不断的通过颜色交替,营造出一种星星闪烁的意境。

流星雨: 流星处于他自己的运动轨迹之中,当前的位置最亮,轮廓最清晰,而之前划过的地方离当前位置轨迹距离越远就越暗淡越模糊,其实它就是一个渐变的过程,恰巧canvas有方法可以创建一个沿参数坐标指定的直线的渐变。然后让它从右上向左下移动,这样就能营造一种流星雨的效果,同时实现动画的循环。

OK,需求分析结束,准备动手开干~

实现过程

1.绘制满天繁星

//创建一个星星对象
class Star {
  constructor() {
    this.x = windowWidth * Math.random(); //横坐标
    this.y = 5000 * Math.random(); //纵坐标
    this.text = "."; //文本
    this.color = "white"; //颜色
  }
  //初始化
  init() {
    this.getColor();
  }
  //绘制
  draw() {
    context.fillStyle = this.color;
    context.fillText(this.text, this.x, this.y);
  }
}

//画星星
for (let i = 0; i < starCount; i++) {
  let star = new Star();
  star.init();
  star.draw();
  arr.push(star);
}

来看下此时的效果:

夜空中的满天繁星现在是有了,但是缺乏一点意境,我们得想办法让这些繁星都闪烁起来。

2.满天繁星闪起来

//创建一个星星对象
class Star {
  constructor() {
    this.x = windowWidth * Math.random(); //横坐标
    this.y = 5000 * Math.random(); //纵坐标
    this.text = "."; //文本
    this.color = "white"; //颜色
  }
	// 获取随机颜色
  getColor() {
    let _r = Math.random();
    if (_r < 0.5) {
      this.color = "#333";
    } else {
      this.color = "white";
    }
  }

  //初始化
  init() {
    this.getColor();
  }
  //绘制
  draw() {
    context.fillStyle = this.color;
    context.fillText(this.text, this.x, this.y);
  }
}

//画星星
for (let i = 0; i < starCount; i++) {
  let star = new Star();
  star.init();
  star.draw();
  arr.push(star);
}

//繁星闪起来
let t1
function playStars() {
  for (let n = 0; n < starCount; n++) {
    arr[n].getColor();
    arr[n].draw();
  }
  t1 = requestAnimationFrame(playStars);
}

繁星闪烁的元素就在于这个getColor方法,通过不断地切换星星的颜色,来达到星星闪烁的效果。

再来看看这时的效果:

此刻的自己就可以开始数星星了,一颗,两颗,三颗...

3.绘制流星

简单点理解,流星其实就是一条渐变的线段,当前的位置最亮,轮廓最清晰,而之前划过的地方离当前位置轨迹距离越远就越暗淡越模糊。

这里的关键apicreateLinearGradient,用于创建一个沿参数坐标指定的直线的渐变。

语法:

CanvasGradient ctx.createLinearGradient(x0, y0, x1, y1);

  • x0:起点的 x 轴坐标。
  • y0:起点的 y 轴坐标。
  • x1:终点的 x 轴坐标。
  • y1:终点的 y 轴坐标。

使用createLinearGradient() 方法初始化一个线性渐变。在这个线性渐变中添加三种颜色,达到一种渐变的效果来模拟出流星划过夜空的状态。


  draw() {
    //绘制一个流星的函数
    context.save();
    context.beginPath();
    context.lineWidth = 1; //宽度
    context.globalAlpha = this.alpha; //设置透明度
    //创建横向渐变颜色,起点坐标至终点坐标
    let line = context.createLinearGradient(
      this.x,
      this.y,
      this.x + this.width,
      this.y - this.height
    );
    //分段设置颜色
    line.addColorStop(0, "white");
    line.addColorStop(0.3, this.color1);
    line.addColorStop(0.6, this.color2);
    context.strokeStyle = line;
    //起点
    context.moveTo(this.x, this.y);
    //终点
    context.lineTo(this.x + this.width, this.y - this.height);
    context.closePath();
    context.stroke();
    context.restore();
  }

现在我们来看一看当年的那个流星:

4.流星划过夜空

流星有了,现在我们得想办法让它动起来。这里其实就是通过不断地计算位置来达到流星动起来的效果。

move() {
    //清空流星像素
    let x = this.x + this.width - this.offset_x;
    let y = this.y - this.height;
    context.clearRect(x - 3, y - 3, this.offset_x + 5, this.offset_y + 5);
    //重新计算位置,往左下移动
    this.countPos();
    //透明度增加
    this.alpha -= 0.002;
    //重绘
    this.draw();
  }

现在,我们就可以看到当年的那颗流星了,是不是很激动。稍安勿躁,为了弥补当年的遗憾,这里决定来一场从未真实见过的流星雨。

5.流星雨

写到这里,实现流星雨其实就很简单了,我们只需要再多生成一些流星,为它们各自分配不同的坐标即可。

let t2
// 创建流星雨对象
class MeteorRain {
  constructor() {
    this.x = -1;
    this.y = -1;
    this.length = -1; //长度
    this.angle = 30; //倾斜角度
    this.width = -1; //宽度
    this.height = -1; //高度
    this.speed = 1; //速度
    this.offset_x = -1; //横轴移动偏移量
    this.offset_y = -1; //纵轴移动偏移量
    this.alpha = 1; //透明度
    this.color1 = ""; //流星的色彩
    this.color2 = ""; //流星的色彩
  }
  init() {
    //初始化
    this.getPos();
    this.alpha = 1; //透明度
    this.getRandomColor();
    //最小长度,最大长度
    let x = Math.random() * 80 + 150;
    this.length = Math.ceil(x);
    x = Math.random() + 0.5;
    this.speed = Math.ceil(x); //流星的速度
    let cos = Math.cos((this.angle * 3.14) / 180);
    let sin = Math.sin((this.angle * 3.14) / 180);
    this.width = this.length * cos;
    this.height = this.length * sin;
    this.offset_x = this.speed * cos;
    this.offset_y = this.speed * sin;
  }
  
  getRandomColor() {
    let a = Math.ceil(255 - 240 * Math.random());
    //中段颜色
    this.color1 = "rgba(" + a + "," + a + "," + a + ",1)";
    //结束颜色
    this.color2 = "black";
  }
  
  countPos() {
    //
    //往左下移动,x减少,y增加
    this.x = this.x - this.offset_x;
    this.y = this.y + this.offset_y;
  }
  
  getPos() {
    //
    //横坐标
    this.x = Math.random() * window.innerWidth; //窗口高度
    //纵坐标
    this.y = Math.random() * window.innerHeight; //窗口宽度
  }
  
  draw() {
    //绘制一个流星的函数
    context.save();
    context.beginPath();
    context.lineWidth = 1; //宽度
    context.globalAlpha = this.alpha; //设置透明度
    //创建横向渐变颜色,起点坐标至终点坐标
    let line = context.createLinearGradient(
      this.x,
      this.y,
      this.x + this.width,
      this.y - this.height
    );
    //分段设置颜色
    line.addColorStop(0, "white");
    line.addColorStop(0.3, this.color1);
    line.addColorStop(0.6, this.color2);
    context.strokeStyle = line;
    //起点
    context.moveTo(this.x, this.y);
    //终点
    context.lineTo(this.x + this.width, this.y - this.height);
    context.closePath();
    context.stroke();
    context.restore();
  }
  move() {
    //清空流星像素
    let x = this.x + this.width - this.offset_x;
    let y = this.y - this.height;
    context.clearRect(x - 3, y - 3, this.offset_x + 5, this.offset_y + 5);
    //重新计算位置,往左下移动
    this.countPos();
    //透明度增加
    this.alpha -= 0.002;
    //重绘
    this.draw();
  }
}

//绘制流星
function playRains() {
  for (let n = 0; n < rainCount; n++) {
    // console.log(rains, "--");
    let rain = rains[n];
    rain.move(); //移动
    if (rain.y > window.innerHeight) {
      //超出界限后重来
      context.clearRect(rain.x, rain.y - rain.height, rain.width, rain.height);
      rains[n] = new MeteorRain();
      rains[n].init();
    }
  }
  t2 = requestAnimationFrame(playRains);
}

6.merge视觉盛宴

流星极短暂的星星是也,它不像恒星和行星那般耀眼,却用短暂的生命,划破夜空,用瞬间潇洒的弧线留住美丽的光辉。昙花和流星瞬间之美令我无法忘怀,大自然神奇的造物者给了我们许多的美,不论瞬间的还是永恒的,我们都要用真心去欣赏去品味。

通过合并前面五个步骤,我们就能够一睹这流星刹那间的交错,而后瞬间就穿透为永恒,只是一刻用生命幻化的美。

以上就是javascript利用canvas绘制流星雨效果的详细内容,更多关于JavaScript canvas绘制流星雨的资料请关注编程网其它相关文章!

--结束END--

本文标题: JavaScript利用canvas绘制流星雨效果

本文链接: https://www.lsjlt.com/news/169505.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • JavaScript利用canvas绘制流星雨效果
    目录前言需求分析实现过程1.绘制满天繁星2.满天繁星闪起来3.绘制流星4.流星划过夜空5.流星雨6.merge视觉盛宴前言 最近总是梦见一些小时候的故事,印象最深刻的就是夏天坐在屋顶...
    99+
    2022-11-13
    JavaScript canvas绘制流星雨 JavaScript canvas 流星雨 JavaScript 流星雨
  • 基于Python如何绘制流星雨效果
    今天小编给大家分享一下基于Python如何绘制流星雨效果的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。浪漫的流星雨展示&nb...
    99+
    2023-06-29
  • 基于Python实现流星雨效果的绘制
    目录1 前言2 霍金说移民外太空3 浪漫的流星雨展示 4 Python代码 1 前言 我们先给个小故事,提一下大家兴趣;然后我给出论据,得出结论。最后再浪漫的流星...
    99+
    2024-04-02
  • JavaScript如何实现流星雨效果
    这篇文章主要介绍“JavaScript如何实现流星雨效果”,在日常操作中,相信很多人在JavaScript如何实现流星雨效果问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”JavaScript如何实现流星雨效果...
    99+
    2023-07-02
  • JavaScript实现流星雨效果的示例代码
    目录演示技术栈源码首先建立星星对象让星星闪亮起来创建流星雨对象让流星动起来演示 上一次做了一个雨滴的动画,顺着这种思维正好可以改成流星雨,嘿嘿我真是一个小机灵。 技术栈 还是先建立...
    99+
    2024-04-02
  • 怎么用Python实现流星雨效果
    这篇文章将为大家详细讲解有关怎么用Python实现流星雨效果,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。流星雨的前提是得先有一个流星,所谓流星,就是一个拖着尾巴的直线。所谓拖着尾巴,实际上是我们的浪漫想...
    99+
    2023-06-22
  • javascript canvas实现雨滴效果
    本文实例为大家分享了javascript canvas实现雨滴效果的具体代码,供大家参考,具体内容如下 先看效果 看起来很炫酷,其实就是实现了雨滴的掉落还有最后的圆 还是看源码 ...
    99+
    2024-04-02
  • CSS3怎么实现流星雨效果
    小编给大家分享一下CSS3怎么实现流星雨效果,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!说明:正文只讲述单个流星雨的实现方式,多个的效果只需要对单个的动画起始点...
    99+
    2023-06-14
  • JavaScript canvas实现流星特效
    本文实例为大家分享了JavaScript canvas实现流星特效展示的具体代码,供大家参考,具体内容如下 1、控制透明度变化函数 function easeInQuad(cur...
    99+
    2024-04-02
  • C语言实现流星雨效果流程
    目录一、头文件二、结构体三、初始化四、绘制函数五、移动函数六、界面设计七、主函数总结视频讲解感谢序 再亮眼的流星,也会一闪而过。 嗨!这里是狐狸~~ 没错,我又来了,上次的“烟花”表...
    99+
    2024-04-02
  • JavaScript canvas实现字符雨效果
    本文实例为大家分享了JavaScript canvas实现字符雨效果的具体代码,供大家参考,具体内容如下 字符雨效果 分析如何实现 字符雨从上往下逐渐消失: 这是canvas每次画...
    99+
    2024-04-02
  • 利用Jetpack Compose实现绘制五角星效果
    目录说明自定义星行Modifier原理实现代码最终实现效果说明 compose中我们的所有ui操作,包括一些行为,例如:点击、手势等都需要使用Modifier来进行操作。因此对Mod...
    99+
    2024-04-02
  • JavaScript Canvas绘制动态线框效果
    本文实例为大家分享了JavaScript Canvas绘制动态线框效果的具体代码,供大家参考,具体内容如下 本周项目,移动端页面开发,要求丰富的动效,主要技术实现 Canvas ;其...
    99+
    2024-04-02
  • JavaScript canvas实现代码雨效果
    本文实例为大家分享了canvas实现代码雨效果的具体代码,供大家参考,具体内容如下 先看效果图 这个效果图是不是像极了以前电影里面的黑客技术,看起来蛮难的,其实操作起来还是挺简单的...
    99+
    2024-04-02
  • 怎么用html实现流星雨的效果
    小编给大家分享一下怎么用html实现流星雨的效果,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!   <!doctypeh...
    99+
    2024-04-02
  • JavaScript+Canvas实现酷炫的粒子和流星效果
    目录一:粒子效果二:流星效果一:粒子效果 <html> <head> <meta charset="utf-8"> <title&...
    99+
    2023-01-31
    JavaScript实现粒子效果 JavaScript实现流星效果 JavaScript 粒子 JavaScript 流星
  • C语言如何实现流星雨效果
    小编给大家分享一下C语言如何实现流星雨效果,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!上次忘记说了,因为我们是用C语言写的所以是控制台程序,创造不出来界面,那怎...
    99+
    2023-06-25
  • Flutter利用Canvas绘制精美表盘效果详解
    目录前言初始化面板刻度刻度线刻度值指针时针分针秒针动起来前言 趁着周末空闲时间使用 Flutter 的 Canvas制作了一个精美表盘。 最终实现的效果还不错,如下: 前面说到使用...
    99+
    2024-04-02
  • 怎么利用Jetpack Compose实现绘制五角星效果
    本文小编为大家详细介绍“怎么利用Jetpack Compose实现绘制五角星效果”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么利用Jetpack Compose实现绘制五角星效果”文章能帮助大家解决疑惑,下面跟着小...
    99+
    2023-06-30
  • 用Python实现流星雨效果的方法详解
    流星雨的前提是得先有一个流星,所谓流星,就是一个拖着尾巴的直线。所谓拖着尾巴,实际上是我们的浪漫想象,实质无非是尺寸和颜色的渐变罢了。 而matplotlib并不能给一条曲线映射多个...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作