一步一步HTML5粒子编辑器
写在前面
大家阅读此文之前,可以先看一篇MiloYip的文章:用JavaScript玩转游戏物理(一)运动学模拟与粒子系统,看完之后再看此文,更加容易理解。
MiloYip使用的粒子是canvas中绘制的圆,还有一些粒子效果是基于 像素级别的,如:火焰字 ,但是使用像素的计算成本太大,因为需要的粒子数量太多,甚至要配合一些nosie算法,如(perlin nosie),计算量太大。
所以一般会先设计好粒子的纹理(每个纹理假设是32*32,一个粒子就包含了九百多个像素了),这样需要的粒子个数不多,计算量也不大,管理粒子的成本也不高(对粒子增删改查)。
canvas globalCompositeOperation
粒子系统在什么时候最漂亮?晚上!所以在绘制纹理的时候,需要设置globalCompositeOperation 的值为lighter。其作用是:在图形重叠的地方,颜色由两种颜色值的加值来决定。
globalCompositeOperation 还有非常多的属性可以设置,详情见:w3school。
粒子系统
粒子系统的本质其实就是粒子从发射到消失的过程。所以,可以立刻想到一些配置项目:
1.发射速度(每个粒子的速度、方向、角度范围)
2.发射区域(定点发射,还是在某个区域发射)
3.重力场(你是在月球上发射,还是在地球上发射,还是太空的失重状态下)
4.粒子纹理(你发射的是激光、还是五角星、还是烟雾)
5.纹理滤镜(激光是红色还是蓝色)
6.发射频率(你是一秒发射一次、还是一秒发射100次)
每个参数的变化都会导致呈现效果截然不同。
数学与物理
比如运动方向的独立性,2维空间可以使用new Vector2(1,2)来描绘速度,把速度拆分成x和y方向,1代表x轴方向的速度,2代表y轴方向的速度
同样,重力场也可以拆封成两个方向。如new Vector2(0,0.98),0代表x轴方向的速度,0.98代表y轴方向的速度
简单的积分思想:(如:速度是加速度在时间上的累加,路程是速度在时间上的累加等等)。
当然,听上去好像要会微积分才能写粒子系统似的,但其实微积分根本体现不再程序里面,因为程序/游戏里面有core loop,loop里面干的事情就是积分… 比如:
tick: function () {
this.velocity.add(this.acceleration);
this.position.add(this.velocity.multiply(0.1));
this.rotatingSpeed+=this.rotatingAcceleration;
this.rotation += this.rotatingSpeed;
this.alpha -= this.hideSpeed;
}
所以有这个思想就行,根本不需要会微积分 = =!
Canvas UI小控件
整个编辑器的所有控件都是canvas写的,感觉就三个词:简单、粗暴、直接。使用起来也非常方便。如,下面这个控制发射范围、粒子、方向的控件:

