文字烟花特效,用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


用它示爱!


相关文章
|
2月前
|
JavaScript
短小精悍的js代码
【10月更文挑战第17天】
126 58
|
25天前
|
JavaScript
原生js炫酷随机抽奖中奖效果代码
原生js随机抽奖是一个炫酷的根据数据随机抽奖的代码,该网页可进行随机抽取一个数据,页面动画高科技、炫酷感觉的随机抽奖效果,简单好用,欢迎下载!
42 3
原生js炫酷随机抽奖中奖效果代码
|
5天前
|
JSON JavaScript 关系型数据库
node.js连接GBase 8a 数据库 并进行查询代码示例
node.js连接GBase 8a 数据库 并进行查询代码示例
|
1月前
|
JavaScript 前端开发 开发者
如何在 Visual Studio Code (VSCode) 中使用 ESLint 和 Prettier 检查代码规范并自动格式化 Vue.js 代码,包括安装插件、配置 ESLint 和 Prettier 以及 VSCode 设置的具体步骤
随着前端开发技术的快速发展,代码规范和格式化工具变得尤为重要。本文介绍了如何在 Visual Studio Code (VSCode) 中使用 ESLint 和 Prettier 检查代码规范并自动格式化 Vue.js 代码,包括安装插件、配置 ESLint 和 Prettier 以及 VSCode 设置的具体步骤。通过这些工具,可以显著提升编码效率和代码质量。
299 4
|
1月前
|
JSON 移动开发 数据格式
html5+css3+js移动端带歌词音乐播放器代码
音乐播放器特效是一款html5+css3+js制作的手机移动端音乐播放器代码,带歌词显示。包括支持单曲循环,歌词显示,歌曲搜索,音量控制,列表循环等功能。利用json获取音乐歌单和歌词,基于html5 audio属性手机音乐播放器代码。
94 6
|
28天前
|
JavaScript 前端开发 开发者
如何在 Visual Studio Code (VSCode) 中使用 ESLint 和 Prettier 检查代码规范并自动格式化 Vue.js 代码
随着前端开发技术的快速发展,代码规范和格式化工具变得尤为重要。本文介绍如何在 Visual Studio Code (VSCode) 中使用 ESLint 和 Prettier 检查代码规范并自动格式化 Vue.js 代码。通过安装和配置这些工具,可以确保代码风格一致,提高代码质量和可读性。
61 1
|
2月前
|
JavaScript 前端开发 开发者
如何在 VSCode 中使用 ESLint 和 Prettier 检查并自动格式化 Vue.js 代码,提升团队协作效率和代码质量。
【10月更文挑战第9天】随着前端开发技术的发展,代码规范和格式化工具变得至关重要。本文介绍如何在 VSCode 中使用 ESLint 和 Prettier 检查并自动格式化 Vue.js 代码,提升团队协作效率和代码质量。通过安装插件、配置 ESLint 和 Prettier,以及设置 VSCode,实现代码实时检查和格式化,确保代码风格一致。
53 2
|
2月前
|
JavaScript 前端开发 开发者
如何在 Visual Studio Code (VSCode) 中使用 ESLint 和 Prettier 检查并自动格式化 Vue.js 代码,提升代码质量和团队协作效率。
【10月更文挑战第8天】本文介绍了如何在 Visual Studio Code (VSCode) 中使用 ESLint 和 Prettier 检查并自动格式化 Vue.js 代码,提升代码质量和团队协作效率。通过安装 VSCode 插件、配置 ESLint 和 Prettier,实现代码规范检查和自动格式化,确保代码风格一致,提高可读性和维护性。
98 2
|
2月前
|
自然语言处理 JavaScript 前端开发
深入理解JavaScript中的闭包:原理、应用与代码演示
【10月更文挑战第12天】深入理解JavaScript中的闭包:原理、应用与代码演示