chapter09多媒體與圖形學(xué)程序設(shè)計(jì)-JavaP_第1頁
chapter09多媒體與圖形學(xué)程序設(shè)計(jì)-JavaP_第2頁
chapter09多媒體與圖形學(xué)程序設(shè)計(jì)-JavaP_第3頁
chapter09多媒體與圖形學(xué)程序設(shè)計(jì)-JavaP_第4頁
chapter09多媒體與圖形學(xué)程序設(shè)計(jì)-JavaP_第5頁
已閱讀5頁,還剩35頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、第9章 多媒體與圖形學(xué)程序設(shè)計(jì)JAVA授課教師:趙小敏授課教師:趙小敏Java 2005 趙小敏Chapter 8 - 1第9章 多媒體與圖形學(xué)程序設(shè)計(jì)主要內(nèi)容:一、聲音播放一、聲音播放二、二、圖圖像像顯顯示示三、三、圖圖形形處處理理四、四、動(dòng)動(dòng)畫畫處處理理 2005 趙小敏2一、聲音播放1、加、加載載聲音文件聲音文件在在Applet中播放聲音十分中播放聲音十分簡單簡單,加,加載載聲音文件,然后聲音文件,然后調(diào)調(diào)用用play方法播放即可。方法播放即可。Java提供了兩種播放聲音的方式:提供了兩種播放聲音的方式:一種是通一種是通過過Applet類類的的play方法,一種是通方法,一種是通過過Au

2、dioClip接口中的方法來播放。接口中的方法來播放。Applet的的play方法可方法可以將聲音文件的加以將聲音文件的加載載與播放一并完成,其與播放一并完成,其調(diào)調(diào)用格式如下:用格式如下: void play(URL url) void play(URL url, String name) 2005 趙小敏3加加載載聲音文件聲音文件其中其中URL是一個(gè)網(wǎng)是一個(gè)網(wǎng)絡(luò)絡(luò)地址,網(wǎng)地址,網(wǎng)絡(luò)絡(luò)地址若包含聲音文件地址若包含聲音文件可采用第一種形式,否可采用第一種形式,否則則采用第二種形式,播放本地采用第二種形式,播放本地計(jì)計(jì)算機(jī)上的聲音文件也可采用第二種形式。假算機(jī)上的聲音文件也可采用第二種形式。假設(shè)

3、設(shè)有一個(gè)有一個(gè)MIDI聲音文件聲音文件trip.mid和和Applet放在同一個(gè)目放在同一個(gè)目錄錄下,下,采用如下采用如下調(diào)調(diào)用格式即可播放:用格式即可播放:play(getCodeBase( ),trip.mid);Applet的的getAudioClip方法可方法可創(chuàng)創(chuàng)建建這樣這樣的的對對象,象,該該方方法加法加載載指定網(wǎng)指定網(wǎng)絡(luò)絡(luò)地址的聲音文件,并返回一個(gè)地址的聲音文件,并返回一個(gè)AudioClip對對象,象,調(diào)調(diào)用格式如下:用格式如下: AudioClip getAudioClip(URL url) AudioClip getAudioClip(URL url, String name

4、) 2005 趙小敏4加加載載聲音文件聲音文件創(chuàng)創(chuàng)建建AudioClip對對象后,聲音文件即被加象后,聲音文件即被加載載,可,可調(diào)調(diào)用它用它的方法的方法處處理聲音文件。如果理聲音文件。如果該該方法沒有找到指定的聲音方法沒有找到指定的聲音文件,將返回文件,將返回null值值,此,此時(shí)時(shí)不能引用所不能引用所創(chuàng)創(chuàng)建的建的對對象。象。AudioClip只有只有3個(gè)方法:個(gè)方法: void play()播放一遍;播放一遍; void loop()連續(xù)連續(xù)播放;播放; void stop()停止播放。停止播放。 2005 趙小敏5在在Applet中播放聲音中播放聲音本地本地計(jì)計(jì)算機(jī)工作目算機(jī)工作目錄錄下有