使用控件的代码:
var dirCtrl=new PE.CircleAdjust({
min: 0,
max: 50,
rotation: -30,
value: 10,
angleRange:50,
change: function (value,angle) {
ps.setAngle(angle);
ps.setSpeed(value);
},
renderTo: document.getElementById("emitAngleCtrl")
});
当然这里不是否定dom写控件,而是,有的时候canvas写UI更具备优势。还有一些场景是dom写控件无法实现的。(比如全局的滤镜效果、波浪效果等,也就是跟像素有关,dom相对较弱)
其他
粒子编辑器,还使用了一些HTML5特性,比如拖拽、FileReader、和blob下载功能。如,基于blob封装了一个工具函数用于下载文件:
Util.downloadFile=function(code, fileName) {
if (window.URL.createObjectURL) {
var fileParts = [code];
var bb = new Blob(fileParts, {
type: "text/plain"
});
var dnlnk = window.URL.createObjectURL(bb);
var dlLink = document.createElement("a");
dlLink.setAttribute("href", dnlnk);
dlLink.setAttribute("download", fileName);
dlLink.click();
}
}
传送门
demo: http://alloyteam.github.io/ParticleEditor/
github: https://github.com/AlloyTeam/ParticleEditor
ps:编辑器使用小测验:你能使用demo的粒子编辑器实现下面那只企鹅效果吗?:)
一步一步HTML5粒子编辑器的更多相关文章
- 只要三步,使用html5+js实现像素风头像生成器
只要三步,使用html5+js实现像素风头像生成器 html5的画布给我们带来了很大的空间,其实像素风格头像生成器只是用到了画方块的方法.画一个像素头像,只要三步,1.解决像素点,2.解决像素点之间的 ...
- 【DG】[三思笔记]一步一步学DataGuard
[DG][三思笔记]一步一步学DataGuard 它有无数个名字,有人叫它dg,有人叫它数据卫士,有人叫它data guard,在oracle的各项特性中它有着举足轻理的地位,它就是(掌声)..... ...
- 一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](一)
前言 大家好,我是Rector 从今天开始,Rector将为大家推出一个关于创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar]的文章系列, ...
- 一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](二)
前言: 在本系列第一篇<一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](一)>中,我为大家介绍了搭建空白解决方案以 ...
- 教你一步一步用 Node.js 制作慕课网视频爬虫
转自:http://www.jianshu.com/p/d7631fc695af 开始 这个教程十分适合初学 Node.js 的初学者看(因为我也是一只初学的菜鸟~) 在这里,我就默认大家都已经在自己 ...
- 一步一步搭建oracle 11gR2 rac+dg之共享磁盘设置(三)【转】
一步一步在RHEL6.5+VMware Workstation 10上搭建 oracle 11gR2 rac + dg 之共享磁盘准备 (三) 注意:这一步是配置rac的过程中非常重要的一步,很多童鞋 ...
- 一步一步构建手机WebApp开发——页面布局篇
继上一篇:一步一步构建手机WebApp开发——环境搭建篇过后,我相信很多朋友都想看看实战案例,这一次的教程是页面布局篇,先上图: 如上图所示,此篇教程便是教初学者如何快速布局这样的页面.废话少说,直接 ...
- 一步一步学Silverlight 2系列(10):使用用户控件
概述 Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, Visual C#, IronRuby, ...
- 一步一步学Silverlight 2系列(1):创建一个基本的Silverlight应用
概述 Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, Visual C#, IronRuby, ...
随机推荐
- 让easyui datagrid支持bootstrap的tooltip
让easyui datagrid支持bootstrap的tooltip 发表于 下午 1:53 by ylpro.net & 分类 Java. Easyui在1.3.3版本之前是不支持tool ...
- OpenCascade B-Spline Basis Function
OpenCascade B-Spline Basis Function eryar@163.com Abstract. B-splines are quite a bit more flexible ...
- Android Studio使用技巧:导出jar包
转自http://blog.csdn.net/lincyang/article/details/44457799 AS中并没有独立的Module 工程,但是可以在普通的Project中加入Module ...
- c/c++多线程模拟系统资源分配(并通过银行家算法避免死锁产生)
银行家算法数据结构 (1)可利用资源向量Available 是个含有m个元素的数组,其中的每一个元素代表一类可利用的资源数目.如果Available[j]=K,则表示系统中现有Rj类资源K个. (2) ...
- 在 ML2 中配置 VXLAN - 每天5分钟玩转 OpenStack(110)
上一节我们介绍了 VXLAN 的基本概念,今天介绍如何在 ML2 中启用 VXLAN. 在 /etc/neutron/plugins/ml2/ml2_conf.ini 设置 vxlan network ...
- jsonp跨域+ashx(示例)
前言 做B/S项目的时候,我们一般使用jquery+ashx来实现异步的一些操作,比如后台获取一些数据到前台,但是如果ashx文件不在本项目下,引用的是别的域下的文件,这时候就访问不了.关于jsonp ...
- winform中textbox属性Multiline=true时全选
1.文本框右键属性 => 添加KeyDown事件. 2.添加如下代码: private void txt_result_KeyDown(object sender, KeyEventArgs e ...
- sublime text 3 配置php开发环境
一.安装Sublime Text 3 官方网址:http://www.sublimetext.com/3 一定要选择ST3,而不是ST2,3比2好用,真的,后面你就知道了. 选择对应的版本安装.完事后 ...
- 如何用 ajax 连接mysql数据库,并且获取从中返回的数据。ajax获取从mysql返回的数据。responseXML分别输出不同数据的方法。
开讲前,先说下网上,大部分的关于这方面的博文或者其他什么的,就我自己的感觉,第一说得不详细,第二语言不能很好的被初学者了解. 我这篇博文的标题之所以用了三句,是为了方便其他人好查找: 这里介绍的方法有 ...
- iOS chart 图表完美解决方案 基于swift
如果打算在app中使用图标功能,这个框架基本能够满足90%的需求 下边是作者的框架的下载地址 ,基于swift2.0 https://github.com/danielgindi/ios-charts ...
