绘图与多媒体_第1页
绘图与多媒体_第2页
绘图与多媒体_第3页
绘图与多媒体_第4页
绘图与多媒体_第5页
已阅读5页,还剩58页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Ch09繪圖與多媒體JAVA程式設計進階(I)1大綱繪圖的基礎Graphics類別的色彩、文字與繪圖圖片的載入與顯示動畫效果JavaApplet的圖片載入音樂的播放2023/5/272Graphics繪圖類別-取得Graphics繪圖類別在JavaApplet程式範例已經說明過paint()方法繪出文字和簡單圖形,使用的是Graphics類別的方法。在Java執行繪圖功能需要使用「圖形內容」(GraphicsContexts)的Graphics物件,繪製的文字、影像和圖形都是繪製在此畫布物件上,如同將GUI元件新增到JFrame物件的ContentPane物件一般。2023/5/273範例1:使用Applet呈現圖Ch11_10.javaimportjava.applet.Applet;importjava.awt.*;publicclassCh11_10extendsApplet{publicvoidpaint(Graphicsg){setBackground(Color.lightGray);g.setColor(Color.red);g.fillRect(10,10,100,100);}}Ch11_10.html<HTML><head><title>Ch11_10.html</title></head><body><hr><center><appletcode=Ch11_10.classwidth=200height=200></applet></center><hr></body></html>2023/5/274Graphics繪圖類別-paint()方法繼承自Component元件的paint()方法在呼叫時,其傳入參數就是Graphics物件,如下所示:publicvoidpaint(Graphicsg){………}在上述的paint()方法呼叫繪圖方法,就可以在元件上繪出圖形。2023/5/275範例2:使用JFrame類別的畫布importjavax.swing.*;importjava.awt.*;importjava.awt.event.*;classCh11_11extendsJFrame{Ch11_11(){super("JFrame畫布");Containerc=getContentPane();c.setBackground(Color.lightGray);}publicvoidpaint(Graphicsg){g.setColor(Color.red);g.fillRect(10,10,100,100);}publicstaticvoidmain(String[]args){//建立Swing應用程式

Ch11_11app=newCh11_11();//關閉視窗事件,結束程式的執行

app.addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEventevt){System.exit(0);}});app.setSize(300,200);//設定尺寸

app.setVisible(true);//顯示視窗

}}2023/5/276Graphics繪圖類別-getGraphics()方法在paint()方法之外的其它方法執行繪圖,可以使用getGraphics()方法取得元件的Graphics物件,如下所示:Graphicsg=app.getGraphics();上述程式碼取得app元件的Graphics物件,接著就可以呼叫繪圖方法在元件上繪出圖形。2023/5/277範例3:使用getGraphics()importjavax.swing.*;importjava.awt.*;importjava.awt.event.*;classCh11_12extendsJFrame{Ch11_12(){super("JFrame畫布");Containerc=getContentPane();c.setBackground(Color.lightGray);}publicstaticvoidmain(String[]args){//建立Swing應用程式

Ch11_12app=newCh11_12();//關閉視窗事件,結束程式的執行

app.addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEventevt){System.exit(0);}});app.setSize(300,200);//設定尺寸

app.setVisible(true);//顯示視窗

//利用getGraphics()取得GraphicsContextGraphicsg=app.getGraphics();g.setColor(Color.red);g.fillRect(10,10,100,100);}}2023/5/278Graphics繪圖類別-Swing的paintComponent()方法對於繼承自Swing元件的類別。例如:JPanel建立的畫布時,繪圖方法的程式碼是位於覆寫的paintComponent()方法,如下所示:classUserPanelextendsJPanel{//建構子

