炒鸡简单的canvas粒子(山东数漫江湖)
位图的canvas一直不会被svg比下去的原因了。 俗话说,须弥芥子,是大小之说,也有以小见大之说,颗颗粒子,足以构建宏大效果。 这是一篇炒鸡简单的canvas粒子教程,主要是讲如何粒子特效的原理,一点运动中的公式。
有所准备
首先,当我们知道要做粒子的效果的时候,我们要思考我们如何来实现,而且还要尽可能的面对我们亲爱的对象,于是便有了如下的思考。
- 要有粒子
- 粒子在运动,运动就需要速度
- 匀速运动/变速运动
- 运动之外还需要哪些处理
全局中的永恒
这里我定义了时间与粒子生成的数量,还有一个粒子池。
也许会很奇怪,我们在运动的过程中每一帧都是时间,为什么还要再设置这个时间,浏览器的渲染可以被看作正常流逝的时间,这里的time则是相对时间 如果感觉晕晕的,
这里可以举个小李子:
光在世界中沿直线传播,你现在所能看到的月光是很久之前的月光,这就说明很久之前的月光一直在传播,同时也意味着你的一切动作都还在传播的过程中,只要你的速度足够快,就可以追上你的过去。
开个小玩笑了,其实time的意思就是你的1s对于小球而言是2s,浏览器渲染设置的时间只是为了让你的视觉上看不出图像的卡顿
const time=2;
const num=20;
var dots=[];
粒子类
function dot(x,y,vx,vy){
//接收粒子点的坐标与方向速度量
this.x=x;
this.y=y;
this.vx=vx;
this.vy=vy;
//随机粒子大小
this.size=Math.ceil(Math.random()*3+2);
this.ctx={};
}
//粒子渲染
dot.prototype.render = function(ctx) {
ctx.save();
this.ctx=ctx;
this.ctx.beginPath();
this.ctx.fillStyle='lightgray';
this.ctx.arc(this.x-this.size/2,this.y-this.size/2,this.size,0,Math.PI*2);
this.ctx.closePath();
this.ctx.fill();
ctx.restore();
};
//对当前粒子属性做逻辑计算
dot.prototype.update = function() {
this.ctx.clearRect(0,0,canvas.width,canvas.heihgt);
this.x=this.x+this.vx*time;
this.y=this.y+this.vy*time;
this.vx = (this.x < canvas.width && this.x > 0) ? this.vx : (-this.vx);
this.vy = (this.y < canvas.height && this.y > 0) ? this.vy : (-this.vy);
this.render(this.ctx);
};
在当前粒子类中,我只给了速度的方向量,因为我们只要求粒子做匀速运动,这里的计算公式则是x=vt(x:位移 v:平均速度 t:运动时间)
如果要对粒子施加力或者变速运动,则需要this.a=a来添加一个加速度的属性。然后根据加速度的方向做水平与垂直的分解,并且对速度的方向量产生作用,从而进行变速运动,这里的公式如下
- v=at
- x=(v0+at/2)*t
v0为初速度,a为加速度的方向量,x为方向上的位移
祸乱世界的粒子
for(let i=0;i<num;i++){
var x=Math.ceil(Math.random()*canvas.width);
var y=Math.ceil(Math.random()*canvas.height);
var vx=Math.ceil(Math.random()*2);
var vy=Math.ceil(Math.random()*2);
var d=new dot(x,y,vx,vy);
d.render(ctx);
dots.push(d);
}
通过对canvas的宽高进行随机取整来获取随机的坐标点。并且实例化我们的粒子。并且推入粒子池中。 这里因为我们在update方法中会直接调用render,所以我们只需要在实例化的时候执行一次render将ctx环境传入,后面就可以全部交给update来完成了。
躁动吧 粒子球
requestAnimFrame(anim);
function anim(){
for(let i=0;i<dots.length;i++){
dots[i].update();
}
requestAnimFrame(anim);
}
这里我们只需要对粒子池中的粒子进行数据持续更新,就可以让粒子们跑起来了。
粒子的教程比较简单,但确是几乎所有粒子效果的依托,粒子已经可以生成,那么只需要让粒子在我们的规定路径上运动,就可以达到我们所需要的效果了。
拓展思维
知乎背景的网状效果
遍历所有粒子点,如果在范围内,则使用
moveTo与llineTo来生成连接线。粒子成字
将文字先绘制在离屏canvas上,然后返回所有不透明像素点的坐标,遍历时可以直接遍历,也可以使用
width与height来计算,如果当前点需要绘制,就生成粒子。这里说到像素点不透明,是因为在canvas上,你只要不设置,默认是不存在背景色,也就说,所有绘制的所有像素都可以通过判断其
alpha值是否为0来判断,也可以通过设置alpha的阈值来将一些填充度不够的点给扔除。比如说当alpha对应为128的时候,透明度约为0.5,这也是为什么很多人的博客里都用到了128这个判断值。还有很多的效果,粒子特效是一个很大的话题,如AE Unity等软件中都会有内置的粒子插件与外置的大量粒子效果插件。
后面还会写一些有些高度的粒子效果
不定期更新canvas与svg的相关技术教程,有实战型,也会有主原理型的,2d 2.5d 3d都会包含到,同时涉及的有 线性代数 物理 图形学等相关的基础知识。
本次demo源码:粒子效果

