資源簡介
java寫的一個流星雨小程序【全屏版】是之前發布的java寫的一個流星雨小程序全屏幕的版本,自動獲取屏幕大小、去除邊框、最大化最小化關閉按鈕,實現全屏。

代碼片段和文件信息
/*
?思路?:??在一個黑色的JPanel上畫出星星和月亮,星星可以用隨機數+循環來畫,每個星星其實就是一個白色的小圓(fillOval)?
???月亮的畫法:先畫一個白的的圓,再畫一個黑色的圓擋住白的的圓一部分,就形成了月牙了
???流星的畫法:就是畫了幾根線(drawLine)??當流星飛出界面以后,流星的坐標在一個新的線程中隨機改變,達到隨機生成流星雨的效果
???流星的運動:在線程run()方法內循壞改變Line的坐標
???
??糾結了很久的事情是:在調用repaint方法后,屏幕閃得厲害,在網上搜解決辦法是用雙重緩沖,由于本人研究得不仔細,花了好長時間才搞頂。。。。。。汗
?*/
import?java.awt.Color;
import?java.awt.Dimension;
import?java.awt.Graphics;
import?java.awt.Toolkit;
import?java.awt.image.BufferedImage;
import?java.util.Random;
import?javax.swing.Jframe;
import?javax.swing.JPanel;
@SuppressWarnings(“serial“)
public?class?sky?extends?Jframe?{
JPanel?jp1;?//?用新的面板來畫天空
int?rdm1[]?=?new?int[150]?rdm2[]?=?new?int[150];?//?兩個隨機數組用來存放150個隨機的橫坐標和縱坐標
int?a?b;?//?分別表示星星的?橫坐標和縱坐標?a?=?rdm1[]?b?=?rdm2[]?;
//?這樣做得目的是讓隨機數只產生一次隨機的坐標,避免在repaint()的時候星星的坐標會不斷改變
int?x?=?1100?y?=?200?x1?=?400?y1?=?100?x2?=?700?y2?=?300?x3?=?300
y3?=?400;?//?初始的時候四顆流星的坐標
Random?r?=?new?Random();?//?新建一個隨機引用
Dimension???screensize???=???Toolkit.getDefaultToolkit().getScreenSize();
int?width?=?(int)screensize.getWidth(); //屏幕尺寸
int?height?=?(int)screensize.getHeight();?//屏幕尺寸
sky()?{
init();
}
void?init()?{
settitle(“流星雨“);
setLocation(0?0);
setDefaultCloseOperation(Jframe.EXIT_ON_CLOSE);
setSize(width?height);
setLayout(null);
setUndecorated(true);?
????getGraphicsConfiguration().getDevice().setFullScreenWindow(this);?
jp1?=?new?JPanel();
jp1.setLocation(0?0);
jp1.setSize(width?height);?//?因為本人電腦屏幕大小為?1366*768?這樣就全屏了
jp1.setBackground(Color.black);?//?把JPanel顏色設置為黑色
setResizable(false);?//?設置窗口不可調整大小
//?this.getContentPane().setBackground(Color.black);
add(jp1);?//?將jp1添加進面板
setVisible(true);
for?(int?i?=?0;?i?150;?i++)?{?//?產生150個隨機數,然后賦給兩個數組,用作以后分別賦值給150顆星星的橫坐標和縱坐標
rdm1[i]?=?r.nextInt(width);
rdm2[i]?=?r.nextInt(height);
}
new?tt().start();?//?開始新線程,產生流星運動的效果
}
public?void?paint(Graphics?g)?{
//?這用到的是雙重緩沖,避免面板在重繪的時候不停的閃爍
BufferedImage?bf?=?new?BufferedImage(width?height?1);?//?創建一副緩沖圖
Graphics?bg?=?bf.createGraphics();?//?創建緩沖圖片的graphics對象
jp1.paint(bg);?//?在p1上畫出bg
bg.setColor(Color.white);
bg.fillOval(1200?100?80?80);?//?畫白色的圓
for?(int?i?=?0;?i?150;?i++)?{?//?150顆隨機的星星
a?=?rdm1[i];
b?=?rdm2[i];
bg.fillOval(a?b?3?4);
}
bg.drawLine(x?y?x?+?70?y?-?70);?//?四顆流星初始位置
bg.drawLine(x1?y1?x1?+?50?y1?-?50);?//?四顆流星初始位置
bg.drawLine(x2?y2?x2?+?60?y2?-?60);?//?四顆流星初始位置
bg.drawLine(x3?y3?x3?+?60?y3?-?60);?//?四顆流星初始位置
bg.setColor(Color.black);
bg.fillOval(1180?85?80?80);?//?畫黑色的圓擋住之前畫的白色的圓的一部分,形成月亮
g.drawImage(bf?0?0?width?height?jp1);
//?在?g上畫出?bf圖片(雙重緩沖)?也就是把所有圖像都畫出來了
}
class?tt?extends?Thread?{
public?void?run()?{
//?改變流星的坐標達到運動效果
while?(true)?{
repaint();
x?-=?4;
y?+=?4;
x1?-=?4;
y1?+=?4;
x2?-=?4;
y2?+=?4;
x3?-=?4;
y3?+=?4;
//?當流星飛出界面后,隨機為飛出的流星在界面內生成一個新的位
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????目錄???????????0??2018-05-25?17:25??sky\
?????文件????????4487??2018-05-25?17:25??sky\sky.java
評論
共有 條評論