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

正文內(nèi)容

桌面彈球(java開發(fā))分析及源碼(完整版)

2025-08-01 16:37上一頁面

下一頁面
  

【正文】 或者球的運(yùn)動(dòng)),我們放到BallService類中去處理。圖 小球的反彈2 流程描述玩家使用左右方向鍵開始游戲與控制擋板,在未消除完所有的障礙物或者擋板沒有檔住向下移動(dòng)的小球之前,會一直處于游戲狀態(tài),在這個(gè)狀態(tài)中,小球會一直處于直線運(yùn)動(dòng)或者改變方向,當(dāng)小球消除掉障礙物的時(shí)候,有機(jī)率產(chǎn)生一些物品,產(chǎn)生的物品會直線向下移動(dòng),用擋板接住物品后,物品的特殊效果會生效。玩家控制一個(gè)可以左右移動(dòng)的擋板去改變運(yùn)動(dòng)中小球的移動(dòng)方向,目的是用小球消除游戲屏幕中的所有障礙物到達(dá)下一關(guān),在障礙物被消除的過程中,可能會產(chǎn)生一些能改變擋板或者小球狀態(tài)的物品,例如:擋板變長、變短,小球威力加強(qiáng)等等。 小球反彈的方向在本章實(shí)現(xiàn)的過程中,我們會設(shè)置小球于對稱的方式,并出現(xiàn)少許偏移的方式反彈。道具類的子類有LongMagic與ShortMagic,作用是使Stick的長度變長或者變短。 q BallComponent( String path , int x , int y ),以x坐標(biāo),y坐標(biāo)和path去構(gòu)造一個(gè)BallComponet。q Magic getMagic(),獲取道具。當(dāng)然,這里只提供一個(gè)Stick的參數(shù)可能并不夠,如果以后游戲中出現(xiàn)另外一種道具,會改變球的速度(變快或者變慢),那么我們就需要為該抽象類提供更多的參數(shù)。除了定義這些屬性,還為這些屬性提供相應(yīng)的setter與getter在這里,小球?qū)ο罂梢詥渭兊目醋饕粋€(gè)簡單的對象,并不負(fù)責(zé)處理任何的行為,這可以看作我們一般所說的貧血模式,對象并不負(fù)責(zé)處理任何的業(yè)務(wù)邏輯。q void setMagicPos(),改變道具的坐標(biāo)位置。在例中BallService處理了大部分的游戲邏輯,當(dāng)然,我們也可將這些邏輯放到相關(guān)的類中(即前面提到的充血模式),例如道具的下落、擋板的移動(dòng)等。當(dāng)我們實(shí)現(xiàn)游戲的一些相關(guān)邏輯的時(shí)候(球的運(yùn)動(dòng)、道具的下落等),我們可以調(diào)用JPanel的repaint方法將JPanel進(jìn)行重繪。代碼清單:code\ball\src\org\crazyit\ball\//定義一個(gè)JPanel內(nèi)部類來完成畫圖功能public class BallPanel extends JPanel { /** * 重寫void paint( Graphics g )方法 * * param g Graphics * return void */ public void paint( Graphics g ) { //可以調(diào)用BallService的draw方法進(jìn)行繪制 }}而獲取這個(gè)BallPanel實(shí)現(xiàn)是在BallPanel getBallPanel方法中,此類保證這個(gè)Panel是單態(tài)的,每次只有一個(gè)BallPanle對象,見以下代碼。在我們平時(shí)開發(fā)的過程中,會遇到一些不需要多次創(chuàng)建的對象,例如JDBC的Connection對象,那么我們就可以利用單態(tài)模式來創(chuàng)建這些對象。} else { //新建一個(gè)timer timer = new Timer( 100, task )。在這里我們需要明白的是,第一次進(jìn)行游戲時(shí),timer為null,就需要進(jìn)行創(chuàng)建,當(dāng)進(jìn)行第二次游戲的時(shí)候,timer非空,由于游戲停止(勝利或者失?。?,因此需要調(diào)用restart方法重新啟動(dòng)。 //設(shè)置原本的長度 = ().getWidth( null )。實(shí)現(xiàn)了擋板類后,我們可以實(shí)現(xiàn)BallService的draw方法,先將擋板“畫”到BallPanel中,并在BallPanel中調(diào)用BallService的draw方法,以下是BallService的draw方法的部分實(shí)現(xiàn)。 //設(shè)置y坐標(biāo) ( panelHeight ().getHeight( null ) offset )。((), (), (), null)。 //如果擋板沒有變長過 if( () = imageWidth ) { //將擋板的長度改為雙倍 ( (int)(() * 2 ) )。 } else if( type == ) { = new ShortMagic( img/, x, y )。 創(chuàng)建與設(shè)置磚塊在本游戲的設(shè)計(jì)中,為了簡單起見,沒有加入游戲關(guān)卡的概念,沒有去設(shè)置每一關(guān)的磚塊與道具等東西的分布,所以,游戲開始的時(shí)候,我們會用一個(gè)方法名為createBrickArr的方法去隨機(jī)產(chǎn)生磚塊與道具,先看以下代碼。 i xSize 。 } Brick brick = new Brick( path, random, x, y )。首先,以xSize與ySize去創(chuàng)建一個(gè)Brick[][]類型的變量,接下來遍歷這個(gè)數(shù)組,在遍歷的過程中,每次先創(chuàng)建一個(gè)磚塊,然后隨機(jī)設(shè)置磚塊對象的disable屬性,disable屬性為true的磚塊將不會被顯示,創(chuàng)建磚塊的過程中,也是隨機(jī)創(chuàng)建磚塊所包含的道具,然后再設(shè)置這個(gè)磚塊的x與y坐標(biāo),最后把新創(chuàng)建的磚塊對象賦給bricks[i][j]。 j++) { BallComponent magic = bricks[i][j].getMagic()。代碼清單:code\ball\src\org\crazyit\ball\public void setStickPos( KeyEvent ke ) { //把彈球的運(yùn)動(dòng)狀態(tài)設(shè)為true ( true )。如果玩家按下的是F2鍵(這里定義F2鍵是重新開始游戲),就調(diào)用BallFrame對象的initialize方法是重新初始化界面。 //兩個(gè)坐標(biāo)點(diǎn)的距離 double distance = ( ( ballX brickX, 2 ) + ( ballY brickY, 2 ))。道具的移動(dòng)、道具與擋板的碰撞我們將在下面的章節(jié)中描述。 () () + () amp。前面的章節(jié)中講到這個(gè)游戲有兩個(gè)道具,LongMagic與ShortMagic,作用分別是使擋板就長或者變短,而道具是保存在Brick對象中,所以我們需要遍歷bricks數(shù)組中的所有Brick對象,如果Brick對象的狀態(tài)是disable為true(也就是說磚塊被小球消掉),而且這個(gè)Brick對象中有Magic對象不為null,并且Magic對象的y坐標(biāo)小于小于畫板的高度height(這里意思是說這個(gè)道具還在畫板的范圍之內(nèi)),那么,()個(gè)y坐標(biāo)值,達(dá)到道具向下移動(dòng)的效果,見如下代碼。 () height ) { //設(shè)置magic的y坐標(biāo)向下增加 ( () + () )。 判斷是否已經(jīng)通關(guān)在本游戲中,是否通關(guān)的標(biāo)準(zhǔn)是,小球是否已經(jīng)將所有的磚塊清除。}實(shí)現(xiàn)了isWon方法后,我們可以啟動(dòng)游戲進(jìn)行測試,由于我們在前面章節(jié)實(shí)現(xiàn)draw方法的時(shí)候,就需要調(diào)用isWon方法來判斷游戲是否勝利,如果勝利的話,就需要將游戲勝利的圖片“畫“到BallPanel中,當(dāng)游戲勝利時(shí)。 道具由于我們的道具使用了一個(gè)Magic抽像類作為接口,增加新的道具也比較簡單,例如我現(xiàn)在要增加一個(gè)一次能把所有磚塊清掉的道具,那么,我可以新建一個(gè)叫KillAllMagic的類,繼承Magic類,并實(shí)現(xiàn)里面的doMagic方法,見以下代碼:public void magicDo( Stick stick ) { for ( int i = 0 。本章主要詳細(xì)描述了鍵盤事件監(jiān)聽器、在Swing組件中畫圖等相關(guān)知識點(diǎn)。 i++ ) { for ( int j = 0 。我們這個(gè)桌面彈球并沒有任何復(fù)雜的功能,只是在小球運(yùn)動(dòng)的過程中將磚塊消除并轉(zhuǎn)化成相應(yīng)的道具,最后判斷游戲是否已經(jīng)勝利,我們可以在此基礎(chǔ)上開發(fā)出更多有趣的功能,例如加入分?jǐn)?shù)的計(jì)算、加入多種道具等。代碼清單:code\ball\src\org\crazyit\ball\public boolean isWon() { //如果消了全部磚塊,則為贏 for ( int i = 0 。 } } } }}以上的代碼實(shí)現(xiàn)了setMagicPos方法,該方法每執(zhí)行一次,都會改變道具的位置,因此,我們可以在BallService的run方法調(diào)用setMagicPos方法(run方法每100毫秒執(zhí)行一次),如果磚塊被消除的話,界面中就會出現(xiàn)下落的道具。 i 。 () + (null) () ) { return true。isHitStick方法只要判斷是否發(fā)生了碰撞,至于發(fā)生碰撞后所需要處理的事情,并不由該方法進(jìn)行處理。 if( distance ( ().getWidth(null) + ().getWidth(null) )/ 2) { //使brick無效 ( true )。 小球與磚塊碰撞圖 小球與磚塊碰撞在游戲中,如果運(yùn)行的小球碰到磚塊,就要把磚塊消掉,所以我們需要判斷小球與磚塊是否有碰撞,假設(shè)小球圓心的坐標(biāo)是(x1,y1),磚塊中間的坐標(biāo)是(x2,y2),磚塊的一半邊長是n,小球的半徑是r,那么,如果(x1,y1)與(x2,y2)的距離小于n+r,磚塊與小球就處于碰撞的狀態(tài)。 } } //如果是右方向鍵 if( () == ) { if( () + width () ) { //x坐標(biāo)向右移動(dòng) ( () + )。 } else if (magic != null amp。這樣就完成創(chuàng)建游戲中所有磚塊與道具的過程。 //設(shè)置x坐標(biāo) ( x )。 j ySize 。 int x = 0。 ( y )。代碼清單:code\ball\src\org\crazyit\ball\public void magicDo( Stick stick ) { double imageWidth = ().getWidth(null)。代碼清單:code\ball\src\org\crazyit\ball\public Magic( String path, int x , int y ) throws IOException { super( path, x, y )。接下來把y坐標(biāo)設(shè)置到板位
點(diǎn)擊復(fù)制文檔內(nèi)容
范文總結(jié)相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1