5、下有4個(gè)聲音文件,代表個(gè)聲音文件,代表了了.au 、 、 .mid、 、 .wav種聲音格式,加種聲音格式,加載載并播并播放放這這些聲音文件。些聲音文件。結(jié)結(jié)果如下果如下圖圖所示所示: 2005 趙小敏6例1程序源碼: J_Audio.javaimport java.applet.*;import java.awt.*;import java.awt.event.*;import javax.swing.*;public class J_Audio extends JApplet implements ActionListener, ItemListener private AudioClip

6、 m_soundFirst, m_soundSecond,m_soundThird, m_soundFourth, m_soundCurrent; private JButton m_buttonPlay, m_buttonLoop, m_buttonStop; private JComboBox m_comboChoose; public void init( ) / Build interfaces and set sounds Container container = getContentPane( ); container.setLayout( new FlowLayout( ) )

7、; 2005 趙小敏7 String choices = hi, bark,PINBALL,BATTVLOW ; m_comboChoose = new JComboBox( choices ); m_comboChoose.addItemListener( this ); container.add( m_comboChoose ); m_buttonPlay = new JButton( Play ); m_buttonPlay.addActionListener( this ); container.add( m_buttonPlay ); m_buttonLoop = new JBut

8、ton( Loop ); m_buttonLoop.addActionListener( this ); container.add( m_buttonLoop ); m_buttonStop = new JButton( Stop ); m_buttonStop.addActionListener( this ); container.add( m_buttonStop ); / load sounds and set m_soundCurrent m_soundFirst = getAudioClip( getDocumentBase( ), hi.au ); m_soundSecond

9、= getAudioClip( getDocumentBase( ), bark.au ); m_soundThird = getAudioClip( getDocumentBase( ), PINBALL.MID ); m_soundFourth = getAudioClip( getDocumentBase( ), BATTVLOW.WAV ); m_soundCurrent = m_soundFirst; 2005 趙小敏8public void stop( ) / Stop playing sound m_soundCurrent.stop( ); public void itemSt

