Java 美丽的烟花

## 技术要点

* 类Image的使用。

* 类Graphics的使用。

* 双缓冲技术处理闪烁。

## 效果展示

![image.png](https://image.xsoftlab.net/baike/articleImages/bbde40a764395d62f69e1e004e92146c.png)

## 代码实现

```java

package net.xsoftlab.baike;

import java.applet.Applet;

import java.awt.Color;

import java.awt.Graphics;

import java.util.Random;

public class MissileDemo extends Applet implements Runnable {

private static final long serialVersionUID = 6219904185869794496L;

public int speed, variability, Max_Number, Max_Energy, Max_Patch, Max_Length, G;

public String sound;

// 获取当前容器边界的宽和高

private int width, height;

// 设置线程

private Thread thread = null;

// 创建BeaClassDemo类数组bcd

private BeaClassDemo bcd[];

@Override

public void init() {

int i;

// 设置当前容器的宽和高

this.setSize(700, 400);

width = getSize().width - 1;

height = getSize().height - 1;

// 烟花绽放的速度

speed = 30;

variability = 10;

// 可发出烟花的最大数目

Max_Number = 100;

Max_Energy = width + 50;

// 最大的斑点数

Max_Patch = 80;

// 斑点的最大距离

Max_Length = 200;

// 向地面弯曲的力度

G = 50;

// 初始化BeaClassDemo数组

bcd = new BeaClassDemo[Max_Number];

for (i = 0; i < Max_Number; i++)

bcd[i] = new BeaClassDemo(width, height, G);

}

@Override

public void start() {

if (thread == null) {

thread = new Thread(this);

thread.start();

}

}

@Override

@SuppressWarnings("deprecation")

public void stop() {

if (thread != null) {

thread.stop();

thread = null;

}

}

@Override

@SuppressWarnings("static-access")

public void run() {

int i;

int E = (int) (Math.random() * Max_Energy * 3 / 4) + Max_Energy / 4 + 1;

int P = (int) (Math.random() * Max_Patch * 3 / 4)// 烟花的斑点数

+ Max_Patch / 4 + 1;

int L = (int) (Math.random() * Max_Length * 3 / 4)// 烟花可发射出的距离

+ Max_Length / 4 + 1;

long S = (long) (Math.random() * 10000);// 产生的随机数

boolean sleep;// 体眠的标志

Graphics g = getGraphics();

while (true) {

try {

thread.sleep(1000 / speed);

} catch (InterruptedException x) {}

sleep = true;

for (i = 0; i < Max_Number; i++)

sleep = sleep && bcd[i].sleep;

if (sleep && Math.random() * 100 < variability) {

E = (int) (Math.random() * Max_Energy * 3 / 4) + Max_Energy / 4 + 1;

P = (int) (Math.random() * Max_Patch * 3 / 4) + Max_Patch / 4 + 1;

L = (int) (Math.random() * Max_Length * 3 / 4) + Max_Length / 4 + 1;

S = (long) (Math.random() * 10000);

}

for (i = 0; i < Max_Number; i++) {

if (bcd[i].sleep && Math.random() * Max_Number * L < 1) {

bcd[i].init(E, P, L, S);

bcd[i].start();

}

bcd[i].show(g);

}

}

}

@Override

public void paint(Graphics g) {// 绘制组件

g.setColor(Color.black);// 设置背景颜色为黑

g.fillRect(0, 0, width + 1, height + 1);// 根据参数画矩形

}

}

class BeaClassDemo {

private Random random;

public boolean sleep = true;

private int energy, patch, length, width, height, G, Xx, Xy, Ex[], Ey[], x, y, Red, Blue, Green, t;

public BeaClassDemo(int a, int b, int g) {

width = a;

height = b;

G = g;

}

public void init(int e, int p, int l, long seed) {

int i;

// 赋值运算

energy = e;

patch = p;

length = l;

// 创建一个带种子的随机数生成器

random = new Random(seed);

Ex = new int[patch];// 初始化int数组Ex,其长度为patch

Ey = new int[patch];// 初始化int数组Ey,其长度为patch

// 随机生成不透明的 sRGB 颜色值

Red = (int) (random.nextDouble() * 128) + 128;

Blue = (int) (random.nextDouble() * 128) + 128;

Green = (int) (random.nextDouble() * 128) + 128;

Xx = (int) (Math.random() * width / 2) + width / 4;

Xy = (int) (Math.random() * height / 2) + height / 4;

for (i = 0; i < patch; i++) {

Ex[i] = (int) (Math.random() * energy) - energy / 2;

Ey[i] = (int) (Math.random() * energy * 7 / 8) - energy / 8;

}

}

public void start() {

t = 0;

sleep = false;

}

// 展示烟花

public void show(Graphics g) {

// 如果休眠,就直接返回

if (sleep)

return;

if (t < length) {

int i, c;

double s;

Color color;

c = (int) (random.nextDouble() * 64) - 32 + Red;

if (c >= 0 && c < 256)

Red = c;

c = (int) (random.nextDouble() * 64) - 32 + Blue;

if (c >= 0 && c < 256)

Blue = c;

c = (int) (random.nextDouble() * 64) - 32 + Green;

if (c >= 0 && c < 256)

Green = c;

color = new Color(Red, Blue, Green);

for (i = 0; i < patch; i++) {

s = (double) t / 100;

x = (int) (Ex[i] * s);

y = (int) (Ey[i] * s - G * s * s);

g.setColor(color);

g.drawLine(Xx + x, Xy - y, Xx + x, Xy - y);

if (t >= length / 2) {

int j;

for (j = 0; j < 2; j++) {

s = (double) ((t - length / 2) * 2 + j) / 100;

x = (int) (Ex[i] * s);

y = (int) (Ey[i] * s - G * s * s);

g.setColor(Color.black);

g.drawLine(Xx + x, Xy - y, Xx + x, Xy - y);

}

}

}

t++;

} else {

sleep = true;

}

}

}

```

## 程序解读

1. MissileDemo类随机生成烟花的颜色,这种随机的颜色可以通过RGB来实现颜色的分配。

2. 在运行烟花程序时,烟花绽放的颜色通过上面的方法可以控制,现在就得对烟花的速度进行一定的控制,主要是通过speed属性来控制。另外,就是对烟花的斑点数进行控制,可以参照下面的方法:(Math.random()\*Max_Patch\*3/4)

3. 最后就可以运行小程序,输出烟花,看到它绽放的效果。

java 烟花_Java 美丽的烟花相关推荐

  1. 一个用java演示的产生图像烟花的算法

    以下是一个用java演示的产生图像烟花的算法,可以用来研究以下相关的东西.希望对有兴趣的朋友有用. import   java.applet.AudioClip; import   java.awt. ...

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

    JAVA中的多线程与运动仿真(1)--用JAVA来放一场烟花 一.实现效果的简单展示: 初步实现的动态效果为在鼠标点击之后,点击之处出现一簇小球,然后向不同方向散开变大. 利用这一效果,再在后续增加颜 ...

  3. 【源码+教程】Java课设项目_12款最热最新Java游戏项目_Java游戏开发_Java小游戏_飞翔的小鸟_王者荣耀_超级玛丽_推箱子_黄金矿工_贪吃蛇

    马上就要期末了,同学们课设做的如何了呢?本篇为大家带来了12款热门Java小游戏项目的源码和教程,助力大家顺利迎接暑假![源码+教程]Java课设项目_12款最热最新Java游戏项目_Java游戏开发 ...

  4. 杭州烟花大会发生爆炸事故近百人受伤-烟花大会-杭州西湖-烟花燃放

    杭州烟花大会发生爆炸事故近百人受伤|烟花大会|杭州西湖|烟花燃放 13日,在杭州市第二人民医院,58岁的愈苏松(前)在接受治疗后,配合警察拍照取证.新华社发 为躲避烟花袭击,市民纷纷弯腰.视频截图 本 ...

  5. html动画之制作烟花效果,JavaScript实现烟花绽放动画效果

    先编写一个烟花绽放的动画效果. 放烟花时,一个烟花可分为两个阶段:(1)烟花上升到空中:(2)烟花炸开成碎片,炸开的碎片慢慢消散. 为此抽象出两个对象类:Firework和Particle.其中,Fi ...

  6. 杭州西湖申遗成功后首次举办烟花大会-杭州-西湖-烟花大会

    杭州西湖申遗成功后首次举办烟花大会|杭州|西湖|烟花大会 新华网杭州10月13日电 (记者 方益波)第十四届中国杭州西湖国际博览会开幕式于10月13日晚在西湖边举行.全国人大常委会副委员长路甬祥宣布开 ...

  7. 黑马程序员全套Java教程_Java基础教程_异常(含扩展)(二十三)

    黑马程序员全套Java教程_Java基础教程_异常(含扩展)(二十三) 1.1 异常概述与异常体系结构 1.2 JVM遇到异常时的默认处理方案 1.3 异常处理 1.4 异常处理之try--catch ...

  8. 用Java码出的动态烟花特效

    /*  * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this lic ...

  9. Scratch编程与美术:制作美丽的烟花!

    我们使用scratch可以制作出很多非常惊艳的作品,比如做一个五彩绚烂的绽放的烟花. 效果预览-脚本解析 (1)首先我们需要删除原来的小角色,然后新建一个角色,这个角色不需要绘制图片,只是作为一个编写 ...

最新文章

  1. R语言绘制堆叠条形图
  2. linux oracle path恢复,Linux 环境下Oracle安装与调试(七)之SQL Loader,备份和恢复
  3. 安徽省计算机一级文化基础,计算机一级文化基础选择题
  4. js 自动关闭html页面,JS关闭窗口或JS关闭页面的几种代码分享
  5. 机器学习中如何处理缺失数据(NAN和Ifo)?
  6. 【IOC 控制反转】IOC 简介 ( 依赖注入的两种实现方式 | 编译期注入 | 运行期注入 )
  7. 从python存入的文件是乱码_如何解决python写入html文件中乱码的现象(图文详解)...
  8. Swift 结构体和类的最大区别
  9. 设置联想电脑双屏显示(备用待查)
  10. 设置隐藏文件的显示与隐藏方法
  11. 2014 网选 上海赛区 hdu 5047 Sawtooth
  12. 这个世界最贵的奢侈品永远是事业
  13. Gse v0.40.0 发布,Go 高性能分词,增加更多常用 API
  14. 免费仿站_扒站工具下载-IDM站点抓取
  15. MODIS数据下载之USGS下载流程
  16. halo_Halo 3评论
  17. 朋友圈一杠中间一个点_朋友圈只显示一条线 中间一个点 是被删除了么
  18. ESB 企业服务总线基本内容概述
  19. Verilog频率计设计
  20. 快播王欣:我所失去的一切,都要靠区块链双倍奉还!

热门文章

  1. ensp实操--企业私有网络构建运维
  2. python编辑俄罗斯方块_python俄罗斯方块
  3. java自动化测试语言高级之Java 8 新特性
  4. GitHub桌面版和汉化包,使用详细(GitHub Desktop安装,github软件汉化包详细使用过程)
  5. LOI 2887 [USACO07NOV]防晒霜Sunscreen
  6. 一篇《1984》的书评
  7. uniapp引入阿里云短信业务
  8. Spring Boot入门教程(五十三): 极光推送Java-SDK
  9. python开发数据库_有没有利用python开发数据库的案例
  10. 如何禁用计算机防病毒程序,win10系统怎么关闭Windows Defender防病毒程序