JAVA中的多线程与运动仿真(1)——用JAVA来放一场烟花

一.实现效果的简单展示:

初步实现的动态效果为在鼠标点击之后,点击之处出现一簇小球,然后向不同方向散开变大。
利用这一效果,再在后续增加颜色渐变的效果,增加小球的数量,降低大小即可实现逼真的烟花特效。

二.代码实现的简单分析

1.创建窗体
由于画笔对象需要在窗体上获取,并且后续的小球等图像的绘制也需要在窗体上进行,所以在整个项目的开始阶段应当首先利用例如JFrame类来创建,调试好窗体。

2.绘制与移动小球
在导入java.awt.Graphics包后,从窗体上获取到画笔(Graphics)对象即可开始调用相关方法。
假设我已经获取到了画笔对象:g
在使用g调用setcolor方法设置颜色后即可调用fillOval方法来绘制一个特定位置与大小的圆形:
例如:g.fillOval(100,200,60,70)便是绘制一个左上顶点坐标为(100,200)长60,高70的长方形的内切圆
绘制好圆形后,再次使用g调用fillOval方法,但是改变绘制的坐标即可实现小球平面位置的移动。
但是,由于移动前后的小球位于同一个图层上,从视觉的直观感受上我们只会感觉一下绘制了多个小球,或者绘制了一个不断增长的柱形。
因此,在绘制新的位置的小球时,应重新设置颜色,再调用fillRect方法绘制实心矩形来实现对上一个图层的擦除
同时,即便如此,小球的绘制速度也太快了,呈现出来的是小球一闪而过,因此要调用Thread.sleep(x)函数[其中x为线程暂停的时间,单位为毫秒ms]来使得人眼能够捕捉到小球的运动。
此时,单个小球的简单运动就完成了。

3.利用线程解决小球频闪问题
在第二步完成之后,当小球数量较多,甚至仅仅是两个时,小球的显示就不会像原来只有一个小球时的那样清楚连贯,而是出现间歇性闪烁,这是因为在小球创建多了之后,有多个线程,但是却仅有一个窗体,此时多个线程在操作一个窗体对象,各个线程在不断的在执行擦除操作,因而导致了小球的闪烁现象。
解决这一问题最好的办法便是防止同时启动多个线程,而是将新创建的小球放入队列中,由一个线程来同时进行操作。

三.代码实现部分

①.Ball.java