10、ateChanged( ItemEvent e ) m_soundCurrent.stop( ); switch(m_comboChoose.getSelectedIndex( ) case 0:m_soundCurrent=m_soundFirst;break; case 1:m_soundCurrent=m_soundSecond;break; case 2:m_soundCurrent=m_soundThird;break; case 3:m_soundCurrent=m_soundFourth;break; default:m_soundCurrent=m_soundFirst;bre

11、ak; public void actionPerformed(ActionEvent e) if ( e.getSource( ) = m_buttonPlay ) m_soundCurrent.play( ); else if ( e.getSource( ) = m_buttonLoop ) m_soundCurrent.loop( ); else if ( e.getSource( ) = m_buttonStop ) m_soundCurrent.stop( ); / End of method: actionPerformed 2005 趙小敏9 二、圖像顯示Java支持兩種支持兩

12、種圖圖像格式像格式JPEG和和GIF。 。JPEG稱稱為聯(lián)為聯(lián)合合圖圖像像專專家家組組( (joint photographic experts group),),可用可用瀏覽瀏覽器打開。器打開。JPEG( (或或JPG) )圖圖像格式一般用來像格式一般用來顯顯示照片和具有示照片和具有連續(xù)連續(xù)色色調(diào)調(diào)的的圖圖像,它能保存像,它能保存圖圖像所有像所有顏顏色信息。色信息。JPEG是一種是一種壓壓縮縮的文件格式,在打開的文件格式,在打開時(shí)時(shí)自自動(dòng)動(dòng)解解壓縮壓縮。 。GIF稱稱為圖為圖像交像交換換格式(格式(graphic interchange format),),可用可用瀏覽瀏覽器打開。器打開。G

13、IF圖圖像是一種像是一種壓縮壓縮文件格式,由于它能最大限度地減少文件文件格式,由于它能最大限度地減少文件轉(zhuǎn)換時(shí)間轉(zhuǎn)換時(shí)間, ,所以在所以在HTML文件中常用于文件中常用于顯顯示插示插圖圖或或圖標(biāo)圖標(biāo)。 。GIF格式能有效減少文件大小,有利于在格式能有效減少文件大小,有利于在Internet上上使用,使用,Java支持支持這這種種圖圖像格式。像格式。 2005 趙小敏101、加加載圖載圖像像加加載圖載圖像一般放在初始化方法像一般放在初始化方法init中中進(jìn)進(jìn)行。程序中行。程序中的的getImage方法可加方法可加載載Java支持的支持的圖圖像文件,它像文件,它有兩個(gè)參數(shù),一個(gè)是有兩個(gè)參數(shù),一個(gè)是

14、圖圖像文件地址,一個(gè)是像文件地址,一個(gè)是圖圖像文像文件名稱。由于件名稱。由于Applet是面向網(wǎng)是面向網(wǎng)絡(luò)絡(luò)的,因此的,因此圖圖像文件像文件的存的存儲儲位置并不局限于本地位置并不局限于本地計(jì)計(jì)算機(jī)的磁算機(jī)的磁盤盤目目錄錄,大,大部分情況是直接部分情況是直接讀讀取取Web服服務(wù)務(wù)器上的器上的圖圖像文件。像文件。Java.applet.Applet的成的成員員getImage方法返回方法返回一個(gè)一個(gè)Image對對象,它的象,它的調(diào)調(diào)用格式用格式為為: : Image getImage(URL url) Image getImage(URL url, String name) 2005 趙小敏112

15、、顯顯示示圖圖像像顯顯示示圖圖像需要像需要調(diào)調(diào)用用Graphics類類的方法的方法drawImage, ,它可以將它可以將Image對對象關(guān)象關(guān)聯(lián)聯(lián)的的圖圖像像顯顯示在示在Applet的指定位置。的指定位置。drawImage方法的方法的調(diào)調(diào)用用格式如下:格式如下: boolean drawImage(Image img, int x, int y, ImageObserver observer) boolean drawImage(Image img, int x, int y, Color bgcolor, ImageObserver observer) 2005 趙小敏122、顯顯示示圖

16、圖像像其中其中imgimg就是要顯示的圖像、就是要顯示的圖像、x x和和y y是圖像顯示位置(是圖像顯示位置(x x和和y y可取負(fù)值,表示一部分圖像被移出了顯示區(qū))、可取負(fù)值,表示一部分圖像被移出了顯示區(qū))、bgcolorbgcolor是圖像顯示區(qū)域的背景色、是圖像顯示區(qū)域的背景色、observerobserver是圖像加是圖像加載跟蹤器,通常將該參數(shù)指定為載跟蹤器,通常將該參數(shù)指定為thisthis,即由即由AppletApplet負(fù)負(fù)責(zé)跟蹤圖像的加載情況。責(zé)跟蹤圖像的加載情況。這兩種方法都是將圖像照原樣顯示,能不能對圖像進(jìn)這兩種方法都是將圖像照原樣顯示,能不能對圖像進(jìn)行縮放呢?使用下面兩

17、種調(diào)用格式就可以對圖像進(jìn)行行縮放呢?使用下面兩種調(diào)用格式就可以對圖像進(jìn)行縮放顯示:縮放顯示: boolean drawImage(Image img, int x, int y, int width, int height, ImageObserver observer) boolean drawImage(Image img, int x, int y, int w, int h, Color c, ImageObserver observer) 2005 趙小敏13例2:顯示圖像import java.awt.*;import javax.swing.*;public class J_Im

18、age extends JApplet Image m_image = new Image2; public void init( ) m_image0= getImage(getCodeBase( ), ts1.gif); m_image1= getImage(getCodeBase( ), ts2.gif); / End of method: init public void paint(Graphics g) g.drawImage(m_image0, 0, 0, 150, 150, this); g.drawImage(m_image1, 150, 0, 150, 150, this)

19、; g.drawImage(m_image0, 0, 150, 300, 150, this); / End of method: paint / End of class: J_Image 2005 趙小敏14運(yùn)行結(jié)果 2005 趙小敏153、幻燈機(jī)效果、幻燈機(jī)效果如果如果Applet 僅僅僅僅是是顯顯示一幅示一幅圖圖像,沒有什么特像,沒有什么特別別的的意意義義,不如直接在,不如直接在HTML文件中文件中顯顯示示圖圖像。像。Applet應(yīng)應(yīng)該該做做HTML做不到的事情,例如像幻燈機(jī)那做不到的事情,例如像幻燈機(jī)那樣連續(xù)顯樣連續(xù)顯示示圖圖像。像。多幅多幅圖圖像的像的顯顯示,如下示,如下圖圖: :

20、 2005 趙小敏16例例3:多幅:多幅圖圖像的像的顯顯示示import java.awt.*;import java.awt.event.*;import java.applet.*;public class ShowDoggy extends Applet int index; Image imgs=new Image14; public void init() addMouseListener(new MouseAdapter() public void mouseClicked(MouseEvent e) index=+index%6; repaint(); ); for (int i

21、=0; i14; i+) imgsi=getImage(getCodeBase(),doggy/T+i+.gif); public void paint(Graphics g) if (imgsindex!=null) g.drawImage(imgsindex,20,20,this); 2005 趙小敏17三、圖形處理基本的圖形類:基本的圖形類:ColorColor類:包含控制顏色的方法和常量類:包含控制顏色的方法和常量FontFont類:包含控制字體的方法和常量類:包含控制字體的方法和常量PolygonPolygon類:包含創(chuàng)建多邊形的方法類:包含創(chuàng)建多邊形的方法GraphisGraphi

22、s類:包含了繪制字符串、線條、矩形及其它形狀的方法類:包含了繪制字符串、線條、矩形及其它形狀的方法RectangleRectangle類:用來繪制矩形類:用來繪制矩形java.awt.geom.CubicCurve2D.Double類:畫拋物線java.awt.geom.Arc2D.Double 類:畫圓弧java.awt.geom.Ellipse2D.Double 類:畫橢圓 2005 趙小敏18圖形環(huán)境和圖形對象圖形環(huán)境和圖形對象在在javajava中,圖形環(huán)境使得可以在屏幕上繪圖,中,圖形環(huán)境使得可以在屏幕上繪圖,對各種圖形的顯示通過類Graphics和Graphics2D來完成。Gra

23、phicsGraphics對象包含了繪圖方法,字體控制和顏色控制對象包含了繪圖方法,字體控制和顏色控制等等ComponentComponent類的類的paintpaint方法以一個(gè)方法以一個(gè)GraphicsGraphics對象作為參對象作為參數(shù),在數(shù),在ComponentComponent執(zhí)行執(zhí)行paintpaint操作時(shí),系統(tǒng)將操作時(shí),系統(tǒng)將GraphicsGraphics對象傳送給對象傳送給paintpaint方法。方法。 public void paintpublic void paint(Graphics gGraphics g) 2005 趙小敏19顏色控制顏色控制Java APIJ

24、ava API提供提供ColorColor類定義顏色的方法和常量。類定義顏色的方法和常量。每種顏色都是由紅、綠和籃三種顏色組成,稱為每種顏色都是由紅、綠和籃三種顏色組成,稱為RGBRGB值。一個(gè)值。一個(gè)RGBRGB值由三個(gè)部分,是值由三個(gè)部分,是0 0255255的整數(shù)的整數(shù)或或0.01.00.01.0的浮點(diǎn)數(shù)。的浮點(diǎn)數(shù)。RGBRGB值越大,相應(yīng)顏色的含值越大,相應(yīng)顏色的含量越大。量越大。例例4 4:使用幾種不同的顏色繪制填充矩形和字符串:使用幾種不同的顏色繪制填充矩形和字符串 2005 趙小敏20字體控制字體控制Java APIJava API提供提供FontFont類定義字體的方法和常量。

25、類定義字體的方法和常量。FontFont類的構(gòu)造函數(shù)有三個(gè)參數(shù):字體名稱、字體風(fēng)格和類的構(gòu)造函數(shù)有三個(gè)參數(shù):字體名稱、字體風(fēng)格和字體大小。字體大小。字體名稱可以是運(yùn)行程序的系統(tǒng)所支持的任何一種字體,字體名稱可以是運(yùn)行程序的系統(tǒng)所支持的任何一種字體,如如JavaJava字體字體Monospaced,SansSerifMonospaced,SansSerif和和SerifSerif字體風(fēng)格可以是字體風(fēng)格可以是Font.PLAIN,Font.ITALICFont.PLAIN,Font.ITALIC和和Font.BOLD,Font.BOLD,字體風(fēng)格可以組合使用,如字體風(fēng)格可以組合使用,如Font.I

26、TALICFont.ITALICFont.BOLDFont.BOLD字體大小是以點(diǎn)來衡量的,一個(gè)點(diǎn)是字體大小是以點(diǎn)來衡量的,一個(gè)點(diǎn)是1/211/21英寸英寸注意:制定一個(gè)系統(tǒng)不存在的字體是一種邏輯錯(cuò)誤。注意:制定一個(gè)系統(tǒng)不存在的字體是一種邏輯錯(cuò)誤。 2005 趙小敏21例例5 5:顯示:顯示4 4種不同大小、不同字體的文本種不同大小、不同字體的文本 public void paint( Graphics g ) g.setFont( new Font( Serif, Font.BOLD, 12 ) ); g.drawString( Serif 12 point bold., 20, 50 );

27、 g.setFont( new Font( Monospaced, Font.ITALIC, 24 ) ); g.drawString( Monospaced 24 point italic., 20, 70 ); g.setFont( new Font( SansSerif, Font.PLAIN, 14 ) ); g.drawString( SansSerif 14 point plain., 20, 90 ); g.setColor( Color.red ); g.setFont( new Font( Serif, Font.BOLD + Font.ITALIC, 18 ) ); g.d

28、rawString( g.getFont().getName() + + g.getFont().getSize() + point bold italic., 20, 110 ); 2005 趙小敏22畫線、矩形和橢圓畫線、矩形和橢圓例6:線、矩形、3D矩形、圓角矩形和橢圓的繪制。public void paint( Graphics g ) g.setColor( Color.red ); g.drawLine( 5, 30, 350, 30 ); g.setColor( Color.blue ); g.drawRect( 5, 40, 90, 55 ); g.fillRect( 100,

29、 40, 90, 55 ); g.setColor( Color.cyan ); g.fillRoundRect( 195, 40, 90, 55, 50, 50 ); g.drawRoundRect( 290, 40, 90, 55, 20, 20 ); g.setColor( Color.yellow ); g.draw3DRect( 5, 100, 90, 55, true ); g.fill3DRect( 100, 100, 90, 55, false ); g.setColor( Color.magenta ); g.drawOval( 195, 100, 90, 55 ); g.f

30、illOval( 290, 100, 90, 55 );1. 2005 趙小敏23畫圓弧弧形是橢圓的一部分,弧的角度以度來衡量。例7:演示drawArc和fillArc。 public void paint( Graphics g ) / start at 0 and sweep 360 degrees g.setColor( Color.yellow ); g.drawRect( 15, 35, 80, 80 ); g.setColor( Color.black ); g.drawArc( 15, 35, 80, 80, 0, 360 ); / start at 0 and sweep 11

31、0 degrees g.setColor( Color.yellow ); g.drawRect( 100, 35, 80, 80 ); g.setColor( Color.black ); g.drawArc( 100, 35, 80, 80, 0, 110 ); / start at 0 and sweep -270 degrees g.setColor( Color.yellow ); g.drawRect( 185, 35, 80, 80 ); g.setColor( Color.black ); g.drawArc( 185, 35, 80, 80, 0, -270 ); / sta

32、rt at 0 and sweep 360 degrees g.fillArc( 15, 120, 80, 40, 0, 360 ); / start at 270 and sweep -90 degrees g.fillArc( 100, 120, 80, 40, 270, -90 ); / start at 0 and sweep -270 degrees g.fillArc( 185, 120, 80, 40, 0, -270 ); 2005 趙小敏24例例8 8:畫多邊形和折線:畫多邊形和折線 public void paint( Graphics g ) int xValues =

33、20, 40, 50, 30, 20, 15 ; int yValues = 50, 50, 60, 80, 80, 60 ; Polygon poly1 = new Polygon( xValues, yValues, 6 ); g.drawPolygon( poly1 ); int xValues2 = 70, 90, 100, 80, 70, 35, 60 ; int yValues2 = 100, 100, 110, 110, 130, 110, 90 ; g.drawPolyline( xValues2, yValues2, 7 ); int xValues3 = 120, 140,

34、 150, 190 ; int yValues3 = 40, 70, 80, 60 ; g.fillPolygon( xValues3, yValues3, 4 ); Polygon poly2 = new Polygon(); poly2.addPoint( 165, 135 ); poly2.addPoint( 175, 150 ); poly2.addPoint( 270, 200 ); poly2.addPoint( 200, 220 ); poly2.addPoint( 130, 180 ); g.fillPolygon( poly2 ); 2005 趙小敏25結(jié)果顯示結(jié)果顯示(70

35、,100)(90,100)(100,110)(80,110)(70,130)(65,110)(60,90) 2005 趙小敏26Java2D APIJava2D API提供繪制復(fù)雜圖形的二維圖形功能類,具體在以下包中:java.awt.*java.awt.image.*java.awt.color.*java.awt.font.*java.awt.geom.*java.awt.print.*java.awt.image.renderable 2005 趙小敏27Java2D圖形java.awt.geom包中提供一些Java2D圖形功能的類,包括Ellipse2D.Double, Rectang

36、le2D.Double, RoundRectangle2D.Double,Arc2D.Double和Line2D.Double等。例9:演示幾種Java2D圖形和繪制的特性例10:繪制五角星 2005 趙小敏28四、動(dòng)畫處理游游戲軟戲軟件的件的設(shè)計(jì)設(shè)計(jì)中,中,動(dòng)動(dòng)畫向程序畫向程序員員提出了挑提出了挑戰(zhàn)戰(zhàn),但在,但在Java中中實(shí)現(xiàn)動(dòng)實(shí)現(xiàn)動(dòng)畫畫則則是十分是十分簡單簡單的事情。的事情。下面下面讓讓我我們們一起由淺入深地一起由淺入深地編編寫幾個(gè)寫幾個(gè)動(dòng)動(dòng)畫程序畫程序?qū)崒?shí)例,并例,并通通過對這過對這些些實(shí)實(shí)例的逐步改例的逐步改進(jìn)進(jìn)來探來探討討Java動(dòng)動(dòng)畫技畫技術(shù)術(shù)的關(guān)的關(guān)鍵鍵。 。 2005 趙小敏

