下大雪,这个程序一共分成两步完成:第一步,满天星星;第二步,落下来。
下面的代码实现了满天星星,又加上了线程,在线程里加入了不断循环、延时和重画。
import java.awt.Color;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Panel;
public class MyBall{
public static void main(String args[]){
Frame w=new Frame();
w.setSize(1024,768);
w.setBackground(Color.black);
MyPanel mp=new MyPanel();
w.add(mp);
Thread t=new Thread(mp);
t.start();
w.setVisible(true);
}
}
class MyPanel extends Panel implements Runnable {
int x=30;
int y=30;
public void paint(Graphics g){
g.setColor(Color.WHITE);
for(int i=0;i<300;i++){
g.drawString("*",x,y);
x=(int)(Math.random()*1024);
y=(int)(Math.random()*768);
}
}
public void run(){
while(true){
y--;
try{
Thread.sleep(10);
}catch(Exception e){}
repaint();
}
}
}
上面的代码实行了但是满屏一直闪,还是不行。
import java.awt.Color;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Panel;
public class MyBall{
public static void main(String args[]){
Frame w=new Frame();
w.setSize(1024,768);
w.setBackground(Color.black);
MyPanel mp=new MyPanel();
w.add(mp);
Thread t=new Thread(mp);
t.start();
w.setVisible(true);
}
}
class MyPanel extends Panel implements Runnable{
int []x=new int[300];
int []y=new int[300];
int i=0;
public void paint(Graphics g){
g.setColor(Color.WHITE);
for( i=0;i<200;i++){
x[i]=(int)(Math.random());
y[i]=(int)(Math.random());
g.drawString("*",x[i],y[i]);
}
}
public void run(){
for( i=0;i<200;i++){
y[i]=y[i]-1;
}
try{
Thread.sleep(10);}
catch(Exception e){}
repaint();
}
}
改完之后一直报错,运行不了。
原因:如果每颗星星都像小球一样,缓慢地落下来,我们就不能在paint方法里生成随机数来确定坐标,而是需要提前准备好300个随机的坐标,并且将这些随机数存下来,每次去修改300个y坐标。
还有个问题,类里面不可以有语句,我们需要找一个方法,在这个方法里复制,要求这个方法的运行要在paint方法被调用前。可以创建一个构造方法。
import java.awt.Color;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Panel;
public class MyBall{
public static void main(String args[]){
Frame w=new Frame();
w.setSize(1024,768);
w.setBackground(Color.black);
MyPanel mp=new MyPanel();
w.add(mp);
Thread t=new Thread(mp);
t.start();
w.setVisible(true);
}
}
class MyPanel extends Panel implements Runnable{
int x[]=new int[300];
int y[]=new int[300];
int i=0;
public MyPanel(){
for(i=0;i<300;i++){
x[i]=(int)(Math.random()*1024);
y[i]=(int)(Math.random()*768);
}
}
public void paint(Graphics g){
g.setColor(Color.WHITE);
for(int i=0;i<300;i++){
g.drawString("*", x[i], y[i]);
}
}
public void run(){
while(true){
try{
for(i=0;i<300;i++){
y[i]++;
if(y[i]>768){
y[i]=0;
}
}
Thread.sleep(30);
}catch(Exception e){};
repaint();
}
}
}