import java.awt.Color;
import java.awt.Graphics;
import java.util.Random;public class Ball implements Mover{Color color1 = new Color(250,220,74);Random Ran = new Random();//小球运动步长float x_length = 5;float y_length = 5;int size = 10;int i=1;//小球初始速度的方向float vx = (2*Ran.nextFloat()-1)*x_length;float vy = (2*Ran.nextFloat()-1)*y_length;//小球加速度float acce = (float) 1.1;//小球初始误差中心坐标public float x,y;public Ball(int x, int y){this.x=x;this.y=y;}public void move() {vx *= acce;vy *= acce;x += vx;y += vy;size += 3;i=i+1;}public void draw(Graphics g) {g.setColor(Color.ORANGE);g.fillOval((int) x,(int) y, size, size);}}

②.drawboard.java

import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JButton;
import javax.swing.JLabel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.*;
import java.util.ArrayList;
import java.util.Random;class drawboard{public static void main(String[] args){drawboard itUI = new drawboard();itUI.ShowUI();}public ArrayList<Mover> MoverList = new ArrayList<>();public void ShowUI(){JFrame DrawBoard = new JFrame();//窗体基本配置DrawBoard.setTitle("烟花特效");DrawBoard.setSize(1600,1000);DrawBoard.setLocationRelativeTo(null);DrawBoard.setDefaultCloseOperation(3);DrawBoard.setLayout(new FlowLayout());//添加鼠标监听器drawmouse Mouse = new drawmouse(MoverList);DrawBoard.addMouseListener(Mouse);DrawBoard.setVisible(true);Graphics g = DrawBoard.getGraphics();//运行线程drawthread dt = new drawthread(MoverList,g);dt.start();System.out.println("启动");
//      Mouse.g = g;}
}

③.drawmouse.java

import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;public class drawmouse extends MouseAdapter{public int x,y;public ArrayList<Mover> MoverList;public drawmouse(ArrayList<Mover> MoverList){this.MoverList = MoverList;}//鼠标点击一下,放一个飞机进入队列public void mouseClicked(MouseEvent e){x=e.getX();y=e.getY();for(int i=0;i<=20;i++){Ball nBall = new Ball(x,y);MoverList.add(nBall);}}
}

④.drawthread.java

import java.awt.Color;
import java.awt.Graphics;
import java.util.ArrayList;
import java.util.Random;public class drawthread extends Thread{public Graphics g;Random ran = new Random();public ArrayList<Mover> MoverList;public drawthread(ArrayList<Mover> MoverList,Graphics g){this.MoverList = MoverList;this.g = g;}public void run(){while(true){//休眠50秒try {Thread.sleep(50);} catch (Exception ef) {}//刷新背景g.setColor(Color.WHITE);g.fillRect(0, 0, 1800, 1200);//移动一下队列中所有球,再画一下队列中所有小球System.out.println("T----线程把队列中所有小球画移了一次");for(int i=0;i<MoverList.size();i++) {//得到队列中的一个小球Mover Mover=MoverList.get(i); Mover.move();Mover.draw(g); }}}
}

⑤.Mover.java

import java.awt.Graphics;public interface Mover {public void move();public void draw(Graphics g);}

JAVA中的多线程与运动仿真(1)——用JAVA来放一场烟花相关推荐

  1. Java中的多线程编程(超详细总结)

    文章目录 Java中的多线程编程(超详细总结) 一.线程与多线程的概念 二.线程与进程之间的关系 三.一个线程的生命周期 四.多线程的目的和意义 五.线程的实现的方式 Java中的多线程编程(超详细总 ...

  2. JAVA中的多线程(一)

    JAVA中的多线程(一) 进程:是一个正在执行中的程序 每一个进程执行都有一个执行的顺序,该顺序是一个执行路径,或者叫控制单元 线程:就是进程中的一个独立的控制单元 线程在控制着进程的执行 一个进程中 ...

  3. java中的多线程有什么意义_Java多线程与并发面试题(小结)

    1,什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.程序员可以通过它进行多处理器编程,你可以使用多线程对运算密集型任务提速.比如,如果一个线程完成一 ...

  4. JAVA中的多线程(八):线程的优先级和yield方法

    JAVA中的多线程(八):线程的优先级和yield方法 优先级代表着抢资源的频率 所有线程默认优先级是5 yield()临时释放线程的执行权 1 class Demo implements Runna ...

  5. 草根方式学习java中的多线程

    草根方式学习java中的多线程 下面有具体的代码和截图 源码点这里 多线程即在同一时间,可以做多件事情(说白了,就是齐头并进) 单线程就是按部就班 创建多线程有2种方式,分别是继承线程Thread类, ...

  6. java中实现多线程的三种方式

    java中实现多线程的三种方式 1.实现多线程的方法: 在java中实现多线程的两途径:继承Thread类,实现Runable接口(Callable) 2.继承Thread类实现多线程: ​ 继承类T ...

  7. Java中的多线程基本介绍

    在 Java 中,多线程是指同时执行两个或多个线程以最大限度地利用 CPU 的过程. Java 中的线程是一个轻量级进程,只需要较少的资源即可创建和共享进程资源. 多线程和多进程用于 Java 中的多 ...

  8. Java基础——深入理解Java中的多线程(超级详细,值得你看)

    Java中的多线程 进程(process)是程序的一次执行过程,或是正在运行的有一个程序,或是正在运行的一个程序.是一个动态的过程:有它自身的产生.存在和消亡的过程.--生命周期. 线程(thread ...

  9. JAVA中实现多线程

    一,JAVA中实现多线程(一) 1,在Java中负责线程的这个功能的是Java.lang.Thread 这个类 2,可以通过创建 Thread 的实例来创建新的线程. 3,每个线程都是通过某个特定Th ...

最新文章

  1. GoogleFusionTablesAPI初探地图与云计算
  2. 我一顿操作把电脑弄崩了!!!数据全没了!!!我该怎么办?
  3. ERP与EWM集成配置---ERP 端(一)
  4. OSChina 周一乱弹 ——渴望咪咪还是渴望力量,都能给你
  5. TypeScript 3.0 新功能介绍(二)
  6. Python中单线程、多线程与多进程的效率对比实验
  7. 【HBase从入门到精通系列】误删数据如何抢救?
  8. ACM竞赛常用STL(二)之STL--algorithm
  9. jumpserver(0.3.2版本)开源跳板机系统部署
  10. Redis学习---(15)Redis 脚本
  11. Writing an ALSA Driver(二)
  12. 小品: 关于C++引用
  13. 内网通3.4.3045版本 免广告码 积分码 算法
  14. SpringBoot(53) 整合canal实现数据同步
  15. latex 箭头上带_latex 上下箭头
  16. Android点击View改变字体颜色和边框背景
  17. Mac自带ftp和Cyberduck使用
  18. 钓鱼工具gophish史上最详细教程(附实例) —— 手把手教你成为“捕鱼人”
  19. 【发布】哔哩哔哩bilibili替换旧版播放(稍后再看)
  20. SDN交换机在云计算网络中的应用场景

热门文章

  1. 欧洲共同语言参考标准英语c1,美国小学英语3年级语言知识对标欧洲共同语言参考标准CEFR...
  2. 2016计算机论文参考文献,2016大学毕业设计计算机软件论文摘要和结论参考文献俱全.doc...
  3. 魅族15系统是android,魅族工程师回复Flyme 8没有升级底层,魅族15还是安卓7.1
  4. windows 键盘记录器(win10下测试成功)
  5. [FFmpeg]编译av1的dav1d解码库
  6. 看雪软件安全精选:二进制各种漏洞原理实战分析总结
  7. 看看老牛是如何给陈彤写的信的
  8. 面试网答题(如老牛网)
  9. 使用neon实现RGB888转RGB565
  10. 魔兽世界活跃人数持续下降