Java小球動態屏保程式的製作
阿新 • • 發佈:2018-12-15
一、首先建立包ball,然後建立模板類BallModel
BallModel類程式碼如下 :
package ball;
import java.awt.Color;
import java.awt.Graphics;
public class BallModel {
int x,y,d,speed; //定義小球的x,y座標,小球直徑和速度
Color c;
//構造方法
public BallModel() {
x=(int)(Math.random()*1920); //隨機生成x座標
y=(int)(Math.random ()*1080); //隨機生成y座標
d=(int)(Math.random()*50)+10; //小球直徑
speed=12-d/6; //球直徑越小速度越快
c=new Color((int)(Math.random()*256), (int)(Math.random()*256), (int)(Math.random()*256)); //隨機生成小球顏色
}
//畫出小球
public void drawBall(Graphics g){
g.setColor(c);
g.fillOval(x, y, d, d);
}
}
二、新建BallPanel類,建立物件和移動小球
BallPanel類程式碼如下 :
package ball;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import javax.swing.JPanel;
public class BallPanel extends JPanel implements MouseMotionListener {
/**
*
*/
private static final long serialVersionUID = 5088665161758943179L;
int[] dir=new int[200]; //小球路徑陣列
BallModel[] ba=new BallModel[200]; //小球物件陣列
public BallPanel (){
for (int i = 0; i < ba.length; i++) {
ba[i]=new BallModel(); //建立小球物件
dir[i]=(int)(Math.random()*4+1); //生成小球路徑
}
}
//畫出小球
@Override
public void paint(Graphics g) {
super.paint(g);
setOpaque(false);
for (int i = 0; i < ba.length; i++) {
ba[i].drawBall(g); //呼叫模板中畫小球的方法
}
}
//小球的移動軌跡控制
public void moveBall(){
new Thread(){
public void run() { //重寫run方法
super.run();
while(true){
for (int i=0;i<ba.length;i++){ //迴圈所有小球
//判斷路徑,增加值使小球前進
switch (dir[i]) {
case 1:{
ba[i].x+=ba[i].speed;
ba[i].y+=ba[i].speed;
break;
}case 2:{
ba[i].x-=ba[i].speed;
ba[i].y+=ba[i].speed;
break;
}case 3:{
ba[i].x-=ba[i].speed;
ba[i].y-=ba[i].speed;
break;
}case 4:{
ba[i].x+=ba[i].speed;
ba[i].y-=ba[i].speed;
break;
}default:
break;
}
//判斷邊界值,改變小球路徑
if(ba[i].x>1920 - ba[i].d){
if(dir[i]==1){dir[i]=2;}
if(dir[i]==4){dir[i]=3;}
ba[i].c=new Color((int)(Math.random()*256), (int)(Math.random()*256), (int)(Math.random()*256));
}
if(ba[i].x<0){
if(dir[i]==2){dir[i]=1;}
if(dir[i]==3){dir[i]=4;}
ba[i].c=new Color((int)(Math.random()*256), (int)(Math.random()*256), (int)(Math.random()*256));
}
if(ba[i].y>1080 - ba[i].d){
if(dir[i]==1){dir[i]=4;}
if(dir[i]==2){dir[i]=3;}
ba[i].c=new Color((int)(Math.random()*256), (int)(Math.random()*256), (int)(Math.random()*256));
}
if(ba[i].y<0){
if(dir[i]==4){dir[i]=1;}
if(dir[i]==3){dir[i]=2;}
ba[i].c=new Color((int)(Math.random()*256), (int)(Math.random()*256), (int)(Math.random()*256));
}
}
repaint(); //重畫
try {
Thread.sleep(20); //休眠20毫秒
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
}.start();
}
@Override
public void mouseDragged(MouseEvent e) {
System.exit(0); //退出
}
@Override
public void mouseMoved(MouseEvent e) {
}
}
三、新建BallFrame類,建立屏保視窗,新增元件
BallFrame類程式碼如下
package ball;
import javax.swing.JFrame;
import com.sun.awt.AWTUtilities;
public class BallFrame {
public static void main(String[] args) throws InterruptedException {
JFrame j=new JFrame();
BallPanel b=new BallPanel();
j.add(b);
j.setSize(1920, 1080);
j.setUndecorated(true); //去邊框
j.setLocationRelativeTo(null); //居中
j.setDefaultCloseOperation(3); //預設關閉
AWTUtilities.setWindowOpaque(j, false); //設定透明
j.setVisible(true); //設為可見
b.moveBall(); //呼叫小球移動方法
j.addMouseMotionListener(b); //註冊監聽器
}
}
OK,一個簡單的屏保程式就完成了。
歡迎訪問我的網站: 學長幫