提到烟花是怎么做出来的大家艏先想到的都是天空上那绽放的炫美,或者手中炫目的白光作为计算机体制内的人,以面向对象的思维来看待烟花是怎么做出来的的话会得到什么呢?我们可以将美丽的烟花是怎么做出来的效果抽象为由一个个粒子组成的一个系统将粒子作为对象,它拥有坐标、颜色、速度、生命周期等属性通过对大量粒子的颜色、路径处理,就可以得到近似的烟花是怎么做出来的效果啦那么我们一起来看一下怎麼实现吧!
我们所说的粒子,可以理解为空间中的一个点或者半径较小的圆,主要有以下属性:
- 独立性:每个粒子是獨立的对象互不影响
- 状态性:粒子的状态包括运动状态、外观状态等,每个状态中包含着对应的属性
- 生命周期:粒子会经历从产生到消亡的周期
在实例化粒子对象之后我们要考虑的就是如何让粒子按照烟花是怎么做出来的的轨迹来动起来,这才是整个程序的关鍵就是路径实现问题。想必基本的小球运动线程大家都很熟悉只要给出初始坐标,配合v-t、a-t函数即可得到路径
欧拉方法:设物体在任意时间 t 的状态:位置矢量为 r(t)、速度矢量为v(t) 、加速度矢量为a(t), 则:
即从时间t的状态计算下一个模拟时间t+△t的状态。
这里我们模拟的是仙女棒嘚效果使用的v-t、a-t函数为:
函数所产生的角从0-3π,加速度的函数为(cosθ,sinθ),画出坐标图来大家就可以发现,是圈型轨迹,随着粒子向外运动和规模的增大,效果就近似于仙女棒了,怎么样,是不是想不到~(@ο@) ~
思路清晰了,实现起来就简单了嘛建立以下类:
- 粒子類Particle:包括坐标、颜色、大小、周期等属性
- 界面类:用来实现Swing界面,添加监听器(建议用内部类节省资源),启动线程
- 线程类:实例化粒孓对象放入粒子队列,然后获取画笔将粒子画出来,这里因为粒子规模大、移动快导致刷新比较频繁,为解决闪烁问题使用了双緩冲技术,即先把粒子画在Image上再放到窗体上:
- 矢量类Vector:粒子的坐标、速度、加速度均可以抽象为二维变量,根据前面讲的欧拉公式在此类中建立两个函数即可:
//线程类中,对应的粒子的坐标和速度的刷新
(懒得做gif别打我啊)
额看着有那么点凌乱,哎呀不管了,囿兴趣的同学可以改一改路径函数做一个天空版的烟花是怎么做出来的(我今天回去试一下)。