37、291、 、動(dòng)動(dòng)畫原理畫原理計(jì)計(jì)算機(jī)算機(jī)動(dòng)動(dòng)畫原理十分畫原理十分簡單簡單,首先在屏幕上,首先在屏幕上顯顯示出示出第一第一幀幀畫面,畫面,過過一會兒把它擦掉,然后再一會兒把它擦掉,然后再顯顯示下一示下一幀幀畫面,如此循畫面,如此循環(huán)環(huán)往復(fù)。由于人眼存在著一個(gè)往復(fù)。由于人眼存在著一個(gè)視覺視覺差,所以感差,所以感覺覺好像畫面中的物體在不斷運(yùn)好像畫面中的物體在不斷運(yùn)動(dòng)動(dòng)。 。 2005 趙小敏30例11:宇宙飛船游太空宇宙飛船游太空import java.awt.*;import java.applet.*;public class MovingImg extends Applet Image sta

38、r, rocket; int x=0; public void init() star=getImage(getCodeBase(),starfield.gif); rocket=getImage(getCodeBase(),rocketship.gif); public void paint(Graphics g) g.drawImage(star,0,0,this); g.drawImage(rocket,x,15,this); try Thread.sleep(30); x+=5; if (x=400) x=0; Thread.sleep(600); catch (Interrupted

39、Exception e) repaint(); 2005 趙小敏31程序分析(1)這這是一個(gè)很是一個(gè)很簡單簡單的的動(dòng)動(dòng)畫,在畫,在Applet中有一個(gè)充當(dāng)太空的中有一個(gè)充當(dāng)太空的背景背景圖圖,一艘宇宙,一艘宇宙飛飛船在太空船在太空圖圖上不斷從左上不斷從左邊邊移移動(dòng)動(dòng)到右到右邊邊。 。程序中程序中創(chuàng)創(chuàng)建了兩個(gè)建了兩個(gè)Image對對象象star和和rocket, ,在在init方方法中分法中分別別加加載載了兩個(gè)了兩個(gè)圖圖像文件和像文件和這這兩個(gè)兩個(gè)對對象關(guān)象關(guān)聯(lián)聯(lián)起來。起來。添加了添加了變變量量x用來指定用來指定飛飛船的畫出位置,船的畫出位置,x初始化初始化為為10。 。在在paint方法中,注意

