⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 stars.java

📁 java程序
💻 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 + -