📄 firework.java
字号:
//这个程序使用双缓冲技术产生烟花在空中爆炸的效果和动态文字效果
import java.awt.*;
import java.applet.*;
import java.util.*;
import java.net.*;
import Rocket;
import ClassWaveText;
public class Firework extends Applet implements Runnable
{
public int
AnimationSpeed, //动画速度
RocketStyleVariability, //烟花Rocket种类
MaxRocketNumber, //烟花Rocket个数
MaxRocketExplosionEnergy,//烟花Rocket爆炸的最大能量
MaxRocketPatchNumber, //最大的Rocket数
MaxRocketPatchLength, //每个Rocket中patch的最大个数
Gravity; //重力大小,表示碎片下降快慢
public String RocketSoundtrack; //声音文件
public String showText;
private int mx,my; //显示区域长度,宽度
private Thread thread=null;
private Rocket rocket[]; //表示Rocket的数组
Image off_screen_buffer=null;
Graphics off_screen;
private ClassWaveText waveText;
public void init()
{
int i;
String p;
//从HTML文档中读取参数
//读取动画速度
p=getParameter("AnimationSpeed");
AnimationSpeed=(p==null)?100:Integer.valueOf(p).intValue();
//读取声音文件
RocketSoundtrack=getParameter("RocketSoundtrack");
p=getParameter("RocketStyleVariability");
RocketStyleVariability=(p==null)?20:Integer.valueOf(p).intValue();
//读取烟花Rocket个数
p=getParameter("MaxRocketNumber");
MaxRocketNumber=(p==null)?5:Integer.valueOf(p).intValue();
//读取烟花爆炸的最大能量
p=getParameter("MaxRocketExplosionEnergy");
MaxRocketExplosionEnergy=(p==null)?500:Integer.valueOf(p).intValue();
//读取爆炸碎片个数
p=getParameter("MaxRocketPatchNumber");
MaxRocketPatchNumber=(p==null)?50:Integer.valueOf(p).intValue();
//读取爆炸碎片的最大长度
p=getParameter("MaxRocketPatchLength");
MaxRocketPatchLength=(p==null)?100:Integer.valueOf(p).intValue();
//读取重力参数
p=getParameter("Gravity");
Gravity=(p==null)?20:Integer.valueOf(p).intValue();//重力
//读取要显示的动态文字
p=getParameter("showText");
showText=(p==null)?"Hello":p;
//取得显示区域长度,宽度
mx=size().width-1;
my=size().height-1;
off_screen_buffer=createImage(mx,my);//创建宽为mx,高为my点的图像.
off_screen=off_screen_buffer.getGraphics();
//创建烟花对象数组
rocket=new Rocket[MaxRocketNumber];
for(i=0;i<MaxRocketNumber;i++)
rocket[i]=new Rocket(mx,my,Gravity);
//构造动态文字对象
waveText=new ClassWaveText(mx,my,showText);
}
public void start()
{
if(thread==null)
{
thread=new Thread(this);//创建线程
thread.start(); //开始线程
}
}
public void stop()
{
if(thread!=null)
{
thread.stop(); //停止线程
thread=null;
}
}
public void run()
{
int j;
int i,e,p,l;
long s=(long)(Math.random()*10000);
boolean sleep; //Rocket是否激活的布尔变量
//Graphics g=getGraphics();
URL u=null;
int myVar=0;
while(true)
{
try
{
thread.sleep(100/AnimationSpeed);
}
catch(InterruptedException x){}
sleep=true;
for(i=0;i<MaxRocketNumber;i++)
sleep=sleep&&rocket[i].sleep;
//随机产生爆炸的能量,patch数量,patch长度
e=(int)(Math.random()*MaxRocketExplosionEnergy*3/4)+
MaxRocketExplosionEnergy/4+1;
p=(int)(Math.random()*MaxRocketPatchNumber*3/4)+
MaxRocketPatchNumber/4+1;
l=(int)(Math.random()*MaxRocketPatchLength*3/4)+
MaxRocketPatchLength/4+1;
s=(long)(Math.random()*10000);
//是否刷新背景
if(++myVar==20)
{ myVar=0;
//后台图像上画图
off_screen.setColor(Color.black);
off_screen.fillRect(0,0,mx+1,my+1);
//后台图像上画出动态文字
waveText.update(off_screen);
}
for(i=0;i<MaxRocketNumber;i++)
{
if(rocket[i].sleep&&Math.random()*MaxRocketNumber*l<1)
{
try
{
u=new URL(getDocumentBase(),RocketSoundtrack);
}catch(MalformedURLException x){}
//发声
play(u);
rocket[i].init(e,p,l,s);
rocket[i].start();
}
//在后台图像上画出一个Rocket
rocket[i].show(off_screen);
}
//在前台显示图象
repaint();
} //while
} //run()
public void repaint(Graphics g)
{
update(g);
}
//重载update方法
public void update(Graphics g)
{
paint(g);
}
public void paint(Graphics g)
{
//在前台显示图象
g.drawImage(off_screen_buffer,1,1,mx,my,this);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -