首页 > 其他分享 >放个烟花迎接龙年春节吧

放个烟花迎接龙年春节吧

时间:2024-01-29 19:02:07浏览次数:80  
标签:function self ctx pos 烟花 放个 radius 龙年

不知不觉即将迎来2024龙年春节了。龙的形象在中国传统文化中有着广泛的应用,比如在传统文化中,龙代表着权力、威严、吉祥和神灵的象征,同时也是生命力和繁荣的象征。

今天的文章将用原生JavaScriptCanvas API实现一个烟花的效果,效果如下所示,在放烟花的过程中将「龙年大吉」的文字逐渐显示出来。

接下来开始具体的代码实现过程,针对重点实现代码进行解析,详情完整代码请看源码实现。烟花效果通常由多个元素组成,包括烟花、粒子、画布等。以下是对代码中关键部分的详细解析:

Fireworks 类

Fireworks 类定义了烟花的行为,包括创建、绘制和更新烟花。其中的 canvasLoop 方法用于循环绘制画布,drawFireworks 方法用于绘制烟花的效果,updateFireworks 方法用于更新烟花的位置和状态。

// Fireworks 类
var Fireworks = function () {
  // ... 省略部分代码 ...
  self.canvasLoop = function () {
    // 循环绘制画布
    window.requestAnimationFrame(self.canvasLoop, self.canvas);
    self.ctx.globalCompositeOperation = 'destination-out';
    self.ctx.fillStyle = 'rgba(0,0,0,' + self.clearAlpha / 100 + ')';
    self.ctx.fillRect(0, 0, self.cw, self.ch);
    self.updateFireworks();
    self.updateParticles();
    self.drawFireworks();
    self.drawParticles();
  };
  // ... 省略部分代码 ...
  self.drawFireworks = function () {
    // 绘制烟花效果
  };
  self.updateFireworks = function () {
    // 更新烟花状态
  };
  self.createParticles = function () {
    // 绘制粒子效果
  };
  self.updateParticles = function () {
    // 更新粒子状态
  };
};

Particle 类

Particle 类表示烟花中的粒子,包括粒子的位置、速度、颜色等属性。在代码中,粒子的更新和绘制分别由 updatedraw 方法实现。

// Particle 类
class Particle {
  constructor(pos, target, vel, color, radius) {
    // 粒子属性的初始化
    this.pos = pos;
    this.target = target;
    this.vel = vel;
    this.color = color;
    this.radius = radius;
    this.direction = 0;
  }
  set(type, value) {
    this[type] = value;
  }
  // 更新粒子状态
  update() {
    this.radius = 2;
    this.vel.x = (this.pos.x - this.target.x) / drag;
    this.vel.y = (this.pos.y - this.target.y) / drag;
    this.pos.x -= this.vel.x;
    this.pos.y -= this.vel.y;
  }
  // 绘制粒子
  draw() {
    ctx.beginPath();
    ctx.fillStyle = this.color;
    ctx.arc(this.pos.x, this.pos.y, this.radius, 0, Math.PI * 2);
    ctx.fill();
  }
}

changeText 函数

changeText 函数用于在画布上绘制文字,并根据文字生成粒子效果(调用Particle类)。它通过获取画布上的像素数据,根据像素的不透明度生成粒子,并将这些粒子添加到 particles 数组中。

function changeText(text) {
  var current = 0,
    temp, radius, color;
  ctx.fillStyle = "#fff";
  ctx.font = "160px 宋体";
  ctx.fillText(text, can.width * 0.5 - ctx.measureText(text).width * 0.5, can.height * 0.5 + 60);
  var data = ctx.getImageData(0, 0, can.width, can.height).data;
  for (i = 0; i < data.length; i += 12) {
    if (data[i] !== 0 && (Math.random() * 10) >= 7.8) {
      radius = max_radius - Math.random() * min_radius;
      temp = { x: (i / 4) % can.width, y: ((i / 4) / can.width) };
      color = colors[0];
      var p = new Particle(
        temp, { x: (i / 4) % can.width, y: ((i / 4) / can.width) }, { x: 0, y: 0 },
        color,
        radius);
      particles.push(p);
      ++current;
    }
  }
  particles.splice(current, particles.length - current);
}

在程序初始化执行时运行changeText("龙年大吉"),这样即可触发对传入文字逐渐显示的烟花效果。

draw 函数

draw 函数用于绘制单个粒子,根据传入的参数绘制指定位置和颜色的圆形粒子。

function draw(obj) {
  ctx.beginPath();
  ctx.arc(obj.target.x, obj.target.y, obj.radius, 0, 2 * Math.PI);
  ctx.fillStyle = obj.color;
  ctx.fill();
}

init 函数

init 函数是整个烟花效果的初始化函数,它通过循环绘制粒子的方式实现烟花效果。在每一帧中,它会绘制下一个粒子,并根据条件创建新的烟花效果。

function init() {
  id = window.requestAnimationFrame(init)
  if (t >= particles.length - 1) {
    window.cancelAnimationFrame(id)
  }
  draw(particles[t])
  t++;
  var rand = function (rMi, rMa) { return ~~((Math.random() * (rMa - rMi + 1)) + rMi); }
  if (t % 8 == 0) {
    fworks.currentHue = rand(0, 360);
    fworks.createFireworks(window.innerWidth / 2, window. innerHeight, particles[t].pos.x, particles[t].pos.y);
  }
}

