java烟花原理
0.缘由
两天前无聊玩了下蜘蛛纸牌,发现最后胜利时的烟花效果挺漂亮的。琢磨Java能不能弄出来类似的效果,上网搜了一下,整合资料(基本全是抄的)之后自己写了一份。重点讲原理,源码放文末。上一个效果图。
1.概述
其实烟花说白了就是放射线,先确定爆炸中心点(Xx,Xy),然后在爆炸区随机产生一些爆炸截止点(Xx+Ex,Xy+Ey),之后就是
多线程划线问题了,再加上色彩,弯曲就很像日常生活的烟花了。
2.基本属性
上图就是烟花类的全部属性
width,height , G 分别理解为宽,高,重力,属于环境属性
(Xx,Xy)是爆炸中心点,(Ex[ ],Ey[ ])是一组截止点距离中心点的增量, x和y表示爆炸过程的增量
energy表示爆炸的威力,简单说就是炸多远;patch表示炸成多少块碎片
t 和 length 是进度属性, 比如中心点到截止点之间要画 length个点,现在画了t个
红绿蓝三个是颜色属性,在色彩小节会讲到
3.关于色彩
不仅每一个烟花之间的颜色是不一样的,而且同一个烟花在炸的过程中,它会变颜色。在程序中,通过随机数+RGB来实现
具体看代码
在爆炸的过程中,之前定义的Red,Green和Blue 在【-32,+32】的区间内随机移动,每画一个点,这三个颜色变量的值都可能发生小幅度的变化(±32),然后由这三个变量生成的Color就是渐变的了,这就是实现爆炸过程中变色的主要代码
4.关于消失
烟花爆炸完之后,又得是黑夜。所以我们得想办法让他消失。本程序的做法是黑线覆画。彩色线过一遍,黑色线再覆盖掉,和黑夜一样色,所以就是所谓的消失。但是速度是一个问题。如果黑线和彩线一样快,那么我们只能看到一个彩色点。所以我们把黑色线的速度调到彩色线的两倍,然后彩色线画一半才开始画黑色线。举个简单的例子,中心点到截止点要画100个彩色点
画前50个彩色点时,不画黑色点
画第51个彩色点时,画第1个和第2个黑色点覆盖第1个和第2个彩色点。(生成和消失速度比 1:2)
画第52个彩色点时,画第3个和第4个黑色点覆盖第3个和第4个彩色点。
。。。。以此类推
这样当画到第100个彩色点的时候,也刚好消失到了第100个彩色点。
再不理解就是,你速度是别人两倍,让人先跑一半你再跑,最后一起到终点。
5.关于重力
如果不考虑重力,那么烟花过程就是真真正正的放射线,是直线的,那样不符合实际,也不好看。所以引进了G,这也是为什么上面的图片的增量Ey【i】后面要减掉一些的原因。上图的S表示完成了length个点的几分之几,可以理解为路程,根据物理学,S=vt-1/2gt^2,可以看出跟时间的平方有关系,而又因为水平速度不变,所以其实跟路程的平方有关系,所以那里就是S的平方。物理学太久也忘记了,反正就是要考虑重力,比原来的截止点的y要低一些就可以了。原来的方向是直的,实际要有一点弧度。