publicUserPanel(){………}publicvoidpaintComponent(Graphicsg){………}}2023/5/279範例4:JPanel類別的畫布importjavax.swing.*;importjava.awt.*;importjava.awt.event.*;classCh11_13extendsJFrame{GraphicPanelgPanel=newGraphicPanel();Ch11_13(){super("JPanel畫布");Containerc=getContentPane();c.setLayout(newFlowLayout());c.setBackground(Color.lightGray);c.add(gPanel);Graphicsg=gPanel.getGraphics();repaint();}classGraphicPanelextendsJPanel{GraphicPanel(){setPreferredSize(newDimension(200,150));}publicvoidpainComponent(Graphicsg){super.paintComponent(g);g.setColor(Color.red);g.fillRect(10,10,100,100);}}publicstaticvoidmain(String[]args){//建立Swing應用程式

Ch11_13app=newCh11_13();//關閉視窗事件,結束程式的執行

app.addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEventevt){System.exit(0);}});app.setSize(300,200);//設定尺寸

app.setVisible(true);//顯示視窗

}}2023/5/2710Graphics繪圖類別-再談paint()和repaint()方法Swing元件屬於JComponent的子類別,同時繼承Component的paint()和repaint()方法,因為元件繪圖操作大都是呼叫paint()方法完成,paint()方法非常總明,能夠在使用者調整視窗尺寸(例如:縮小和放大元件的視窗)等操作後,或是執行setText()等方法改變元件內容時,自動重新呼叫repaint()方法重繪調整後的圖形和元件。2023/5/2711座標系統與JComponent元件-說明電腦螢幕的座標系統是使用「像素」(Pixels)為單位,Graphics物件的畫布是一張長方形區域,左上角為原點,其座標是(0,0),X軸從左到右,Y軸由上到下,如下圖所示:2023/5/2712座標系統與JComponent元件-取得尺寸座標系統可以使用JComponent元件的getWidth()、getHeight()方法取得元件的寬和高,因為元件的四周預設有邊線,所以需要使用getInsets()取得邊線left、right、top和bottom的尺寸,如下所示:Insetsins=getInsets();intwidth=getWidth()-(ins.left+ins.right);intheight=getHeight()-(ins.top+ins.bottom);2023/5/2713JFrame類別的畫布-說明Java應用程式可以將整個JFrame視窗或某個Swing元件作為畫布,如果是JFrame畫布,只需在paint()方法撰寫繪圖方法的程式碼,就可以在視窗繪出所需圖形。2023/5/2714JFrame類別的畫布-繪圖如果不是在paint()方法,Java程式碼需要使用getGraphics()方法取得Grphics物件後,在Graphics物件繪出所需圖形,如下所示:Graphicsg=app.getGraphics();g.setColor(Color.green);g.fillOval(100,100,40,40);2023/5/2715JPanel類別的畫布Swing的JPanel元件可以取代AWT的Canvas類別畫布,JPanel預設提供「雙緩衝區」(DoubleBuffering)繪圖功能,所有元件的繪圖都是在幕後完成後,才會一次顯示到螢幕上,所以可以加速圖形的顯示。2023/5/2716指定色彩-建立Color物件Java色彩是java.awt.Color的Color物件,這是使用RGB色彩以不同程度的紅、綠和藍3原色混合出的Color色彩物件,如下所示:ColormyColor=newColor(r,g,b);上述參數r、g和b如為int整數,其範圍是0~255,如為float是0.0~1.0。2023/5/2717指定色彩-指定色彩方法在建立好Color物件後,可以使用Graphics類別的方法指定色彩,相關方法如下表所示:2023/5/2718指定字型-建立Font物件Java的字型是java.awt.Font的Font物件,這是代表指定尺寸和樣式的字型,如下所示:FolotmyFont=newFont("新細明體",Font.PLAIN,30);上述參數分別是字型名稱、樣式和尺寸。2023/5/2719指定字型-指定字型方法在建立好Font物件後,可以使用Graphics類別的方法指定字型,相關方法如下表所示:2023/5/2720字型定位尺寸FontMetrics-說明FontMetrics物件可以取得字串和字型細部定位尺寸,以便在畫布上能夠準確編排文字內容,相關字型的細部尺寸,如下圖所示:2023/5/2721字型定位尺寸FontMetrics-相關方法FontMetrics類別的相關方法,如下表所示:2023/5/2722圖形和字串的繪圖方法-1Graphics類別提供多種方法可以繪出線條、長方形、圓邊長方形、圓形或橢圓形,如下表所示:2023/5/2723圖形和字串的繪圖方法-22023/5/2724圖形和字串的繪圖方法-32023/5/2725填滿圖形的繪圖方法-1Graphics類別還提供繪出填滿圖形的相關方法,如下表所示:2023/5/2726填滿圖形的繪圖方法-22023/5/2727填滿圖形的繪圖方法-32023/5/2728圖片的載入與顯示-說明Java程式是使用Image物件來載入圖片,Image是抽象類別,其繼承的子類別可以儲存多種格式的圖片檔案。在使用上是以Toolkit抽象類別(AbstractWindowToolkit實作的抽象類別)的方法將圖檔載入成為Image物件。2023/5/2729圖片的載入與顯示-載入首先使用getDefaultToolkit()取得Toolkit物件,如下所示:Toolkittoolkit=Toolkit.getDefaultToolkit();程式碼在取得Toolkit物件toolkit後,使用getImage()方法載入圖檔,例如:取得JPG圖檔sample.jpg的Image物件,其程式碼如下所示:Imageimage=toolkit.getImage("sample.jpg");2023/5/2730圖片的載入與顯示-顯示在paint()或paintComponent()方法使用drawImage()顯示圖檔的Image物件,如下所示:g.drawImage(image,5,5,this);程式碼是在座標(5,5)顯示名為image的Image物件,實作ImageObserver介面的物件是元件本身this,因為繼承自Component類別的Swing元件都已經實作ImageObserver介面,所以使用元件本身即可。2023/5/2731範例5:讀取圖片importjavax.swing.*;importjava.awt.*;importjava.awt.event.*;classCh11_15extendsJFrame{//建構子

Ch11_15(){super("載入與顯示圖片");Containerc=getContentPane();Toolkittoolkit=Toolkit.getDefaultToolkit();Imageimage=toolkit.getImage("MickeyChristmas.jpg");ImagePanelimagePane=newImagePanel(image);c.add(imagePane);}classImagePanelextendsJPanel{privateImageimage;//建構子

ImagePanel(Imageimage){this.image=image;}publicvoidpaintComponent(Graphicsg){super.paintComponent(g);g.drawImage(image,5,5,this);}}publicstaticvoidmain(String[]args){Ch11_15app=newCh11_15();//關閉視窗事件,結束程式的執行

app.addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEventevt){System.exit(0);}});app.setSize(370,320);//設定尺寸