以上是对代码中关键部分的解析,通过这些代码,即可实现一个炫丽的烟花效果,部分代码量较大没有完整贴出,有兴趣可以查阅源码了解。

点击鼠标放烟花

基于以上代码,监听鼠标事件,用户点击时通过createFireworks创建新的烟花。

self.canvas.addEventListener('mousedown', function (e) {
  self.mx = e.pageX - self.canvas.offsetLeft;
  self.my = e.pageY - self.canvas.offsetTop;
  self.currentHue = rand(self.hueMin, self.hueMax);
  self.createFireworks(self.cw / 2, self.ch, self.mx, self.my);
});

点击效果如下:

最后

本文利用原生JavaScript和Canvas API创造出一个很不错烟花视觉效果,并在烟花中逐渐显示出「龙年大吉」的文字,有兴趣可以修改代码传入其他文字的效果。

关注公众号回复【 20240127 】可获取完整源代码~

参考

原效果参考,代码有所删改:www.jq22.com/jquery-info17933


看完本文如果觉得有用,记得点个赞支持,收藏起来说不定哪天就用上啦~

专注前端开发,分享前端相关技术干货,公众号:南城大前端(ID: nanchengfe)

标签:function,self,ctx,pos,烟花,放个,radius,龙年
From: https://blog.51cto.com/react/9444064

相关文章

  • 效果图云渲染活动“喜迎龙年,渲染有礼”正式上线
    Renderbus瑞云渲染在2024年新年之际,特别推出了一个促销活动以庆祝“龙年”,并作为回馈给致力于效果图制作的客户们。在这次活动中,客户们可以在充值期间获得一些可通用的渲染券,这些券可以在后续进行影视动画或效果图渲染时使用。让我们一探究竟,看看此次优惠活动都包含哪些内容。......
  • 烟花燃放如何管控?智能分析网关V4烟火检测保障烟火安全
    一、方案背景随着元旦佳节的热潮退去,春节也即将来临,在众多传统的中国节日里,烟花与烧纸祭祀都是必不可少的,一方面表达了人们对节日的庆祝的期许,另一方面也是一种对故者思念的寄托。烟花爆竹的燃放不仅存在着巨大的安全隐患,还极易污染环境,虽然各地在节日来临之前都会发布禁燃禁放烟......
  • 用html+css+js做canvas烟花模拟网页动画代码
    圣诞节、元旦就要到了,本案例我们将用html+css+js做canvas烟花模拟网页动画代码,程序员的浪漫这不就来了嘛,与家人朋友一起看烟花吧!   附源码<!DOCTYPEhtml><htmllang="en"><head> <metacharset="UTF-8"/> <title>烟花模拟器</title> <metaname="viewport"......
  • 烟花爆竹厂如何做到0风险0爆炸事故?AI+视频监控技术给出答案
    由于烟花爆竹具有易燃易爆风险,稍有不慎就会发生严重事故,而烟花爆竹厂区作为大量烟花爆竹存放地点,厂区面积大、工作人员杂乱,甚至有很多厂区原料存放不当,给日常的安全管理带来极大的压力,利用信息化手段结合传统视频监管就可大力提升烟花爆竹厂区的安全监管效率。方案实现1、远程监控......
  • H5用canvas放烟花
    很久很久以前的一个很流行的javaApplet放烟花效果,当初移到android过,这次摸鱼时间翻译成js代码,用canvas实现这么多年,终于能大致看懂这代码了,已经实现透明效果,只需要给body弄个好看的背景图片就行,但需要主色为深色,看到的人谁有兴趣美化下,弄个背景加个声音啥的,不过没啥用......
  • 3d烟花效果的实现(附源码)
    这里没有办法展示动态效果,具体动态效果请复制代码去浏览器中查看:CSS部分:<style>html,body{margin:0px;width:100%;height:100%;overflow:hidden;background:#000;}#canvas{width:100%;height:100%;}</style>HTML部分:<body><can......
  • 绚烂烟花散去,又是新的一年奔波……
    绚烂烟花散去,又是新的一年奔波……星云_fighting关注IP属地:江西62023.02.0523:25:05字数1,933阅读162今天,又是一年一度的元宵佳节,也是春节的收尾,更是新的一年生活的期盼与奔波,也许会有诸多的未知在等待,不过,这又有什么关系呢?生活不就是有着诸多未知,才让我们有了更多......
  • 今天520,来个烟花吧
    '''name:圣诞树+烟火author:Babysen''' importturtleastimportrandomimportthreadingimporttimeimporttkinterastkimportmathfrommathimportcos,sin,atan,sqrtimportnumpyasnp t.screensize(bg='black')#定义背景颜色 #心......
  • 烟花完整版
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>Document</title><style>#container{width:80%;......
  • m基于优化算法的多车辆的路径规划matlab仿真,对比GA,PSO以及烟花算法
    1.算法描述路径规划是运动规划的主要研究内容之一。运动规划由路径规划和轨迹规划组成,连接起点位置和终点位置的序列点或曲线称之为路径,构成路径的策略称之为路径规划。路......