文字烟花特效,用JS代码示爱!程序员小姐姐用这个代码挽回了爱情~

简介: 竟然有一个前端小阿姨问我,如果想要烟花放出来是文字的话怎么实现,她要给男朋友做一个。好家伙,这狗粮洒一地呀

先改造一下烟花的源代码


之前烟花源码里的核心是,我们在创建烟花粒子的时候,赋值了烟花绽放的原点x,y和圆形烟花的半径radius。在绘制烟花动效时,半径不断加大,烟花的动效就出来。


//篇幅限制,仅展现部分代码
function createFireworks(x, y) {
    var count = 100;
    for (var i = 0; i < count; i++) {
        var p = {};
        p.x = x;
        p.y = y;
        p.speed = (Math.random() * 5) + .4;
        p.radius = p.speed;
    }
}
function drawFireworks(){
    for (var i = 0; i < particles.length; i++) {
        var p = particles[i];
        var vx = Math.cos(p.radians) * p.radius;
        var vy = Math.sin(p.radians) * p.radius + 0.4;
        p.x += vx;
        p.y += vy;
        p.radius *= 1 - p.speed / 100;
    }
}


但要实现文字烟花,我们一开始就要把烟花最后的x,y坐标全部精确的计算出来。所以这个烟花的绘制,我们要更改一下逻辑。在createFireworks阶段,就计算出单个粒子的起点x,y终点fx,fy


代码修改后如下


//篇幅限制,仅展现部分代码
function createFireworks(x, y){
    var count = 100;
    for (var i = 0; i < count; i++) {
        var angle = 360 / count * i;
        var p = {};
        p.x = x;
        p.y = y;
        p.radians = angle * Math.PI / 180;
        p.radius = Math.random()*81+50;
        p.fx = x + Math.cos(radians) * p.radius;
        p.fy = y + Math.sin(radians) * p.radius;
    }
}
function drawFireworks() {
    for (var i = 0; i < particles.length; i++) {
        var p = particles[i];
        p.x += (p.fx - p.x)/10;
        p.y += (p.fy - p.y)/10-(p.alpha-1)*p.speed;
    }
}


这样我们就完成了第一步改造,后续我们要把文字写在画布上,并且将其转换为点阵数组,也就是所有烟花粒子的终点坐标。


画布绘制文字


其实和之前那篇《使用Javascript制作BadApple字符画视频》的原理是一样的。通过canvas的APIgetImageData来获得画布指定区域内的全部点阵信息(rgba数组)。


createFireworks方法改造如下


function createFireworks(x,y,text=""){
    if(text!=""){
        //绘制文字
    }else{
        //原有的烟花代码
    }
}


传递一个text参数,当此参数不为空时,我们进入文字烟花的绘制逻辑。


var fontSize = 120;
var textHeight = fontSize;
context.font=fontSize+"px Verdana";
context.fillStyle = "#ffffff";  
context.fillText(text,0,textHeight);


image.png


获取点阵数组


这样我们就能把字绘制在画布上了,接着我们使用getImageData来获得并裁剪点阵信息,因为我们只要一部分的点阵。


var imgData = textctx.getImageData(0,0,textWidth,textHeight);
for (var h = 0; h < textHeight; h+=gap) {
    for(var w = 0; w < textWidth; w+=gap){
            var position = (textWidth * h + w) * 4;
            var r = imgData.data[position], g = imgData.data[position + 1], b = imgData.data[position + 2], a = imgData.data[position + 3];
    }
}


这样我们就拿到了画布里文字绘制区域的全部点阵数据,数据的格式为


[r,g,b,a,r,g,b,a,r,g,b,a]


我们通过一个gap值来跳跃间隔裁剪数据。由于画布是黑色,所以r,g,b都为0的点阵我们就不绘制了,现在将间隔的点阵信息再次绘制到画布中。


var fx = x + w - textWidth/2;
var fy = y + h - textHeight/2;
context.fillStyle = "#ffffff";
context.fillRect(fx,fy,1,1);


我们就会看见~


image.png


image.png


太棒了,这就是我们最终需要的文字烟花粒子的终点信息呀!


现在我们遍历全部的点阵,并创建烟花粒子吧!


for (var h = 0; h < textHeight; h+=gap) {
    for(var w = 0; w < textWidth; w+=gap){
            var position = (textWidth * h + w) * 4;
            var r = imgData.data[position], g = imgData.data[position + 1], b = imgData.data[position + 2];
            if(r+g+b==0)continue;
            var p = {};
            p.x = x;
            p.y = y;
            p.fx = x + w - textWidth/2;
            p.fy = y + h - textHeight/2;
            p.size = Math.floor(Math.random()*2)+1;
            p.speed = 1;
            setupColors(p);
            particles.push(p);
    }
}