40、到太空方法中,注意到太空總總是畫在指定位置(是畫在指定位置(0, 0),),而而飛飛船船則則畫在位置(畫在位置(x, 15),),其中其中x的的值值是不斷是不斷變變化的?;摹?2005 趙小敏32程序分析(2)真正使真正使飛飛船船實(shí)現(xiàn)動(dòng)實(shí)現(xiàn)動(dòng)畫效果是在畫效果是在try.catch塊塊中。中。paint方法的最后一條方法的最后一條語語句是句是調(diào)調(diào)用用repaint方法。方法。repaint方方法的功能是重畫法的功能是重畫圖圖像,它先像,它先調(diào)調(diào)用用update方法將方法將顯顯示區(qū)清空,示區(qū)清空,再再調(diào)調(diào)用用paint方法畫出方法畫出圖圖像。像。這這就形成了一個(gè)循就形成了一個(gè)循環(huán)環(huán), ,pain

41、t調(diào)調(diào)用了用了repaint, ,而而repaint又又調(diào)調(diào)用了用了paint, ,使使飛飛船不船不間間斷地?cái)嗟貋砘匾苼砘匾苿?dòng)動(dòng)。 。運(yùn)行運(yùn)行這這個(gè)個(gè)Applet時(shí)時(shí),畫面有,畫面有閃爍現(xiàn)閃爍現(xiàn)象。一般來象。一般來說說,畫面越大,畫面越大,update以背景色清除以背景色清除顯顯示區(qū)所占用的示區(qū)所占用的時(shí)間時(shí)間就越就越長長,不可避,不可避免地會免地會產(chǎn)產(chǎn)生生閃爍閃爍。 。為為了達(dá)到平滑而又沒有了達(dá)到平滑而又沒有閃爍閃爍的的動(dòng)動(dòng)畫效果,畫效果,就就應(yīng)該應(yīng)該考考慮慮采取一些采取一些補(bǔ)補(bǔ)救措施。救措施。覆蓋覆蓋update方法可以降低方法可以降低閃爍閃爍,但不能消除它。能有效消,但不能消除它。能有效

