【带着canvas去流浪(10)】文字烟花
示例代码托管在:http://www.github.com/dashnowords/blogs
博客园地址:《大史住在大前端》原创博文目录
华为云社区地址:【你要的前端打怪升级指南】
一. 文字烟花
文字烟花的小控件是下面这样的效果,你或许在很多个人博客中见过:
这一节我们就来讲述一下这个小动画的实现方法。
二. 动画原理
首先动画的主框架仍然是我们反复使用的逐帧动画框架,烟花生成以后的部分也不难理解,我们之前已经对物理碰撞进行过仿真,这里实际上就是模拟了带有初速度的自由落体。所以这个小动画里唯一的难点,就是如何根据文字生成烟花,只要做到这一步,其他的部分都比较容易实现。
2.1 像素操作
这里就要用到canvas像素操作的API——context.getImageData( )
了,它可以将画布上指定矩形区域以像素点的形式返回回来,像素数据挂载在返回对象的data
属性上,它是一个一维的Uint8ClampedArray
定型数组,每个值只能取0-255之间的整数,如果赋值超过这个范围,则自动修改为[0,255]
而不会报错。这个一维数组是矩形区域的像素点数据逐行拼接在一起的,每4个点代表一个像素点的RGBA的颜色数据,最后一个通道是透明度数据,例如一个红色的像素点的数据就是[...,255,0,0,0....]。比如你截取了一个长为200像素高为10像素的矩形区域的数据点,那么就会得到一个200*10*4=8000
个数据点的数组。
这是canvas
非常重要的一个API,它的应用场景非常多,例如结合WebRTC
输入的流数据来做视频弹幕,或者使用算法对像素数据进行加工实现各种各样的图片滤镜等,还可以使用离屏canvas
来进行性能提升,具体的应用就留给你自己去探索喽。
2.2 烟花生成算法
获取到像素数据后,我们就可以对其进行分析,分析算法如下:
- 将要获取像素的部分分成大小适中的网格,网格太小则渲染压力大,网格太大动画效果不好。
- 遍历每一个网格,取出小方块区域内所有像素点,也可以一次性读取整个区域的像素点然后按小区域来取用,然后统计其中
dirty
的像素点数量(判断其对应的颜色值是否都为255,如果不是则判定为dirty
),如果区域内脏点的比例超过一定阈值(示例中为60%
)则判定该区域需要被烟花点替换。 - 在需要生成烟花的区域以随机大小和颜色生成一个小球,并根据其位置指定水平初速度的方向,小球均受到竖直向下的重力影响。
- 在帧动画中更新小球状态。
2.3 计时器
最后,我们还需要一个新的timer
对象,之前我们接触到的精灵动画大都是连续的,每一帧都需要进行状态更新,而本节中时间文字的更新是离散的,一秒钟才更新一次,烟花由于有动画过程,也不太适合每秒都生成。所以我们需要在timer
中实现一个内部计时器,每1秒更新一次渲染文字,每2秒触发一次。如果对时间精度要求较高,可以记录时间戳进行比对,如果精度要求不高,可以在update
方法中递增直接对更新周期进行取模即可。
Timer
类的定义如下:
//计时器类
class Timer{
constructor(){
this.lastTime = Date.now(); //初始化的时候记录一次时间
this.label = new Date(this.lastTime).Format('hh:mm:ss');//Format是自定义的格式化方法
this.step = 0;//标记是否刷新时间文字
this.shouldAnim = 0;//标记是否需要生成新的烟花
}
update(){
this.step = (this.step + 1) % 60;//时间文字每60帧刷新一次
this.shouldAnim = (this.shouldAnim + 1) % 120;//烟花每120帧生成一次
if (!this.step) {
this.lastTime = Date.now();
this.label = new Date(this.lastTime).Format('hh:mm:ss');
}
}
paint(ctx){
context.fillStyle = "#353535";
ctx.fillText(this.label, 200, 100);
}
}
主框架部分的代码已经讲过非常多次,本文不再赘述。
【带着canvas去流浪(10)】文字烟花的更多相关文章
- 【带着canvas去流浪】(2)绘制折线图
目录 一. 任务说明 二. 重点提示 三. 示例代码 3.1 一般折线图 3.2 用贝塞尔曲线绘制平滑折线图 四. 大数据量场景 示例代码托管在:https://github.com/dashnowo ...
- 带着canvas去流浪系列之二 绘制折线图
[摘要] 用canvasAPI实现echarts简易图表 示例代码托管在:http://www.github.com/dashnowords/blogs 一. 任务说明 使用原生canvasAPI绘制 ...
- 【带着canvas去流浪(7)】绘制水球图
目录 一. 任务说明 二. 重点提示 三. 示例代码 四. 文字淹水效果的实现 五. 关于canvas抗锯齿 六. 小结 示例代码托管在:http://www.github.com/dashnowor ...
- 【带着canvas去流浪(5)】绘制K线图
目录 一. 任务说明 二. 重点提示 三. 示例代码 示例代码托管在:http://www.github.com/dashnowords/blogs 博客园地址:<大史住在大前端>原创博文 ...
- 【带着canvas去流浪】(1)绘制柱状图
目录 一. 任务说明 二. 重点提示 三. 示例代码 四. 思考题 示例代码托管在:http://www.github.com/dashnowords/blogs 博客园地址:<大史住在大前端& ...
- 【带着canvas去流浪(11)】Three.js入门学习笔记
目录 一. 资料推荐及建议 二. Three.js中的基本概念 三.重点笔记 四.补充示例 示例代码托管在:http://www.github.com/dashnowords/blogs 博客园地址: ...
- 带着canvas去流浪系列之一:绘制柱状图
[摘要] 学习使用canvasAPI来实现数据可视化. 示例代码托管在:http://www.github.com/dashnowords/blogs 一. 任务说明 使用原生canvasAPI绘制柱 ...
- 带着canvas去流浪系列之五 绘制K线图
[摘要] 用canvas原生API实现百度Echarts 示例代码托管在:http://www.github.com/dashnowords/blogs 一. 任务说明 使用原生canvasAPI绘制 ...
- 带着canvas去流浪系列之七 绘制水球图
[摘要] 用原生canvasAPI实现百度echarts 示例代码托管在:http://www.github.com/dashnowords/blogs 一. 任务说明 使用原生canvasAPI绘制 ...
随机推荐
- EFCore连接池的坑 差点晚年不保
长话短说 上个月公司上线了一个物联网数据科学项目,我主要负责前端接受物联网事件,并提供 参数下载. webapp 部署在Azure云上,参数使用Azure SQL Server存储. 最近从灰度测试转 ...
- Go 面试每天一篇(第 65 天)
Go 面试每天一篇(第 65 天) 1.下面列举的是 recover() 的几种调用方式,哪些是正确的? A. 1func main() { 2 recover() 3 panic(1) 4} B. ...
- 《Java基础知识》Java数据类型以及变量的定义
Java 是一种强类型的语言,声明变量时必须指明数据类型.变量(variable)的值占据一定的内存空间.不同类型的变量占据不同的大小. Java中共有8种基本数据类型,包括4 种整型.2 种浮点型. ...
- 张亦总结《AG百家乐庄闲,龙虎中下三路技巧和三株路的运用》
关于三珠路的各种打法,这里我做个详细的讲解 三珠路的打法源于澳门赌王叶汉,需要了解赌王叶汉的著作<BJL投注公式>的可以加我Q:<10353581>进行详细解答 叶汉的打法 ...
- jTopo HTML5 Canvas 画图组件
jTopo是什么? jTopo(Javascript Topology library)是一款完全基于HTML5 Canvas的关系.拓扑图形化界面开发工具包. jTopo关注于数据的图形展示,它是面 ...
- SAP QA32试图做UD,系统报错-工厂 BTYC中的 QM 基选设置需要维护
SAP QA32 试图做UD,系统报错 - 工厂 BTYC 中的 QM 基选设置需要维护 - 检验批 10000062593,试图做使用决策,系统报错, 工厂 BTYC 中的 QM 基选设置需要维护 ...
- Linux Bash文本操作之sed篇其一
作为Linux系统中文本处理的强力工具之一,sed功能强大,用法多变,值得我们好好学习. sed是用于过滤和转换文本的流编辑器. 一般情况下sed把当前处理的行存储在临时缓冲区,按指定命令处理之后将缓 ...
- css3 中的渐变
虽说css3 都已经使用多年了,但是关于css3的渐变用的很少.今天遇见了,就学习了一下. 首先我们打开ps,新建一个画布,选择渐变工具,这个时候我们能够看到顶栏上面的渐变类型如下 第一个我们选中的是 ...
- gitlab如何从Github导入项目
本文简单演示如何Github上导入项目到私人搭建的Gitlab中,搭建过程参考:CentOS7 搭建gitlab服务器. Gitlab版本是gitlab-ce-12.0.2,界面可能稍有差异,但应该影 ...
- PHP-FPM 使用(含多站点多端口)
PHP-FPM 使用 PHP-FPM 是在 Linux 环境下用来管理调度 PHP 执行的调度器,源码安装时会自动安装,PHP 安装可参考Centos 下安装 PHP (新) 查看版本 # php-f ...