app.setVisible(true);//顯示視窗

}}2023/5/2732圖片的載入與顯示-圖例2023/5/2733調整圖片尺寸-圖片的放大與縮小drawImage()方法新增參數width和height,分別是圖片的寬和高,如果設定的尺寸比原圖形小是縮小圖片,反之就是放大圖片。booleandrawImage(Imageimage,intx,inty,intwidth,intheight,ImageObserverobserver)2023/5/2734調整圖片尺寸-圖片的翻轉與剪裁booleandrawImage(Imageimage,intx1,inty1,intx2,inty2,intsx1,intsy1,intsx2,intsy2,ImageObserverobserver)drawImage()方法參數的4個座標分成2組,其說明如下表所示:2023/5/2735調整圖片尺寸-圖片翻轉首先來看翻轉圖片情況:如果sample.gif原始圖片尺寸的寬是width,高是height,原始圖片的左上角座標是(0,0),右下角座標為(width,height),翻轉操作如下:原尺寸上下翻轉:原始圖片座標分別為(0,height)和(width,0),換句話說,原始圖片的左下角成為顯示圖片的左上角,而右上角成為右下角。原尺寸左右翻轉:原始圖片座標分別為(width,0)和(0,height),換句話說,原始圖片的右上角成為顯示圖片的左上角,而左下角成為右下角。2023/5/2736調整圖片尺寸-圖片的剪裁翻轉與剪裁圖片是使用第2組座標,如果第2組座標的尺寸只有部分的圖片,就會剪裁圖片。2023/5/2737範例6:圖片放大,縮小,旋轉classImagePanelextendsJPanel{privateImageimage;//建構子

ImagePanel(Imageimage){setPreferredSize(newDimension(900,620));this.image=image;}publicvoidpaintComponent(Graphicsg){intx,y,width,height;width=image.getWidth(this);height=image.getHeight(this);super.paintComponent(g);x=0;y=5;g.drawImage(image,x,y,this);

//縮小1/2x+=width;//設定第二張圖的起始位置

g.drawImage(image,x,y,width/2,height/2,this);//上下旋轉

x+=width/2;g.drawImage(image,x,y,x+width,y+height,0,height,width,0,this);//左右旋轉

x=0;y+=height+5;g.drawImage(image,x,y,x+height/2,y+width/2,width,0,0,height,this);//放大並剪裁(取原圖的1/4並放大到原圖大小)x+=height/2;g.drawImage(image,x,y,x+width,y+height,0,0,width/2,height/2,this);}}2023/5/2738動畫效果動畫效果是使用卡通片的製作原理,快速顯示一張張靜態圖片,因為每張圖片擁有少許改變。例如:位移或尺寸,或定時在不同位置繪出圖形,在人類視覺殘留的情況下,就會產生動畫效果。2023/5/2739Timer類別的時間控制-說明在Java程式建立動畫效果是使用Timer計時器類別控制繪圖或圖片顯示,Timer類別可以在間隔時間自動產生事件,以便指定傾聽者物件進行處理。Timer類別的建構子,如下表所示:2023/5/2740Timer類別的時間控制-使用Timer類別的使用十分的簡單,只需先建立好Timer物件,如下所示:Timertimer=newTimer(300,this);上述程式碼建立Timer物件且設定300毫秒間隔時間產生事件,傾聽者物件是本身,接著就可以呼叫下表Timer類別的方法啟動、重新啟動和停止計時器。2023/5/2741Timer類別的時間控制-方法1呼叫下表Timer類別的方法啟動、重新啟動和停止計時器,如下表所示:2023/5/2742Timer類別的時間控制-方法2Timer類別的其它相關方法,如下表所示:2023/5/2743圖片移動的動畫效果在Java程式只需使用Timer類別配合圖片載入與顯示,就可以建立圖片移動橫跨螢幕的動畫效果。2023/5/2744範例7:動畫importjavax.swing.*;importjava.awt.*;importjava.awt.event.*;//繼承JFrame類別,實作ActionListener介面publicclassCh11_08extendsJFrameimplementsActionListener{privateintoffset=-10;privateImageim;privateTimertimer;privateAnimationPaneanimationPane;//建構子

publicCh11_08(){super("動畫功能的顯示範例");intdelay=100;timer=newTimer(delay,this);timer.setInitialDelay(0);Containerc=getContentPane();c.setLayout(newFlowLayout());c.setBackground(Color.gray);Toolkittoolkit=Toolkit.getDefaultToolkit();im=toolkit.getImage("023.gif");animationPane=newAnimationPane(im);c.add(animationPane);timer.start();}app.setSize(300,150);//設定尺寸

app.setVisible(true);//顯示視窗

}}//顯示動畫的JPanelclassAnimationPaneextendsJPanel{Imageimage;//建構子