42、消除除閃爍閃爍的方法是采用的方法是采用圖圖形雙形雙緩緩沖技沖技術(shù)術(shù)( (graphics double buffering)。)。 2005 趙小敏332、圖形雙緩沖技術(shù)、圖形雙緩沖技術(shù)import java.awt.*;import java.applet.*;public class MovingImg extends Applet Image star, rocket, buffer; Graphics gContext; int x=10; public void init() star=getImage(getCodeBase(),starfield.gif); rocket=get

43、Image(getCodeBase(),rocketship.gif); buffer=createImage(getWidth(),getHeight(); gContext=buffer.getGraphics(); public void paint(Graphics g) gContext.drawImage(star,0,0,this); gContext.drawImage(rocket,x,15,this); g.drawImage(buffer,0,0,this); try Thread.sleep(10); x+=2; if (x=400) x=10; Thread.slee

44、p(1000); catch (InterruptedException e) repaint(); public void update(Graphics g) paint(g); 例例12:改進(jìn)后的宇宙飛船游太空:改進(jìn)后的宇宙飛船游太空 2005 趙小敏343、用用線線程程實(shí)現(xiàn)動(dòng)實(shí)現(xiàn)動(dòng)畫畫例例12用用圖圖形雙形雙緩緩沖改善了沖改善了圖圖像像閃爍問題閃爍問題,但仍存在一,但仍存在一些其他些其他問題問題。例如用。例如用戶戶離開網(wǎng)離開網(wǎng)頁頁后,嵌入的后,嵌入的Applet會會繼繼續(xù)續(xù)運(yùn)行,占用運(yùn)行,占用CPU時(shí)間時(shí)間。下面的例。下面的例13出于網(wǎng)出于網(wǎng)絡(luò)實(shí)絡(luò)實(shí)用的目用的目的,采用獨(dú)立的,采用獨(dú)立線線程程實(shí)現(xiàn)動(dòng)實(shí)現(xiàn)動(dòng)畫。畫。 2005 趙小敏35import java.awt.*;import java.applet.*;public class Running extends Applet implements Runnable Image img=new Image14; Image buffer; Graphics gContext; Thread animate; int index=0; public void init() buffer=createIma

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論