資源簡(jiǎn)介
java寫(xiě)的一個(gè)流星雨小程序【全屏版】是之前發(fā)布的java寫(xiě)的一個(gè)流星雨小程序全屏幕的版本,自動(dòng)獲取屏幕大小、去除邊框、最大化最小化關(guān)閉按鈕,實(shí)現(xiàn)全屏。

代碼片段和文件信息
/*
?思路?:??在一個(gè)黑色的JPanel上畫(huà)出星星和月亮,星星可以用隨機(jī)數(shù)+循環(huán)來(lái)畫(huà),每個(gè)星星其實(shí)就是一個(gè)白色的小圓(fillOval)?
???月亮的畫(huà)法:先畫(huà)一個(gè)白的的圓,再畫(huà)一個(gè)黑色的圓擋住白的的圓一部分,就形成了月牙了
???流星的畫(huà)法:就是畫(huà)了幾根線(drawLine)??當(dāng)流星飛出界面以后,流星的坐標(biāo)在一個(gè)新的線程中隨機(jī)改變,達(dá)到隨機(jī)生成流星雨的效果
???流星的運(yùn)動(dòng):在線程run()方法內(nèi)循壞改變Line的坐標(biāo)
???
??糾結(jié)了很久的事情是:在調(diào)用repaint方法后,屏幕閃得厲害,在網(wǎng)上搜解決辦法是用雙重緩沖,由于本人研究得不仔細(xì),花了好長(zhǎng)時(shí)間才搞頂。。。。。。汗
?*/
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;?//?用新的面板來(lái)畫(huà)天空
int?rdm1[]?=?new?int[150]?rdm2[]?=?new?int[150];?//?兩個(gè)隨機(jī)數(shù)組用來(lái)存放150個(gè)隨機(jī)的橫坐標(biāo)和縱坐標(biāo)
int?a?b;?//?分別表示星星的?橫坐標(biāo)和縱坐標(biāo)?a?=?rdm1[]?b?=?rdm2[]?;
//?這樣做得目的是讓隨機(jī)數(shù)只產(chǎn)生一次隨機(jī)的坐標(biāo),避免在repaint()的時(shí)候星星的坐標(biāo)會(huì)不斷改變
int?x?=?1100?y?=?200?x1?=?400?y1?=?100?x2?=?700?y2?=?300?x3?=?300
y3?=?400;?//?初始的時(shí)候四顆流星的坐標(biāo)
Random?r?=?new?Random();?//?新建一個(gè)隨機(jī)引用
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);?//?因?yàn)楸救穗娔X屏幕大小為?1366*768?這樣就全屏了
jp1.setBackground(Color.black);?//?把JPanel顏色設(shè)置為黑色
setResizable(false);?//?設(shè)置窗口不可調(diào)整大小
//?this.getContentPane().setBackground(Color.black);
add(jp1);?//?將jp1添加進(jìn)面板
setVisible(true);
for?(int?i?=?0;?i?150;?i++)?{?//?產(chǎn)生150個(gè)隨機(jī)數(shù),然后賦給兩個(gè)數(shù)組,用作以后分別賦值給150顆星星的橫坐標(biāo)和縱坐標(biāo)
rdm1[i]?=?r.nextInt(width);
rdm2[i]?=?r.nextInt(height);
}
new?tt().start();?//?開(kāi)始新線程,產(chǎn)生流星運(yùn)動(dòng)的效果
}
public?void?paint(Graphics?g)?{
//?這用到的是雙重緩沖,避免面板在重繪的時(shí)候不停的閃爍
BufferedImage?bf?=?new?BufferedImage(width?height?1);?//?創(chuàng)建一副緩沖圖
Graphics?bg?=?bf.createGraphics();?//?創(chuàng)建緩沖圖片的graphics對(duì)象
jp1.paint(bg);?//?在p1上畫(huà)出bg
bg.setColor(Color.white);
bg.fillOval(1200?100?80?80);?//?畫(huà)白色的圓
for?(int?i?=?0;?i?150;?i++)?{?//?150顆隨機(jī)的星星
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);?//?畫(huà)黑色的圓擋住之前畫(huà)的白色的圓的一部分,形成月亮
g.drawImage(bf?0?0?width?height?jp1);
//?在?g上畫(huà)出?bf圖片(雙重緩沖)?也就是把所有圖像都畫(huà)出來(lái)了
}
class?tt?extends?Thread?{
public?void?run()?{
//?改變流星的坐標(biāo)達(dá)到運(yùn)動(dòng)效果
while?(true)?{
repaint();
x?-=?4;
y?+=?4;
x1?-=?4;
y1?+=?4;
x2?-=?4;
y2?+=?4;
x3?-=?4;
y3?+=?4;
//?當(dāng)流星飛出界面后,隨機(jī)為飛出的流星在界面內(nèi)生成一個(gè)新的位
?屬性????????????大小?????日期????時(shí)間???名稱
-----------?---------??----------?-----??----
?????目錄???????????0??2018-05-25?17:25??sky\
?????文件????????4487??2018-05-25?17:25??sky\sky.java
評(píng)論
共有 條評(píng)論