publicAnimationPane(Imageimage){setPreferredSize(newDimension(250,100));setBackground(Color.lightGray);this.image=image;}publicvoidpaintComponent(Graphicsg){super.paintComponent(g);intwidth=getWidth();intheight=getHeight();//計算圖片的尺寸

intimgWidth=image.getWidth(this);intimgHeight=image.getHeight(this);g.drawImage(image,((offset*5)%(imgWidth+width))-imgWidth,(height-imgHeight)/2,this);}}//實作事件處理方法

publicvoidactionPerformed(ActionEventevt){offset++;animationPane.repaint();//重繪

}//主程式

publicstaticvoidmain(String[]args){//建立Swing應用程式

Ch11_08app=newCh11_08();//關閉視窗事件,結束程式的執行

app.addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEventevt){System.exit(0);}});2023/5/2745範例8:動畫(會更換圖片)importjava.awt.*;importjava.applet.*;publicclassCh11_09extendsAppletimplementsRunnable{Threadfly;intx,y,dx,dy,flag,num,i;Image[]Img;publicvoidinit(){x=getWidth();y=50;dx=-5;dy=0;Img=newImage[4];num=1;Img[0]=getImage(getDocumentBase(),"013.gif");Img[1]=getImage(getDocumentBase(),"023.gif");Img[2]=getImage(getDocumentBase(),"024.gif");Img[3]=getImage(getDocumentBase(),"001.gif");}publicvoidstart(){fly=newThread(this);fly.start();}

publicvoidrun(){while(true){x=x+dx;y=y+dy;flag=num%4;repaint();num=num+1;

if(x<0)x=getWidth();

try{Thread.sleep(1500);}catch(InterruptedExceptione){}}}publicvoidpaint(Graphicsg){g.drawImage(Img[flag],x,y,x+10,y+25,this);}}2023/5/2746JavaApplet的圖片載入-Applet在JavaApplet程式載入和顯示圖片是使用getImage()方法將圖片載入成為Image物件,例如:建立URL物件來載入圖片,如下所示:Imageimage=getImage(newURL(""));使用getDocumentBase()或getCodeBase()方法取得檔案的URL位置,如下圖所示:Imageimage=getImage(getDocumentBase(),"sample.gif");2023/5/2747JavaApplet的圖片載入-JAppletJavaApplet繼承自JApplet可以使用Swing的ImageIcon物件來載入和顯示圖片。例如:使用ImageIcon載入Baby.jpg圖檔的程式碼,如下所示:ImageIconimage1=newImageIcon("Baby.jpg");在載入圖片成為ImageIcon物件後,就可以使用paintIcon()方法顯示圖片,如下所示:image1.paintIcon(this,g,5,5);2023/5/2748音樂的播放-說明在JavaApplet不只可以顯示圖片,還可以播放音樂檔案,目前支援的音樂檔案格式有au、aiff、wav、mid和rmf。2023/5/2749音樂的播放-載入在JavaAPI的java.applet.*套件的Applet類別提供getAudioClip()方法建立AudioClip物件載入音樂檔案,如下所示:AudioClipaudio=getAudioClip(getDocumentBase(),"Microsoft.wav");程式碼建立AudioClip物件,參數為URL物件和音樂檔案名稱。2023/5/2750音樂的播放-播放在建立好AudioClip物件後,就可以使用AudioClip介面的3個方法控制音樂的播放,如下表所示:2023/5/2751範例8:播放音樂(使用Applet)importjava.awt.*;importjava.awt.event.*;importjavax.swing.*;importjava.applet.*;//繼承JApplet類別,實作ActionListener介面publicclassCh11_07extendsJAppletimplementsActionListener{privateAudioClipaudio;privateJButtonplay,loop,stop;//初始方法

