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

正文內(nèi)容

桌面彈球(java開發(fā))分析及源碼-文庫吧

2025-06-11 16:37 本頁面


【正文】 度與縱向速度(圖片、位置與大小在父類中體現(xiàn)),如果需要改變小球的速度,可以調(diào)用相關(guān)的setter方法來進行,但是我們需要知道由哪些對象來改變小球的相關(guān)屬性,我們在前面的章節(jié)中提到,提供一個業(yè)務(wù)類進負(fù)責(zé)處理游戲的相關(guān)邏輯,因此,業(yè)務(wù)類就需要維護一個小球的對象,來控制小球的運動或者其他行為。在這里,小球?qū)ο罂梢詥渭兊目醋饕粋€簡單的對象,并不負(fù)責(zé)處理任何的行為,這可以看作我們一般所說的貧血模式,對象并不負(fù)責(zé)處理任何的業(yè)務(wù)邏輯。如果需要將該小球?qū)ο缶帉懗蔀槌溲J?,可以為小球?qū)ο筇峁┮恍┡c之相關(guān)的行為,例如小球會運動,我們可以為Ball類加入一個run的方法,表示球的運動,例如小球會停止運動(在游戲結(jié)束或者開始時),我們就可以為Ball類添加一個stopRun的方法,總之,如果需要做到充血模式,可以將所有與小球相關(guān)的方法加入到Ball中。 業(yè)務(wù)處理類(BallService)BallService 處理了這個游戲中的大部分業(yè)務(wù)功能,包括開始游戲、小球移動、道具移動、擋板移動、測試小球與擋板是否有碰撞或者擋板和其它元素有碰撞、設(shè)置擋板的長度、判斷用戶是否通關(guān)、初始化磚塊的排列與道具、畫圖等功能。這些功能的實現(xiàn)都有對應(yīng)的方法,如下: q void run(),小球進行運動。q void setStickPos( KeyEvent ke ),改變擋板的坐標(biāo)位置。q setBallPos(),改變小球的坐標(biāo)位置。q boolean isHitBrick( Brick brick ),測試小球與磚塊是否有碰撞,參數(shù)brikc是指磚塊。q isHitStick( BallComponent image ),測試某元素與擋板是否有碰撞。q void setMagicPos(),改變道具的坐標(biāo)位置。q void setStickWidth( Magic magic ),根據(jù)道具(magic)的類型去設(shè)置改變擋板的長度。q boolean isWon(),判斷玩家是否已經(jīng)過關(guān)。q Brick[][] createBrickArr( String path, int xSize, int ySize ),創(chuàng)建磚塊,返回一個Brick類型的數(shù)組,參數(shù)path是指磚塊的圖片,xSize與ySize是數(shù)組的長度。q void draw( Graphics g ),畫圖,方法中是使用Graphics對象g去畫圖。當(dāng)游戲開始時,程序中需要不停的調(diào)用run方法,讓小球進行運動,當(dāng)然,小球進行運動的前提是Ball的isStarted方法返回true,即游戲已經(jīng)開始,run方法的主要功能就是調(diào)小球的位置。我們需要在游戲中通過上、下、左、右的鍵來控制擋板的位置,因此就需要提供一個setStickPos的方法來改變擋板的位置。在本章的程序中,BallService處理所有的相關(guān)邏輯,例如判斷小球在運動的過程中是否越界、游戲是否勝利等。在例中BallService處理了大部分的游戲邏輯,當(dāng)然,我們也可將這些邏輯放到相關(guān)的類中(即前面提到的充血模式),例如道具的下落、擋板的移動等。 主界面類(BallFrame)BallFrame是創(chuàng)建一個JFrame主界面,設(shè)置主界面的標(biāo)題、長與寬、畫板等屬性,并且為增加鍵盤事件監(jiān)聽器以及創(chuàng)立一個Timer每隔一小段時間去刷新畫板,主要有初始化界面與或者畫板兩個方法,如下: q void initialize() throws IOException,此方法拋出IO異常,初始化界面。q BallPanel getBallPanel(),獲取一個BallPanel類型的JPanel去充當(dāng)畫板,BallPanel是這個類中的一個內(nèi)部類。我們使用了BallService類來處理大部分的游戲邏輯,主界面類中幾乎不包括任何的邏輯處理,該類維護一個BallService的對象,得到界面中相關(guān)對象的信息后,可以調(diào)用BallService中的方法進行處理,并根據(jù)返回的信息來改變界面。例如小球的運動,我們可以調(diào)用BallService的run方法,再調(diào)用BallSerivce的draw方法將小球的圖片“畫”到界面中。到此,本章中所有的對象都已經(jīng)創(chuàng)建并確定了它們的行為,在建立道具類(Magic)的時候,我們將一個道具抽象為一個Magic對象,該類可以有多個實現(xiàn),在使用Magic對象的時候,我們可以利用面向?qū)ο蟮亩鄳B(tài)特性,使用Magic的magicDo方法來進行“道具的使用”,在這個過程中,我們并不需要去關(guān)心道具具體的實現(xiàn)。在創(chuàng)建游戲各個對象的過程中,我們將處理邏輯的方法放置到一個業(yè)務(wù)類中,從一定程度上講,減少了代碼之間的耦合,并遵循了單一職責(zé)的原則。4 主界面實現(xiàn)在這個桌面彈球游戲中,游戲中的所有元素都是用Graphics對象畫出來的,所以,我們的主界面應(yīng)該是一個只設(shè)置了窗口標(biāo)題還有顏色等基本屬性的JFrame,在這個JFrame中,我們只需要提供一個JPanel對象即可,因為游戲的界面并沒有多復(fù)雜的布局與界面交互。當(dāng)我們實現(xiàn)游戲的一些相關(guān)邏輯的時候(球的運動、道具的下落等),我們可以調(diào)用JPanel的repaint方法將JPanel進行重繪。 初始化界面(initialize()方法)首先,設(shè)置JFrame窗口的標(biāo)題、背景顏色與是否可以改變大小,然后獲取JPanel對象,最后把JPanel畫板加到JFrame中,見以下代碼。代碼清單:code\ball\src\org\crazyit\ball\public void initialize() throws IOException { //設(shè)置窗口的標(biāo)題 (彈球)。 //設(shè)置為不可改變大小 ( false )。 //設(shè)置背景為黑色 ( )。 //獲取畫板 ballPanel = getBallPanel()。 //把畫板加到JFrame ( ballPanel )。}看加粗的一行代碼ballPanel = getBallPanel()是調(diào)用本類中的getBallPanel()方法去獲取一個BallPanle對象,BallPanel是本類的一個內(nèi)部類,并且繼承JPanel,見以下代碼。代碼清單:code\ball\src\org\crazyit\ball\//定義一個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方法進行繪制 }}而獲取這個BallPanel實現(xiàn)是在BallPanel getBallPanel方法中,此類保證這個Panel是單態(tài)的,每次只有一個BallPanle對象,見以下代碼。代碼清單:code\ball\src\org\crazyit\ball\public BallPanel getBallPanel() { if ( ballPanel == null ) { //新建一個畫板 ballPanel = new BallPanel()。 //設(shè)置畫板的大小 ( new Dimension( BALLPANEL_WIDTH, BALLPANEL_HEIGHT ) )。 } return ballPanel。}在這里需要注意的是,我們需要在BallFrame中維護一個BallPanel的對象,然后通過getBallPanel的方法來獲得BallPanel的實例,由于BallPanel并不需要每次去創(chuàng)建,所以我們可以將BallPane變成單態(tài)的。在眾多的設(shè)計模式中,有一種叫做單態(tài)模式。如果遇到一些對象并不需要多次創(chuàng)建或者創(chuàng)建這些對象將會嚴(yán)重消耗系統(tǒng)資源,那么我們可以考慮將該對象寫成單態(tài)的。 單態(tài)模式簡介單態(tài)模式也可以叫單例模式,該模式保證一個類有且僅有一個實例,并為外界提供一個訪問,讓外界可以通過這個訪問點來訪問該類的唯一實例。在我們平時開發(fā)的過程中,會遇到一些不需要多次創(chuàng)建的對象,例如JDBC的Connection對象,那么我們就可以利用單態(tài)模式來創(chuàng)建這些對象。例如單態(tài)模式,系統(tǒng)可以不必多次創(chuàng)建該對象的實例,外界使用的時候可以使用同一個實例,因此在一定程序上減低了系統(tǒng)在創(chuàng)建對象時的開銷。為一個類實現(xiàn)單態(tài)模式,需要為該類提供一個私有的構(gòu)造器,再提供一個可以獲取該類實現(xiàn)的方法(為外界提供唯一的訪問點),私有構(gòu)造器是為了不讓外界去使用new關(guān)鍵字來創(chuàng)建該類的實現(xiàn),如果外鍵可以使用new關(guān)鍵字來創(chuàng)建該類的實例,那么就意味著該類將不會是單態(tài),有可能外界多次通過new關(guān)鍵字來創(chuàng)建,這就無法保證該對象的實例的唯一性。 運行效果編寫了BallFrame的初始化代碼后,我們可以運行具體查看相關(guān)的游戲效果。編寫創(chuàng)建BallFrame的代碼: BallFrame ballFrame = new BallFrame()。 ()。 (true)。 ()。 初始化游戲時的界面注:我們當(dāng)前并沒有對BallService中的draw方法作任何的實現(xiàn),我們實現(xiàn)了BallService的draw方法后。 監(jiān)聽器與Timer,類似于Window系統(tǒng)的計劃任務(wù)或者Linux系統(tǒng)的crobtab,并用start()方法去啟用Timer。在這個彈球游戲中,我們只有鍵盤操作,所以只監(jiān)聽鍵盤的操作,用一個KeyListener去監(jiān)聽鍵盤的動作,請看以下代碼。代碼清單:code\ball\src\org\crazyit\ball\//ActionListener task = new ActionListener(){ public void actionPerformed( ActionEvent e ) { //開始改變位置 ()。 //刷新畫板 ()。 }}。//如果timer不為空,調(diào)用timer的restart方法if( timer != null ) { //重新開始timer ()。} else { //新建一個timer timer =
點擊復(fù)制文檔內(nèi)容
范文總結(jié)相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1