java 烟花_Java 美丽的烟花
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 美丽的烟花相关推荐
- 一个用java演示的产生图像烟花的算法
以下是一个用java演示的产生图像烟花的算法,可以用来研究以下相关的东西.希望对有兴趣的朋友有用. import java.applet.AudioClip; import java.awt. ...
- JAVA中的多线程与运动仿真(1)——用JAVA来放一场烟花
JAVA中的多线程与运动仿真(1)--用JAVA来放一场烟花 一.实现效果的简单展示: 初步实现的动态效果为在鼠标点击之后,点击之处出现一簇小球,然后向不同方向散开变大. 利用这一效果,再在后续增加颜 ...
- 【源码+教程】Java课设项目_12款最热最新Java游戏项目_Java游戏开发_Java小游戏_飞翔的小鸟_王者荣耀_超级玛丽_推箱子_黄金矿工_贪吃蛇
马上就要期末了,同学们课设做的如何了呢?本篇为大家带来了12款热门Java小游戏项目的源码和教程,助力大家顺利迎接暑假![源码+教程]Java课设项目_12款最热最新Java游戏项目_Java游戏开发 ...
- 杭州烟花大会发生爆炸事故近百人受伤-烟花大会-杭州西湖-烟花燃放
杭州烟花大会发生爆炸事故近百人受伤|烟花大会|杭州西湖|烟花燃放 13日,在杭州市第二人民医院,58岁的愈苏松(前)在接受治疗后,配合警察拍照取证.新华社发 为躲避烟花袭击,市民纷纷弯腰.视频截图 本 ...
- html动画之制作烟花效果,JavaScript实现烟花绽放动画效果
先编写一个烟花绽放的动画效果. 放烟花时,一个烟花可分为两个阶段:(1)烟花上升到空中:(2)烟花炸开成碎片,炸开的碎片慢慢消散. 为此抽象出两个对象类:Firework和Particle.其中,Fi ...
- 杭州西湖申遗成功后首次举办烟花大会-杭州-西湖-烟花大会
杭州西湖申遗成功后首次举办烟花大会|杭州|西湖|烟花大会 新华网杭州10月13日电 (记者 方益波)第十四届中国杭州西湖国际博览会开幕式于10月13日晚在西湖边举行.全国人大常委会副委员长路甬祥宣布开 ...
- 黑马程序员全套Java教程_Java基础教程_异常(含扩展)(二十三)
黑马程序员全套Java教程_Java基础教程_异常(含扩展)(二十三) 1.1 异常概述与异常体系结构 1.2 JVM遇到异常时的默认处理方案 1.3 异常处理 1.4 异常处理之try--catch ...
- 用Java码出的动态烟花特效
/* * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this lic ...
- Scratch编程与美术:制作美丽的烟花!
我们使用scratch可以制作出很多非常惊艳的作品,比如做一个五彩绚烂的绽放的烟花. 效果预览-脚本解析 (1)首先我们需要删除原来的小角色,然后新建一个角色,这个角色不需要绘制图片,只是作为一个编写 ...
最新文章
- R语言绘制堆叠条形图
- linux oracle path恢复,Linux 环境下Oracle安装与调试(七)之SQL Loader,备份和恢复
- 安徽省计算机一级文化基础,计算机一级文化基础选择题
- js 自动关闭html页面,JS关闭窗口或JS关闭页面的几种代码分享
- 机器学习中如何处理缺失数据(NAN和Ifo)?
- 【IOC 控制反转】IOC 简介 ( 依赖注入的两种实现方式 | 编译期注入 | 运行期注入 )
- 从python存入的文件是乱码_如何解决python写入html文件中乱码的现象(图文详解)...
- Swift 结构体和类的最大区别
- 设置联想电脑双屏显示(备用待查)
- 设置隐藏文件的显示与隐藏方法
- 2014 网选 上海赛区 hdu 5047 Sawtooth
- 这个世界最贵的奢侈品永远是事业
- Gse v0.40.0 发布,Go 高性能分词,增加更多常用 API
- 免费仿站_扒站工具下载-IDM站点抓取
- MODIS数据下载之USGS下载流程
- halo_Halo 3评论
- 朋友圈一杠中间一个点_朋友圈只显示一条线 中间一个点 是被删除了么
- ESB 企业服务总线基本内容概述
- Verilog频率计设计
- 快播王欣:我所失去的一切,都要靠区块链双倍奉还!
热门文章
- ensp实操--企业私有网络构建运维
- python编辑俄罗斯方块_python俄罗斯方块
- java自动化测试语言高级之Java 8 新特性
- GitHub桌面版和汉化包,使用详细(GitHub Desktop安装,github软件汉化包详细使用过程)
- LOI 2887 [USACO07NOV]防晒霜Sunscreen
- 一篇《1984》的书评
- uniapp引入阿里云短信业务
- Spring Boot入门教程(五十三):	极光推送Java-SDK
- python开发数据库_有没有利用python开发数据库的案例
- 如何禁用计算机防病毒程序,win10系统怎么关闭Windows Defender防病毒程序