publicvoidinit(){//取得參數

Stringfile=getParameter("FILE");Containerc=getContentPane();c.setBackground(Color.gray);c.setLayout(newFlowLayout(FlowLayout.CENTER));audio=getAudioClip(getDocumentBase(),file);play=newJButton("播放");play.addActionListener(this);c.add(play);loop=newJButton("循環播放");loop.addActionListener(this);c.add(loop);stop=newJButton("停止");stop.addActionListener(this);c.add(stop);}//實作事件處理方法

publicvoidactionPerformed(ActionEventevt){if(evt.getSource()==play)audio.play();elseif(evt.getSource()==loop)audio.loop();elseif(evt.getSource()==stop)audio.stop();}}2023/5/2752範例8:播放音樂(使用Applet)-續<html><head><title>Ch11_07.htm</title></head><body><appletcode="Ch11_07.class"width=350height=50><paramname="File"value="FIR_YueYaWan_F.mid"></applet></body></html>2023/5/2753範例9:播放音樂(使用Sound)importjava.io.*;importjavax.sound.sampled.*;publicclassCh11_07_02{publicstaticvoidmain(Stringargs[]){try{System.out.println("播放聲音檔案:"+"jay1.wav");=newFile("jay1.wav");//取得聲音輸入串流

AudioInputStreamastr=AudioSystem.getAudioInputStream(sf);//取得聲音形式

AudioFormatafmt=astr.getFormat();//建立訊號線資訊物件

DataLine.Infoinf=newDataLine.Info(SourceDataLine.class,afmt);//取得符合指定訊號線資訊的訊號線

SourceDataLinel=(SourceDataLine)AudioSystem.getLine(inf);//以指定形式開啟訊號線

l.open(afmt);//開始訊號線的讀寫

l.start();//讀寫緩寫區

byte[]buf=newbyte[65536];//從聲音串流讀入資料寫入混音器

for(intn=0;(n=astr.read(buf,0,buf.length))>0;){l.write(buf,0,n);}//清掉混音器內的資料

l.drain();//關閉

l.close();}catch(Exceptione){e.printStackTrace();}

System.exit(0);}}2023/5/2754範例10:滑鼠控制圖像移動importjava.awt.*;importjava.applet.*;publicclassCh11_21extendsAppletimplementsRunnable{Threadflag;intx,y,dx,dy;ImageImg;PointclickPoint;Stringmessage="";publicvoidinit(){x=y=50;dx=5;dy=0;Img=getImage(getDocumentBase(),"010.gif");}

publicbooleanmouseDown(Eventevt,intmx,intmy){if((mx>=400)&&(mx<=410)&&(my>=400)&&(my<=410)){dx=0;dy=-5;}if((mx>=400)&&(mx<=410)&&(my>=440)&&(my<=450)){dx=0;dy=5;}if((mx>=380)&&(mx<=390)&&(my>=420)&&(my<=430)){dx=-5;dy=0;}if((mx>=420)&&(mx<=430)&&(my>=420)&&(my<=430)){dx=5;dy=0;}clickPoint=newPoint(mx,my);message="Mouse_click_Position:)"+mx+","+my+")";repaint();returntrue;}

2023/5/2755範例10:滑鼠控制圖像移動(續)publicvoidstart(){flag=newThread(this);flag.start();}publicvoidrun(){while(true){x=x+dx;y=y+dy;repaint();

if(x<=0)dx=5;elseif(x+70>=getWidth())dx=-5;elseif(y+70>=getHeight())dy=-5;try{Thread.sleep(250);}catch(InterruptedExceptione){}}}

publicvoidpaint(Graphicsg){g.drawString(message,5,15);g.drawRect(400,400,10,10);g.drawRect(400,440,10,10);g.drawRect(380,420,10,10);g.drawRect(420,420,10,10);g.drawImage(Img,x,y,this);}}2023/5/2756範例11:方向鍵控制圖像移動importjava.awt.*;importjava.applet.*;publicclassCh11_22extendsAppletimplementsRunnable{Threadflag;intx,y,dx,dy;ImageImg;publicvoidinit(){x=y=50;dx=5;dy=0;Img=getImage(getDocumentBase(),"010.gif");}

publicbooleankeyDown(Eventevt,intkey){switch(key){caseEvent.UP:dx=0;dy=-5;break;caseEvent.DOWN:dx=0;dy=5;break;caseEvent.LEFT:dx=-5;dy=0;break;caseEvent.RIGHT:dx=5;dy=0;}returntrue;}publicvoidstart(){flag=newThread(this);flag.start();}

2023/5/2757範例11:方向鍵控制圖像移動(續)publicvoidrun(){while(true){x=x+dx;y=y+dy;repaint();

if(x<=0)dx=5;elseif(x+70>=getWidth())dx=-5;elseif(y+70>=getHeight())dy=-5;try{Thread.sleep(250);}catch(InterruptedExceptione){}}}

publicvoidpaint(Graphicsg){g.drawImage(Img,x,y,this);}}2023/5/2758研究:用球擊中靶塊importjava.awt.*;importjava.lang.*;importjava.applet.*;publicclassBlockHitextendsAppletimplementsRunnable{intfieldx1=0;intfieldy1=0;intfieldx2=256;intfieldy2=306;intblock_xnum=10;intblock_ynum=8;intblock_width=15;intblock_height=5;intblock_left_board=6;intblock_up_board=46;intblock_lower_board=116;intpad_width=20;Graphicsg;ThreadtheBall;intblockState[][]=newint[block_xnum][block_ynum];intpadx;intballX,ballY;intballDX,ballDY;intspeed;interaseCount;intpadHitCount;intscore;intleft;booleanonGame;booleanonFireBall;PanelpControl;LabellScore,lLeft;ButtonbControl;intthreadProcessing;

publicvoidinit(){setLayout(newBorderLayout());setBackground(Color.green);g=getGraphics();pControl=newPanel();pControl.setBackground(Color.gray);pControl.setLayout(newFlowLayout());bControl=newButton("START");lScore=newLabel("SCORE:0");lLeft=newLabel("LEFT:5");pControl.add(bControl);pControl.add(lScore);pControl.add(lLeft);add("South",pControl);}publicvoidstart(){gameInit();onGame=false;onFireBall=false;}

2023/5/2759voidgameInit(){for(intx=0;x<block_xnum;x++)for(inty=0;y<block_ynum;y++)blockState[x][y]=1;padx=fieldx2/2;

score=0;addScore(0);left=5;subLeft(0);eraseCount=0;bControl.setLabel("START");threadProcessing=0;repaint();}publicvoidpaint(Graphicsg){g.drawRect(fieldx1,fieldy1,fieldx2,fieldy2);g.setColor(Color.blue);for(inty=0;y<block_ynum;y++){for(intx=0;x<block_xnum;x++){if(blockState[x][y]==1)g.fillRect(block_left_board+x*(block_width+10),block_up_board+y*(block_height+5),block_width,block_height);}}}

publicvoidremakeBlock(){g.setColor(Color.blue);for(intx=0;x<block_xnum;x++)for(inty=0;y<block_ynum;y++){blockState[x][y]=1;g.fillRect(block_left_board+x*(block_width+10),block_up_board+y*(block_height+5),block_width,block_height);}}publicbooleanaction(Evente,Objecto){if(e.targetinstanceofButton){if("START".equals(o)){if(onGame==false){gameInit();bControl.setLabel("STOP");onGame=true;}}elseif("STOP".equals(o)){stop();bControl.setLabel("START");onGame=false;onFireBall=false;}returntrue;}returnfalse;}

2023/5/2760publicbooleanmouseDown(java.awt.Evente,intx,inty){if(onGame==true){if(onFireBall==false){ballX=(padx/10)*10+1;if(ballX>block_xnum*(block_width+10)-5)ballX=block_xnum*(block_width+10)-5;elseif(ballX<block_left_board)ballX=block_left_board;if(padx<fieldx2/2)ballDX=-5;elseballDX=5;ballY=fieldy2-25;ballDY=-10;speed=150;padHitCount=0;subLeft(1);threadProcessing=0;onFireBall=true;if(theBall!=null){theBall=null;}if(theBall==null){theBall=newThread(this);theBall.start();}}}returntrue;}

publicbooleanmouseMove(java.awt.Evente,intx,inty){padx=x-7;if(padx<1)padx=1;if(padx>fieldx2-pad_width)padx=fieldx2-pad_width;while(threadProcessing==1){}g.setColor(Color.green);g.fillRect(1,(fieldy2-20),(fieldx2-1),5);g.setColor(Color.black);g.fillRect(padx,(fieldy2-20),pad_width,5);g.setColor(Color.green);returntrue;}publicvoidstop(){if(theBall!=null){theBall.stop();theBall=null;}}

2023/5/2761publicvoidrun(){intballPX,ballPY;while(true){ballPX=ballX;ballPY=ballY;

ballX=ballX+ballDX;ballY=ballY+ballDY;if((ballY==(fieldy2-25))&&(ballX>=padx-5)&&(ballX<=padx+pad_width))ballDY=-ballDY;if((ballX>=(fieldx2-5))||(ballX<=1))ballDX=-ballDX;

if(ballY<=1)ballDY=-ballDY;if(ballY>=fieldy2-10){if(left==0){onGame=false;bControl.setLabel("START");}

g.setColor(Color.green);g.fillRect(ballPX,ballPY,5,5);onFireBall=false;theBall.stop();}

if(ballDY>0){if((ballY>=block_up_board-5)&&(ballY<=block_lower_board-5)){intblockX=ballX

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论