提到烟花,大家首先想到的都是天空上那绽放的炫美,或者手中炫目的白光,作为计算机体制内的人,以面向对象的思维来看待烟花的话,会得到什么呢?我们可以将美丽的烟花效果抽象为由一个个粒子组成的一个系统,将粒子作为对象,它拥有坐标、颜色、速度、生命周期等属性,通过对大量粒子的颜色、路径处理,就可以得到近似的烟花效果啦,那么我们一起来看一下怎么实现吧!

  • Java面向对象
  • 线程、双缓冲画图

基本思路

1.粒子对象

我们所说的粒子,可以理解为空间中的一个点,或者半径较小的圆,主要有以下属性:

  • 独立性:每个粒子是独立的对象,互不影响
  • 状态性:粒子的状态包括运动状态、外观状态等,每个状态中包含着对应的属性
  • 生命周期:粒子会经历从产生到消亡的周期

2.路径实现

在实例化粒子对象之后,我们要考虑的就是如何让粒子按照烟花的轨迹来动起来,这才是整个程序的关键,就是路径实现问题。想必基本的小球运动线程大家都很熟悉,只要给出初始坐标,配合v-t、a-t函数即可得到路径。

欧拉方法:设物体在任意时间 t 的状态:位置矢量为 r(t)、速度矢量为v(t) 、加速度矢量为a(t), 则:
v(t+△t)=v(t)+a(t)△t
r(t+△t)=r(t)+v(t)△t
即从时间t的状态,计算下一个模拟时间t+△t的状态。

这里我们模拟的是仙女棒的效果,使用的v-t、a-t函数为:

pt.vspeed=new Vector(10,-20);
pt.vacceleration=randomDirection();
public static Vector randomDirection() {//Math.random(),随机选取大于等于 0.0 且小于 1.0 的伪随机 double 值double theta=Math.random()*3*Math.PI;return new Vector((Math.cos(theta)),(Math.sin(theta)));}

函数所产生的角从0-3π,加速度的函数为(cosθ,sinθ),画出坐标图来大家就可以发现,是圈型轨迹,随着粒子向外运动和规模的增大,效果就近似于仙女棒了,怎么样,是不是想不到~(@ο@) ~

3.具体实现

思路清晰了,实现起来就简单了嘛,建立以下类:

  • 粒子类Particle:包括坐标、颜色、大小、周期等属性
  • 界面类:用来实现Swing界面,添加监听器(建议用内部类,节省资源),启动线程
  • 线程类:实例化粒子对象,放入粒子队列,然后获取画笔,将粒子画出来,这里因为粒子规模大、移动快,导致刷新比较频繁,为解决闪烁问题,使用了双缓冲技术,即先把粒子画在Image上,再放到窗体上:
 Image image=jf.createImage(jf.getWidth(),jf.getHeight());Graphics bg=image.getGraphics();bg.draw.....jf.getGraphics().drawImage(image, 0, 0, null);
  • 矢量类Vector:粒子的坐标、速度、加速度均可以抽象为二维变量,根据前面讲的欧拉公式,在此类中建立两个函数即可:
public Vector add(Vector v) {return new Vector(this.x+v.x,this.y+v.y);
}
public Vector multiple(double rate) {return new Vector(this.x*rate,this.y*rate);
}
//线程类中,对应的粒子的坐标和速度的刷新
p.vposition=p.vposition.add(p.vspeed.multiple(rate));
p.vspeed=p.vspeed.add(p.vacceleration.multiple(rate));

4.成果

(懒得做gif别打我啊)

额,看着有那么点凌乱,哎呀,不管了,有兴趣的同学可以改一改路径函数,做一个天空版的烟花(我今天回去试一下)。

最后,欢迎各路大佬指点

粒子系统-烟花效果的实现相关推荐

  1. 6 cocos2dx粒子效果,类图关系,系统原生粒子和自定义粒子效果,粒子编译器软件,爆炸粒子效果,烟花效果,火焰效果,流星效果,漩涡粒子效果,雪花效果,烟雾效果,太阳效果,下雨效果

     1 粒子 示例 2 类图关系 3 系统原生粒子 CCParticleSystem 所有粒子系统的父类 CCParticleSystemPoint. CCParticleSystemQuad 点粒 ...

  2. Unity烟花效果实例

    特效实例1 烟花效果(FireWorks) 实例效果: 实现步骤: 1.在场景中创建一个粒子系统对象,重命名为Fireworks,Transform -> Reset -> Rotatio ...

  3. java word转html 烟火,Java多线程制作烟花效果.doc

    Java多线程制作烟花效果 Java多线程应用实例: 制作烟花效果 本例知识点一句话讲解新学知识使用Thread类管理线程已学知识Math类产生随机数使用Color类设置颜色使用Graphics类绘制 ...

  4. C语言用循环写出新年祝福语图案,非常漂亮的新年祝福!C语言实现漂亮的烟花效果...

    本文实例为大家分享了C语言实现漂亮的烟花效果展示的具体代码,供大家参考,具体内容如下 程序名称:祝福烟花,祝福朋友 编译环境:VC++6.0 && easyx(立冬版) #includ ...

  5. JavaScript实现微信聊天烟花效果

    微信8.0烟花效果实现 <!DOCTYPE html> <html lang="en"><head><meta charset=" ...

  6. 如何用html制作一个动态烟花,视频加烟花特效 视频如何制作烟花效果|视频上添加动态的焰火效果...

    有句mmp不知当讲不当讲,今天竟然是孔子的诞辰,这样一算孔子很有可能是处女座呢!!当看到这条消息时我的内心是拒绝的,在我看来孔子的中庸思想表示的"平庸.折中.调和"明明是我们天秤座 ...

  7. Python实现烟花效果,祝大家2021年,牛年大吉。

    自从WX更新版本之后,烟花.炸弹等表情火了. 新年快到了,为了庆祝最后一天搬砖,学习一下用Python实现烟花效果. 代码如下: import tkinter as tk from time impo ...

  8. Android自定义SurfaceView简单实现烟花效果

    烟花效果 实现原理 SurfaceView + HandlerThread 为什么使用SurfaceView? 因为SurfaceView在子线程刷新不会阻塞主线程,适用于界面频繁更新.对帧率要求较高 ...

  9. 使用html5制作烟花的视频,视频加烟花特效 视频如何制作烟花效果|视频上添加动态的焰火效果...

    有句mmp不知当讲不当讲,今天竟然是孔子的诞辰,这样一算孔子很有可能是处女座呢!!当看到这条消息时我的内心是拒绝的,在我看来孔子的中庸思想表示的"平庸.折中.调和"明明是我们天秤座 ...

最新文章

  1. mysql锁与程序锁_数据库加锁(转)
  2. Anchor free Detector:FCOS
  3. 做 NLP 算法研究,去大公司还是创业公司?
  4. 数通手稿留档——Frame Relay
  5. 第18次Scrum会议(10/30)【欢迎来怼】
  6. 测试用例场景法3个例子
  7. JDBC 数据库连接池 工作原理
  8. html5 答题器页面,梦幻西游网页版科举答题器答案大全
  9. 云和人工智烈日当头,华为HPC解决方案如何应对?
  10. 2018年北京信息科技大学第十届程序设计竞赛暨ACM选拔赛 C:计算几何
  11. 参数validator/valid校验用法(通俗)
  12. 购买邮箱需要注意什么?教你发件邮箱购买流程
  13. 5000字长文:电商运营如何做好数据分析?
  14. Java8 vs Java11
  15. 在网页中调用摄像头实现拍照上传 - 高拍仪二次开发
  16. 用 Python 制作可视化 GUI 界面,一键实现自动分类管理文件!
  17. [雷倒]计算机系学生巨牛的请假条
  18. 2017第8届中国中西部(昆明)医疗器械展览会会刊(参展商名录)
  19. ServiceEntry 跨命名空间
  20. 小米MIX 2S简单刷入开发版开启Root权限的步骤

热门文章

  1. VC++6.0 win32 控制台应用程序 简单应用 附代码
  2. 广州大学校园网路由器傻瓜式自助刷机教程
  3. 安装独立的 Elastic Agents 并采集数据 - Elastic Stack 8.0
  4. UGUI 图集打包工具Sprite Packer
  5. oracle 操作树大全,在Oracle中的树形操作
  6. android的退格字符,按键安卓版如何实现退格键功能
  7. GIS理论常识——GeoJson和TopoJson
  8. 谈谈亲历的WMS、MES与ERP的集成之路
  9. Scard API 智能卡操作
  10. 算法技能树2-蓝桥杯-python实现测试次数(摔手机)-动态规划(DP)