炒鸡简单的canvas粒子(山东数漫江湖)的更多相关文章
- Redux系列02:一个炒鸡简单的react+redux例子
前言 在<Redux系列01:从一个简单例子了解action.store.reducer>里面,我们已经对redux的核心概念做了必要的讲解.接下来,同样是通过一个简单的例子,来讲解如何将 ...
- 啊啊啊啊啊啊啊今天就写,炒鸡简单 数据库Sqlite的创建,库的增删改查
啦啦啦啦啦啦啦 写这个不用多长时间,我直接写代码注释都是些语句,Sql语句和Api来操作数据库 ,语句的参数我会注释 SQLite数据库创建数据库需要使用的api:SQLiteOpenHelper必须 ...
- Python制作动态二维码只需要一行代码!炒鸡简单!
分享一个比较有意思的项目,只需要一行Python代码就可以快捷方便生成普通二维码.艺术二维码(黑白/彩色)和动态GIF二维码. 用法比较简单,直接通过pip安装即可. pip3 install myq ...
- 炒鸡简单的javaScript的call和apply方法
解释一 作者:杨志 链接:https://www.zhihu.com/question/20289071/answer/14644278 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商 ...
- ES6中Fetch的封装及使用,炒鸡简单~
之前写过一篇<ajax.axios.fetch之间的详细区别以及优缺点> 戳这里 1.封装 (http.js) class Ajax { get(url) { return new Pro ...
- 教你 Shiro 整合 SpringBoot,避开各种坑(山东数漫江湖)
依赖包 <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-sprin ...
- 老生常谈-Activity(山东数漫江湖)
对于activity的七个声生命周期回调,总是被大家翻来覆去的说,甚至说的都有些厌烦了,这部分知识虽然基础但也很重要,谁都不想在面试的时候只说出个一知半解,下面的分析是对阅读<安卓开发艺术探索& ...
- Web Session 浅入浅出(山东数漫江湖)
使用过几种Web App开发语言和框架,都会接触到Session的概念.即使是一个简单站点访问计数的功能,也常常使用Session来实现的.其他常用的领域还有购物车,登录用户等.但是,对Session ...
- Hadoop大数据生态系统及常用组件(山东数漫江湖)
经过多年信息化建设,我们已经进入一个神奇的“大数据”时代,无论是在通讯社交过程中使用的微信.QQ.电话.短信,还是吃喝玩乐时的用到的团购.电商.移动支付,都不断产生海量信息数据,数据和我们的工作生活密 ...
随机推荐
- lintcode-6-合并排序数组
合并排序数组 合并两个排序的整数数组A和B变成一个新的数组. 样例 给出A=[1,2,3,4],B=[2,4,5,6],返回 [1,2,2,3,4,4,5,6] 挑战 你能否优化你的算法,如果其中一个 ...
- TCP系列06—连接管理—5、TCP fastopen(TFO)
一.TFO背景 当前web和web-like应用中一般都是在三次握手后开始数据传输,相比于UDP,多了一个RTT的时延,即使当前很多应用使用长连接来处理这种情况,但是仍然由一定比例的短连接,这额外多出 ...
- 3dContactPointAnnotationTool开发日志(十)
要是那几个状态栏不能拖动的话岂不是显得太呆板了,于是我又参考Unity官方视频教程学习了如何实现拖动状态栏的功能,还挺简单的. 比如说要拖动这个PanelStatus面板,我只让使用者通过拖动 ...
- Zabbix监控配置
Zabbix在线文档 https://www.zabbix.com/documentation/4.0/zh/manual/config/hosts 1.我们启动服务后,我们看到了端口都正在监听,但是 ...
- 【其他】VS提示不一致的行尾
应该是用不同的编辑器或平台编辑过同一个文件,比如Windows是\r\n,有的系统只有一个\n, 需要都统一,否则代码可能会堆成一堆.
- matlab isfield
isfield 函数功能:判断输入是否是结构体数组的域(成员). 调用格式: tf=isfield(S,'fieldname') 检查结构体S是否包含由fieldname指定的域,如果包含,返回逻辑1 ...
- BZOJ4773 负环(floyd+倍增)
倍增floyd求出经过<=2k条边时两点间最短路,一个点到自身的最短路就是包含该点的最小环.然后倍增找答案即可.注意初始时到自身的最短路设为0,这样求出的最短路就是经过<=2k条边的而不是 ...
- P1491 集合位置
题目描述 每次有大的活动,大家都要在一起“聚一聚”,不管是去好乐迪,还是避风塘,或者汤姆熊,大家都要玩的痛快.还记得心语和花儿在跳舞机上的激情与释放,还记得草草的投篮技艺是如此的高超,还记得狗狗的枪法 ...
- [洛谷P4999]烦人的数学作业
题目大意:定义$f(x)$表示$x$每一个数位(十进制)的数之和,求$\sum\limits_{i=l}^rf(i)$,多组询问. 题解:数位$DP$,可以求出每个数字的出现个数,再乘上每个数字的大小 ...
- 存储引擎(Mysql)
最常使用的2种存储引擎:1.Myisam是Mysql的默认存储引擎,当create创建新表时,未指定新表的存储引擎时,默认使用Myisam.每个MyISAM在磁盘上存储成三个文件.文件名都和表名相同, ...