文字烟花来了


至此,文字烟花效果,我们就实现了!!!


image.png


用它示爱!


相关文章
|
4天前
|
人工智能 数据可视化 机器人
【通义灵码】三句话生成P5.js粒子特效代码,人人都可以做交互式数字艺术
我发掘出的通义灵码AI程序员新玩法:三句话生成P5.js粒子特效代码,人人都可以做交互式数字艺术
|
3天前
|
人工智能 数据可视化 架构师
三句话生成 P5.js 粒子特效代码,人人都可以做交互式数字艺术
短短几分钟,两个完全不懂P5.js的人类,和通义灵码AI程序员一起,共同完成了有真实物理引擎和碰撞检测的3D仿真动画。人类扮演的角色更像产品经理和架构师,提出开发需求和迭代修改方案,而AI的作用更像码农,任劳任怨,熟练用各种编程语言完成技术底层的脏活累活。这只是AI编程的冰山一角,未来,每一个艺术家都能快速做出自己的创意原型,每一个数学老师都能轻松做出自己的教学动画。
|
2月前
|
人工智能 程序员 UED
【01】完成新年倒计时页面-蛇年新年快乐倒计时领取礼物放烟花html代码优雅草科技央千澈写采用html5+div+CSS+JavaScript-优雅草卓伊凡-做一条关于新年的代码分享给你们-为了C站的分拼一下子
【01】完成新年倒计时页面-蛇年新年快乐倒计时领取礼物放烟花html代码优雅草科技央千澈写采用html5+div+CSS+JavaScript-优雅草卓伊凡-做一条关于新年的代码分享给你们-为了C站的分拼一下子
136 21
【01】完成新年倒计时页面-蛇年新年快乐倒计时领取礼物放烟花html代码优雅草科技央千澈写采用html5+div+CSS+JavaScript-优雅草卓伊凡-做一条关于新年的代码分享给你们-为了C站的分拼一下子
|
6天前
|
自然语言处理 前端开发 JavaScript
20 个 JavaScript 简化技巧,让你的代码更上一层楼!
JavaScript 既灵活又强大,掌握以下20个技巧可助你编写更简洁高效的代码
|
2月前
|
前端开发 JavaScript
【02】v1.0.1更新增加倒计时完成后的放烟花页面-优化播放器-优化结构目录-蛇年新年快乐倒计时领取礼物放烟花html代码优雅草科技央千澈写采用html5+div+CSS+JavaScript-优雅草卓伊凡-做一条关于新年的代码分享给你们-为了C站的分拼一下子
【02】v1.0.1更新增加倒计时完成后的放烟花页面-优化播放器-优化结构目录-蛇年新年快乐倒计时领取礼物放烟花html代码优雅草科技央千澈写采用html5+div+CSS+JavaScript-优雅草卓伊凡-做一条关于新年的代码分享给你们-为了C站的分拼一下子
57 14
【02】v1.0.1更新增加倒计时完成后的放烟花页面-优化播放器-优化结构目录-蛇年新年快乐倒计时领取礼物放烟花html代码优雅草科技央千澈写采用html5+div+CSS+JavaScript-优雅草卓伊凡-做一条关于新年的代码分享给你们-为了C站的分拼一下子
|
2月前
|
人工智能 JavaScript 前端开发
一段 JavaScript 代码,集成网站AI语音助手
根据本教程,只需通过白屏化的界面操作,即可快速构建一个专属的AI智能体。
|
3月前
|
JavaScript 前端开发 测试技术
在 golang 中执行 javascript 代码的方案详解
本文介绍了在 Golang 中执行 JavaScript 代码的四种方法:使用 `otto` 和 `goja` 嵌入式 JavaScript 引擎、通过 `os/exec` 调用 Node.js 外部进程以及使用 WebView 嵌入浏览器。每种方法都有其适用场景,如嵌入简单脚本、运行复杂 Node.js 脚本或在桌面应用中显示 Web 内容。
166 15
在 golang 中执行 javascript 代码的方案详解
|
4月前
|
JavaScript
原生js炫酷随机抽奖中奖效果代码
原生js随机抽奖是一个炫酷的根据数据随机抽奖的代码,该网页可进行随机抽取一个数据,页面动画高科技、炫酷感觉的随机抽奖效果,简单好用,欢迎下载!
97 3
|
4月前
|
JSON JavaScript 关系型数据库
node.js连接GBase 8a 数据库 并进行查询代码示例
node.js连接GBase 8a 数据库 并进行查询代码示例

热门文章

最新文章