放个烟花迎接龙年春节吧

2024-01-27 20:44

本文主要是介绍放个烟花迎接龙年春节吧,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

不知不觉即将迎来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.chinasem.cn/article/651440

相关文章

2015春节见闻

彭辉 电话 思路决定出路,所见所闻改变。。。。 依靠别人发财不现实, 靠自己  云普 杨威 关系 钱  有能力 钱有些人很容易挣到,家里依旧很难挣到, 阳阳家里土地流转:‘ 石桥月季赚了,  但是种红萝卜 土豆都是赔了,圈几十亩 几百亩越多越赔,有个大学生老头包工头,包几十亩种植西瓜 包包菜赔了, 更多的是赔钱 初7 雷。 新疆哈密

春节如何带奶娃自驾游?不要忘了儿童安全座椅

春节放假,除了合家团圆,有些平常难得有假的人免不了想出门旅游一趟。而现在,最流行的就是自驾游,特别是对那些带了小孩的年轻爸妈而言,带着大包小包一堆东西和一个嗷嗷待哺的娃去挤客车、火车,怎么想怎么觉得不方便。可是,小朋友毕竟不同于大人,要带他们出门,需要注意什么呢?   我有一次带婴儿(当时11个月)长时间(16天)去云南旅行的经历,而且这个春节还会带孩子(20个月)去海南耍15~16天。所

迎接开学第一天!请查收这份2024开学必备好物清单!

新的学期正悄然来临,开学第一天校园里即将迎来一张张充满朝气的面孔。无论是重返课堂的老生还是满怀期待的新生,开学季总是充满了新的希望与挑战。为了帮助学生们更好地适应即将到来的学习生活,我们精心准备了这份2024开学必备好物清单。从提高学习效率的智能设备到保护视力的健康科技产品,再到提升日常便利性的实用小物,请查收这份2024开学必备好物清单!接下来,让我们一起探索那些能够让学习变得更加轻松愉快的好物

2021 牛年春节寄语(附读者红包,每人都有)

窗外日光弹指过,席间花影坐前移。 不知不觉即将步入新的一年,在这辞旧迎新之际,我想和各位读者朋友简单聊一聊这一年来的概况,自己的想法以及对大家的祝福,顺便以现金红包的形式回馈一直陪伴的你,不带们。 去年的除夕,我在每日思考专栏里写下了这段话。 我说 2019 像平静的河水,工作、生活和感情都没有明显的变化,但其实也有在蓄势,期望河水有天能够奔腾。 2020 这条河虽说不上奔腾,但也不再平静,载

羊皮卷之二:我要用全身心的爱来迎接今天

本文固定链接:http://blog.csdn.net/u013108312/article/details/53579214 我要用全身心的爱来迎接今天。   因为,这是一切成功的最大秘密。强力能够劈开一块盾牌,甚至毁灭生命,但是只有爱才具有无与伦比的力量,使人们敞开心扉。在掌握了爱的艺术之前,我只算商场上的无名小卒。我要让爱成为我最大的武器,没有人能抵挡它的威力。   我的理论,他们也许

迎接新的时代——读《工业4.0时代,怎样为孩子筹备未来的教育?》有感

工业1.0的蒸汽时代、工业2.0的电气时代、工业3.0的自动化时代实现了一次又一次的革命,而我们则正在处于工业4.0时代。读了老师推荐的这篇文章:工业4.0时代,怎样为孩子筹备未来的教育?才知道我们现在正处于工业4.0时代,而在提高班很多都已经开始做了很长时间。     一个新的时代,我们可以在很远的地方通过视频面对面的和朋友对话,我们可以不用去逛街,在家里就可以把需要的东西买好

【区块链 + 智慧文旅】虎年春节数字藏品 | FISCO BCOS应用案例

近年来,区块链技术为数字藏品的发展带来了新的可 能。厦门柠静科技有限公司基于FISCO BCOS打造微信小 程序——朴树元宇宙,并推出了冬奥会和冬残奥会视觉艺 术顾问林家卫先生创作的数字艺术藏品。 本次数字藏品以虎年开春为主题,发行量仅10000份, 每个藏品都拥有独一无二的证书号。整个发行流程在朴 数元宇宙的小程序上完成,数字藏品信息记录在联盟链 区块中,确保其可信度和稀缺性。 这次发放验证

JS原生 之------放烟花喽

<!DOCTYPE html><html><head><meta charset="UTF-8"><title>放烟花——欣欣博客</title><style>html,body{overflow:hidden;}body,div,p{margin:0;padding:0;}body{background:#000;font:12px/1.5 arial;color:#7A7A7A;}.fire

【报告分享】2022春节档数据洞察-猫眼研究院(附下载)

摘要:2022春节档数据洞察显示,2022年春节档总票房为60.35亿元,为影史春节档票房第二。2022年春节档平均票价创5年来最高,正月初一平均票价高达56元,相比2021年春节档同期提升6.9元。此外,2022年春节档大盘购票画像显示,男性观众比例较前几年回升,35岁以上观众数量提升、年轻观众下降。2022年春节档持续下沉,三四线城市人次占比小幅度提升,华东地区观影人次39.7%,为各地域

骁龙8 Gen4加持下的科技盛宴:小米15系列,你准备好迎接了吗?

随着科技的飞速发展,智能手机市场的竞争愈发激烈。各大厂商纷纷推出自家的旗舰机型,以期在消费者心中占据一席之地。 小米,作为中国智能手机市场的佼佼者,其每一代产品的发布都备受瞩目。2024年,小米15系列的亮相,无疑将成为科技界的一次盛会。 本文将从四个方面深入分析小米15系列的亮点与市场前景。 一、处理器升级:性能飞跃 据悉,小米15系列将搭载高通即将发布的最新旗舰处理器——骁龙8