放个烟花迎接龙年春节吧

不知不觉即将迎来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)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/434094.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

程序员的你,是不是又被催婚了

程序员作为社会中一个较为特殊的群体&#xff0c;由于工作特性&#xff08;如长时间对着电脑、工作节奏较快、加班相对频繁等&#xff09;以及职业发展需要投入大量时间和精力&#xff0c;有时可能会面临较晚结婚的问题。这也导致了在某些情况下&#xff0c;他们可能被家人或朋…

【Linux】什么是.bashrc,以及其使用方法

经常在配置linux各种环境的时候&#xff0c;遇到对bashrc的配置。当时也只是机械地跟着教程&#xff0c;一步步输入指令&#xff1b;遇到的次数多了&#xff0c;想知道.bashrc究竟是何方神圣。于是整理了下其主要功能以及使用方法。 一、什么是.bashrc .bashrc&#xff0c;属…

Go 知识for-range

Go 知识for-range 1. for-range 的用法1.1 数组1.2 切片1.3 字符串1.4 map1.5 chan 2. 原理2.1 数组2.2 切片2.3 字符串2.4 map2.5 chan 3. 总结 https://a18792721831.github.io/ 1. for-range 的用法 for-range 表达式用于遍历集合元素&#xff0c;比传统的for更加简单直观…

03-Redis缓存高可用集群

文章目录 1、Redis集群方案比较2、Redis高可用集群搭建redis集群搭建Java操作redis集群 4、Redis集群原理分析槽位定位算法跳转重定位Redis集群节点间的通信机制gossip通信的10000端口网络抖动 Redis集群选举原理分析集群脑裂数据丢失问题集群是否完整才能对外提供服务Redis集群…

【LeetCode每日一题】2865. 美丽塔 I

2024-1-24 文章目录 [2865. 美丽塔 I](https://leetcode.cn/problems/beautiful-towers-i/) 2865. 美丽塔 I 初始化变量 ans 为0&#xff0c;用于记录最大的和值。获取整数列表的长度&#xff0c;保存到变量 n 中。使用一个循环遍历列表中的每个位置&#xff0c;从0到n-1。在循…

【JavaEE】网络原理: 网络编程套接字(概念)

目录 1.什么是网络编程 2.网络编程中的基本概念 2.1发送端和接收端 2.2请求和响应 2.3客户端和服务端 3.Socket套接字 4.Socket编程注意事项 1.什么是网络编程 网络编程&#xff0c;指网络上的主机&#xff0c;通过不同的进程&#xff0c;以编程的方式实现网络通信 (…

【C++】类和对象(中篇)(全网最细!!!)

文章目录 &#x1f354;一、类的六个默认成员函数&#x1f354;二、构造函数&#x1f35f;1、概念&#x1f35f;2、特性&#x1f369;默认构造函数 &#x1f354;三、析构函数&#x1f35f;1、概念&#x1f35f;2、特性&#x1f369;默认析构函数 &#x1f354;四、拷贝构造函数…

STL之queue 【队列】

STL之queue 【队列】 一.基本用法1.头文件2.创建queue3.插入元素&#xff1a;4.删除元素(弹出元素)&#xff1a;5.访问队列的前端元素6.访问队列的后端元素7.检查队列是否为空8.获取队列的大小 二.综合示例&#xff1a;用C语言实现队列queue常见的应用场景包括&#xff1a; que…

Redis2-事务 连接Java 整合springboot 注解缓存

一、订阅和发布 Redis 发布订阅 (pub/sub) 是一种消息通信模式&#xff1a;发送者 (pub) 发送消息&#xff0c;订阅者 (sub) 接收消息。 Redis 客户端可以订阅任意数量的频道。 Redis的发布和订阅 客户端订阅频道发布的消息 频道发布消息 订阅者就可以收到消息 发布订阅的代…

图像噪声、去噪基本方法合集(Python实现)

文章目录 前言 本文主要参考冈萨雷斯的数字图像处理 &#xff08;第4版&#xff09;&#xff0c;介绍图片中一些常见的噪声形式和常用的去噪方法&#xff0c;并且给出相应滤波方法的实现代码。 一、噪声分类 1、高斯噪声2、泊松噪声3、椒盐噪声4、瑞利噪声5、爱尔兰&#xff0…

基于 java+springboot+mybatis电影售票网站管理系统前台+后台设计和实现

基于 javaspringbootmybatis电影售票网站管理系统前台后台设计和实现 &#x1f345; 作者主页 央顺技术团队 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 文末获取源码联系方式 &#x1f4dd; &#x1f345; 查看下方微信号获取联系方式 承…

node12集成form-create遇到的问题

其他版本需要根据node版本以及npm调整 无法安装 taobao镜像出现问题 跟换为最新版本的 // 1. 清空缓存 npm cache clean --force // 2. 关闭SSL验证 npm config set strict-ssl false // 3. 切换新源 npm config set registry https://registry.npmmirror.com // 4. 查看源是…