我的java學習日記(21、22)

Java學習第2122節 項目實訓之坦克大戰

 步驟簡述

1、在Eclipse中新建一個java項目,命名爲Game;並在該項目下創建一個專門放項目所需圖片的文件夾,命名爲images,然後把圖片放進該文件夾

2、在項目Game下創建遊戲窗體類GameFrame,建立窗體,並設置窗體參數,然後在類中創建面板,添加到窗體,並設爲主面板

3、在窗體類中創建JLaybel對象,把坦克對象四個方向的圖片傳進來,並設置其參數

4、添加一個鍵盤監聽事件,使得按下上下左右鍵的時候坦克可以上下左右移動,用if語句判斷,也可用swich方法,給相應方向鍵選擇相應方法的坦克圖片及座標

5、在坦克移動換方向的時候,每次都要new一個圖片對象,會導致導致反覆創建,影響性能。所以我們需要預先定義一個接口Data,在接口中定義好圖片對象,還有把主坦克定義也放這裏邊,即可在類裏邊直接引用,

6、爲了便於管理,所以要封裝一個Tank類,把坦克的一些基本屬性和一些方法全部封裝進去,同時刪去主窗體中原有的一些坦克相關定義,以免衝突

7、往程序中添加敵人坦克的信息,首先在存放數據的接口Data中定義敵人戰機需要的圖片對象和敵人坦克的定義,然後在Tank類中加入敵人坦克的信息,這個需要在有主坦克信息的地方加入if條件語句來實現兩種坦克同時定義,要實現多個敵人坦克同時運行,需要加入線程,所以需要新建一個實現這一功能的線程類,最後在遊戲主窗體類中創建一個敵人坦克數組,並在構造方法中初始化敵人坦克,啓動敵人坦克線程

8、爲遊戲窗體添加圍牆,並初始化。

9、藉助於intersects()方法,可以比較兩個組件的bound是否相交。使用隨機算法可以使敵人坦克隨進生成,但是卻會導致與圍牆或者其他坦克重疊。把敵人坦克隨機生成這一功能封裝到一個方法內,並將其改良

10、在坦克的run方法中添加坦克遇到圍牆、坦克遇到坦克等換方向的功能

11、爲了實現坦克運動的效果,把兩張不同運動狀態的圖片傳進去互相切換。首先要在Data.java中定義圖片資源,然後在坦克run方法中加入這一圖片轉換功能代碼

12、創建子彈類,繼承JLabel。首先要在Data類中創建兩方坦克的子彈圖片資源,然後創建一個子彈類,在類裏邊定義一個坦克對象,是的子彈的方向與發射坦克方向一致,然後定義子彈速度,子彈方向,一個布爾參數,標誌子彈是否可用,若是子彈擊中某東西,則該值設爲false,可視也設爲false不可見,然後定義構造方法,在構造方法中保存發射子彈的坦克、子彈發射的方向,然後設置子彈對象的圖片,最後計算子彈的座標,達到運動效果.在該類中定義一個發射方式,fire()方法,實現座標的移動

13、創建一個主坦克子彈發射的線程,然後在主窗體中加入子彈對象,並加入主面板。然後添加按下空格鍵發射子彈,需要在鍵盤監聽事件中,判斷按下空格鍵,創建子彈對象,並啓動子彈線程,如果子彈活着則循環調用子彈的發射方法,否則把子彈的可視設爲false,最後把該線程添加到主面板啓動

14、緊接着再創建一個敵人坦克自動發射子彈的線程,在該線程的run方法中,

創建一個自動發射機制,每隔一段時間發射一個子彈

15、爲了計算擊中敵人坦克的數量和遊戲是否結束,在遊戲窗體中添加一個計算敵人坦克數量的量hitCount,一個遊戲是否結束的標誌isGameOver,然後在子彈擊中敵人坦克的代碼後加上hitCount++;在每一個運行線程後加上isGameOver的判斷。

16、在子彈的fire()方法中,除了原來的改變座標外,加入是否擊中了物體的判斷。首先,如果子彈擊中圍牆,則子彈和圍牆均消失;其次,如果子彈超出邊界,則子彈失效;然後是如果敵人坦克子彈擊中主坦克,則主坦克銷燬遊戲結束;最後是如果主坦克子彈擊中敵人坦克,且該敵人坦克不是最後一輛,則子彈和敵人坦克均銷燬,如果是最後一輛坦克,則坦克和子彈失效,遊戲結束

17、在遊戲結束的地方加入彈出提示對話,添加方法如下圖,其次還需要定義一個數組存放“再來一局”和“退出遊戲”兩個字符串

18、對話框實現後,需要讓對話框上顯示的文字有動作,則需要在主窗體中添加一個初始化方法init(),將一些面板元素的初始化全部加入進去。

19、由於在開始“再來一局”的時候,存在上一局的部分子彈在遊戲結束時處於休眠狀態,而開始新的一局的時候醒來,會摻雜在新遊戲的子彈中,爲了避免這個bug需要在子彈的fire()方法中,對話框代碼的前邊加一個將所有敵人戰機和子彈全部設爲不可視和摧毀狀態

20、緊接着將上述JOptionPane.showOptionDialog()對象的值交給一個整形的result,然後判斷result的值,如果等於1,就說明要開始一局新的遊戲,此時,先將本局遊戲的面板清空,調用主窗體中的初始化方法init(),再重繪主窗體中的主面板,最後把布爾變量isGameOver設爲false。如果result的值等於1或者-1是,退出遊戲代碼爲System.exit(0);即退出遊戲

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章