freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

桌面彈球(java開(kāi)發(fā))分析及源碼(編輯修改稿)

2025-07-23 16:37 本頁(yè)面
 

【文章內(nèi)容簡(jiǎn)介】 new Timer( 100, task )。 //開(kāi)始timer ()。}//增加事件監(jiān)聽(tīng)器KeyListener[] klarr = ()。if( == 0 ) { //定義鍵盤(pán)監(jiān)聽(tīng)適配器 KeyListener keyAdapter = new KeyAdapter(){ public void keyPressed( KeyEvent ke ) { //改變擋板的坐標(biāo) ( ke )。 } }。 ( keyAdapter )。}首先,建立一個(gè)ActionListener對(duì)象做為T(mén)imer的task,這個(gè)task主要是處理游戲中各個(gè)組件位置的改變以及reapint畫(huà)板,這個(gè)task每100毫秒執(zhí)行一次,即每隔一百毫秒小球(或者其他組件)會(huì)執(zhí)行一次運(yùn)動(dòng)。如果此類(lèi)的屬性timer為空,就以ActionListern對(duì)象為參數(shù)去創(chuàng)建一個(gè)每100毫秒執(zhí)行一次的Timer,并用調(diào)用start()方法啟動(dòng)Timer,如果timer不為空,直接調(diào)用restart()方法啟動(dòng)timer。在這里我們需要明白的是,第一次進(jìn)行游戲時(shí),timer為null,就需要進(jìn)行創(chuàng)建,當(dāng)進(jìn)行第二次游戲的時(shí)候,timer非空,由于游戲停止(勝利或者失敗),因此需要調(diào)用restart方法重新啟動(dòng)。由于我們是在BallService控制游戲的,也就意味著進(jìn)行第二次游戲的時(shí)候,就需要再次調(diào)用BallFrame的initialize方法初始化游戲。接下來(lái)再增加事件監(jiān)聽(tīng)器,先使用JFrame的keyKeyListeners()方法獲取本窗口的KeyLister數(shù)組,如果這個(gè)數(shù)組的長(zhǎng)度為空,說(shuō)明本窗口并沒(méi)有添加到任何KeyListener,所以就創(chuàng)建一個(gè)KeyAdapter(為JFrame創(chuàng)建一個(gè)鍵盤(pán)監(jiān)聽(tīng)器)并重寫(xiě)KeyAdapter類(lèi)的void keyPressed(KeyEvent ke)方法,這個(gè)方法用來(lái)監(jiān)聽(tīng)鍵盤(pán)的按鍵是否有按下,如果有的話,就需要調(diào)用BallService的setStickPos方法。當(dāng)我們?nèi)?shí)現(xiàn)setStickPos方法的時(shí)候,就需要設(shè)置小球?yàn)檫\(yùn)動(dòng)狀態(tài),啟動(dòng)彈球游戲就意味著小球開(kāi)始進(jìn)行運(yùn)動(dòng)。當(dāng)我們?cè)谟螒蛑邪聪伦笥益I的時(shí)候,同時(shí)需要移動(dòng)擋板,啟動(dòng)游戲后,我們并不需要關(guān)心小球的移動(dòng),僅僅設(shè)置小球的運(yùn)動(dòng)狀態(tài),換言之,setStickPos方法只是處理?yè)醢宓囊苿?dòng),小球的運(yùn)動(dòng)讓BallService的run處理(run方法100毫秒執(zhí)行一次)。5 擋板、小球、磚塊、道具在這個(gè)設(shè)計(jì)中,擋板、小球、磚塊與磚塊中所包含的道具都有一個(gè)共同的父類(lèi)BallComponet,可以使用父類(lèi)的setX與setY方法設(shè)置坐標(biāo),也可以使用getX與getY方法獲取坐標(biāo),還可以使用getImage方法獲取圖片,并且父類(lèi)根據(jù)不同的情況提供了幾個(gè)不同的構(gòu)造器, 擋板(Stick類(lèi))此類(lèi)提供一個(gè)以畫(huà)板的寬、高和擋板的圖片路徑為參數(shù)的構(gòu)造器,見(jiàn)以下代碼。代碼清單:code\ball\src\org\crazyit\ball\public Stick( int panelWidth , int panelHeight, String path ) throws IOException { //調(diào)用父構(gòu)造器 super( panelWidth, panelHeight, path )。 //設(shè)置y坐標(biāo) ( panelHeight ().getHeight( null ) )。 //設(shè)置原本的長(zhǎng)度 = ().getWidth( null )。}首先調(diào)用父類(lèi)的BallComponent(int x, int y, String path)構(gòu)造器,把此對(duì)象的x坐標(biāo)設(shè)置到畫(huà)板中間的位置。接下來(lái)把y坐標(biāo)設(shè)置到畫(huà)板的底部,再根據(jù)讀取出來(lái)的圖片的寬度去設(shè)置Stick對(duì)象的初始長(zhǎng)度屬性。在從磁盤(pán)讀取圖片的過(guò)程是一個(gè)IO操作,所以會(huì)拋出IOException,見(jiàn)以下代碼。代碼清單:code\ball\src\org\crazyit\ball\public BallComponent( int panelWidth , int panelHeight, String path ) throws IOException { super()。 //讀取圖片 = ( new File( path ) )。 //設(shè)置x坐標(biāo) = (int)( ( panelWidth ( null ) ) / 2 )。}由于擋板的長(zhǎng)度可能會(huì)改變,所以Stick類(lèi)有的個(gè)int 類(lèi)型的preWidth屬性,代表?yè)醢宓拈L(zhǎng)度,并定義一個(gè)final int類(lèi)型的SPEED屬性,代表?yè)醢宓囊苿?dòng)速度,每次移動(dòng),x坐標(biāo)都會(huì)向左或者向右移動(dòng)SPEED個(gè)坐標(biāo)位置,需要為preWidth屬性提供setter與getter方法。實(shí)現(xiàn)了擋板類(lèi)后,我們可以實(shí)現(xiàn)BallService的draw方法,先將擋板“畫(huà)”到BallPanel中,并在BallPanel中調(diào)用BallService的draw方法,以下是BallService的draw方法的部分實(shí)現(xiàn)。代碼清單:code\ball\src\org\crazyit\ball\ // 如果贏了 if (isWon()) { // 繪制贏的圖片 ((), (), (), width, height 10, null)。 } else if (()) { // 繪制游戲結(jié)束圖像 ((), (), (), width, height 10, null)。 } else { // 清除原來(lái)的圖像 (0, 0, width, height)。 // 繪制擋板圖像 ((), (), (), stick .getPreWidth(), ().getHeight(null), null)。 }到此,我們可以運(yùn)行程序查看創(chuàng)建擋板后的效果。 創(chuàng)建擋板 小球(Ball類(lèi))此類(lèi)提供一個(gè)以畫(huà)板的寬、高、擋板高度與小球的圖片路徑為參數(shù)的構(gòu)造器,見(jiàn)以下代碼。代碼清單:code\ball\src\org\crazyit\ball\public Ball( int panelWidth , int panelHeight , int offset, String path ) throws IOException { //調(diào)用父構(gòu)造器 super( panelWidth, panelHeight, path )。 //設(shè)置y坐標(biāo) ( panelHeight ().getHeight( null ) offset )。}首先調(diào)用父類(lèi)的BallComponent(int x, int y, String path)構(gòu)造器,把此對(duì)象的x坐標(biāo)設(shè)置到畫(huà)板中間的位置。接下來(lái)把y坐標(biāo)設(shè)置到板位上面的位置。在這里,小球?qū)ο笥袃煞N狀態(tài),一種是小球是否開(kāi)始運(yùn)動(dòng),這種狀態(tài)下,如果小球沒(méi)有開(kāi)始運(yùn)動(dòng),代表準(zhǔn)備開(kāi)始游戲,反則代表游戲已經(jīng)開(kāi)始,沒(méi)游戲沒(méi)結(jié)束之前,小球就一直運(yùn)動(dòng);一個(gè)是小球是否結(jié)束運(yùn)動(dòng),如果小球結(jié)束運(yùn)動(dòng),代表游戲已經(jīng)結(jié)束,小球不能再運(yùn)動(dòng),擋板也不再受玩家的控制,反則代表正在游戲中。我們?cè)贐all中提供一個(gè)started的屬性來(lái)標(biāo)識(shí)這兩種狀態(tài)。那么當(dāng)游戲開(kāi)始時(shí),就可以直接設(shè)置Ball的started屬性為true。我們把小球的速度方向分為橫與豎兩個(gè)方向,所以這里用int類(lèi)型的speedX與speedY兩個(gè)屬性去代表小球的橫向方向與豎向方向,并增加相應(yīng)的setter與getter方法。為Ball對(duì)象添加了相關(guān)的屬性后,我們可以在BallService的draw方法中,將一個(gè)小球“畫(huà)”到BallPanel中。((), (), (), null)。 畫(huà)小球圖片 道具(Magic及其子類(lèi))Magic類(lèi)是一個(gè)抽像類(lèi),它是BallComponet的子類(lèi),又是LongMagic與ShortMagic的父類(lèi),此類(lèi)只有一個(gè)抽象方法magicDo,用來(lái)完成道具的功能,提供一個(gè)使用圖片路徑與x、y坐標(biāo)為參數(shù)的構(gòu)造器供其子類(lèi)繼承,見(jiàn)以下代碼。代碼清單:code\ball\src\org\crazyit\ball\public Magic( String path, int x , int y ) throws IOException { super( path, x, y )。} public abstract void magicDo( Stick stick )。這個(gè)構(gòu)造器只調(diào)用父類(lèi)BallComponent的構(gòu)造器,去設(shè)置道具的表現(xiàn)圖片與初始坐標(biāo)。加粗的一行代碼是用來(lái)完成道具功能的抽像方法,這里只有定義,沒(méi)有實(shí)現(xiàn),讓其子類(lèi)去實(shí)現(xiàn)。Magic類(lèi)有兩個(gè)子類(lèi):LongMagic與ShortMagic,這兩個(gè)道具的功能是使游戲中的擋板變長(zhǎng)和變短,功能都在magicDo的實(shí)現(xiàn)方法中實(shí)現(xiàn),首先看LongMagic類(lèi)實(shí)現(xiàn)的magicDo方法。代碼清單:code\ball\src\org\crazyit\ball\public void magicDo( Stick stick ) { double imageWidth = ().getWidth(null)。 //如果擋板沒(méi)有變長(zhǎng)過(guò) if( () = imageWidth ) { //將擋板的長(zhǎng)度改為雙倍 ( (int)(() * 2 ) )。 }}首先獲取擋板圖片的長(zhǎng)度,再拿這個(gè)長(zhǎng)度和擋板現(xiàn)在的長(zhǎng)度比較,如果擋板的長(zhǎng)度小于或者等于圖片的長(zhǎng)度,說(shuō)明擋板的長(zhǎng)度沒(méi)有增加過(guò),所以就調(diào)用Stick的setPreWidth方法把擋板的長(zhǎng)度設(shè)置為又倍,下面再看ShortMagic實(shí)現(xiàn)的magicDo方法。代碼清單:code\ball\src\org\crazyit\ball\public void magicDo( Stick stick ) { double imageWidth = ().getWidth(null)。 //如果擋板沒(méi)有變短過(guò) if( () = imageWidth ) { //將擋板的寬度改為一半 ( (int)(() * ) )。 }
點(diǎn)擊復(fù)制文檔內(nèi)容
范文總結(jié)相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖片鄂ICP備17016276號(hào)-1