📄 stars.java
字号:
//类stars
import java.applet.*;
import java.awt.*;
public class stars extends Applet implements Runnable
{
final static int borderX= 640; //显示区域的大小
final static int borderY= 400;
final static int middleX= 320; //显示区域中心的坐标
final static int middleY= 200;
final static int length=200; //星星产生位置参数
final static int starMax=150; //屏幕上最多可同时出现的星星数
final static int starSpeed=1; //星星移动速度参数
final static int starNew=50; //一次最多产生的星星数
final static int angleMax= 360; //星星产生位置相对区域中心的角度
final static double ratioXy= 0.6; //显示区域的高度与宽度比
final static double PI= 3.1415926;
Graphics g; // 图形设备环境变量
Image offScreen_image; //图象类对象
Graphics offScreen_g; //图形设备环境变量
int star_index=0; //星星的序号
starClass star[]; //starClass类对象
Thread my_thread; //线程类对象
private int colorIndex=0; //颜色深浅变量
public void init()
{
//取当前图形设备环境
g=getGraphics();
//创建给定区域的图形
offScreen_image=createImage(640,400);
//给Screen_g赋以当前的图形设备环境
offScreen_g=offScreen_image.getGraphics();
//创建starClass类的数组star
star= new starClass[starMax];
for(int i=0;i<starMax;i++)
star[i]=new starClass();
start(); //开始主线程
}
public void start()
{
if(my_thread==null);
{
my_thread=new Thread(this); //创建一个线程
my_thread.start(); //开始此线程
}
}
void stars_create()
{
int total_new; //此次新产生的星星总数
int dist; //星星与区域中心的距离
double angle; //星星与区域中心所形成的角度
float dx,dy; //星星与区域中心的相对坐标
total_new =starNew;
while(total_new-->0)
{
if(star[star_index].active== false)
{
//激活一个星星
star[star_index].active= true;
//随机计算星星与区域中心的距离
dist=(int)(Math.random()*length*9/10+(float)length/10);
//随机给出星星与区域中心的相对角度
angle=(float)(Math.random()*angleMax/180.0)*PI;
//计算此星星与区域中心的相对坐标
dx=(float)(dist*Math.cos(angle));
dy=(float)(dist*ratioXy*Math.sin(angle));
star[star_index].dx=dx;
star[star_index].dy=dy;
//计算此星星的绝对坐标
star[star_index].x=middleX+dx;
star[star_index].y=middleY+dy;
//计算此星星的本次移动的相对坐标
star[star_index].ddx=(float)(starSpeed*Math.cos(angle));
star[star_index].ddy=(float)(starSpeed*ratioXy*Math.sin(angle));
//初始化星星的大小
star[star_index].size=0;
} //if
star_index++;
if(star_index==starMax)
star_index=0;
} //while
}
//画出所有的星星
public void starSizeDraw()
{
int i,avx,avy,size;
//决定星星大小的区域与区域中心的相对坐标
int SIZE_X= 70;
int SIZE_Y= 60;
//画出黑色背景
offScreen_g.setColor(Color.black);
offScreen_g.fillRect(0,0,640,400);
//每次增加文字显示颜色的深度至最大为止
if(colorIndex<255)
colorIndex+= 3;
offScreen_g.setColor(new Color(0,0,colorIndex));
offScreen_g.setFont(new Font("TimeRoman",Font.BOLD+Font.PLAIN,48));
offScreen_g.drawString("梦幻星空", middleX-100, middleY-18);
for(i=0;i<starMax;i++)
if(star[i].active==true)
{
if((star[i].x<0)||(star[i].y<0)
||(star[i].x>borderX)||(star[i].y>borderY))
{
//如果星星移出此区域则消除它
star[i].active= false;
}
else
{
//改变星星的位置
star[i].x=star[i].x+star[i].ddx; //dx
star[i].y=star[i].y+star[i].ddy;
star[i].dx=star[i].dx+star[i].ddx; //dx
star[i].dy=star[i].dy+star[i].ddy;
//计算星星的大小
avx=(int)(Math.abs(star[i].dx));
avy=(int)(Math.abs(star[i].dy));
if((avx>SIZE_X*3)||(avy>SIZE_Y*3))
size=3;
else if((avx>SIZE_X*2)||(avy>SIZE_Y*2))
size=2;
else if((avx>SIZE_X)||(avy>SIZE_Y))
size=1;
else
size=0;
star[i].size=size;
star_draw(star[i]);
} //else
} //if
repaint();
}
//根据星星距离中心的远近确定其大小并画出它
void star_draw(starClass starNow)
{
int x,y;
offScreen_g.setColor(Color.white);
x=(int)starNow.x;
y=(int)starNow.y;
switch(starNow.size)
{
case 0:
offScreen_g.drawLine(x-0,y,x+0,y);
offScreen_g.drawLine(x,y-0,x,y+0);
break;
case 1:
offScreen_g.drawLine(x-1,y,x+1,y);
offScreen_g.drawLine(x,y-1,x,y+1);
break;
case 2:
offScreen_g.drawLine(x-2,y,x+2,y);
offScreen_g.drawLine(x,y-2,x,y+2);
break;
case 3:
offScreen_g.drawLine(x-3,y,x+3,y);
offScreen_g.drawLine(x,y-3,x,y+3);
break;
}
}
public void run()
{
while(true)
{
//创建星星
stars_create();
//显示不同大小的星星
starSizeDraw();
try
{
Thread.sleep(100);
}
catch(InterruptedException e){}
}
}
public void repaint(Graphics g)
{
update(g);
}
public void update(Graphics g)
{
paint(g);
}
public void paint(Graphics g)
{
g.drawImage(offScreen_image,1,1,640,400,this);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -