Java坦克大战Summary
(由于作者本人水平有限,如有錯誤還請大家指出)
畫我方坦克 :JFrame是畫框,Panel是畫板,paint(Graphics g)是畫筆。
-
JFrame中設置的大小是包括畫板和窗口共同的大小
-
TankGame的構造器中初始化MyPanel,MyPanel的構造器中初始化Hero,一環扣一環
-
何時調用paint方法:
-
組件第一次在屏幕上顯示時程序自動調用
-
repaint方法被調用
-
窗口大小發生變化
按鍵控制我方坦克移動:Java 的事件控---委派時間模型
-
按鍵移動即改變方向加坐標改變
畫出敵人坦克:用Vector保存(多個,有各自生命周期)
按下J鍵 我方發射子彈:由于子彈有各自生命周期,每發射一顆子彈就是一個線程。shot類相當于線程數據源,由hero調用線程并發射,在MyPanel判斷是否要發射。
由于hreo可以發射子彈 故畫板上應畫出子彈動態射擊效果,所以應不停重繪面板---run方法可實現循環的效果---故把MyPanel做成一個線程---在TankGame的構造器中啟動。
-
run方法可實現循環的效果
-
線程的使用,一般也要注意該何時終止(這個項目中重繪卻不用終止)
敵方坦克也能發射子彈:給每個敵方坦克配備多顆子彈,用Vector保存。子彈和坦克共存亡,初始化敵方坦克時也初始化子彈,畫敵方坦克時也畫子彈。【可優化的是,就算坦克消亡,子彈仍可飛完剩下的路程】
我方子彈擊中敵方坦克時 敵方坦克和我方子彈消失,能做出爆炸效果更好:何為被擊中---我方子彈在敵方坦克區域內,由于這個方法會改變顯示的效果---把這個方法放在run方法中調用,判斷是否有被擊中的,則遍歷敵方坦克 一個一個判斷。
做出爆炸效果:爆炸效果即為三張圖片切換九次,定義Bomb類確定爆炸的位置 并用“生命值”控制圖片的切換以做出更好的爆炸效果。在坦克被擊中處設置一顆炸彈 放入炸彈集合,并在重繪面板時畫出來
-
為什么用Vector存放炸彈,而不是讓炸彈一顆一顆的存在---防止同時射中多個坦克,因為用炸彈集合就是 擊中一個坦克就放一顆炸彈到炸彈集合 然后畫的時候再依次取出畫
-
敵方坦克被擊中不僅要把生命值設為false,還要從坦克集合中移除,不然坦克還在那兒 只是沒畫出來
-
每變化一些功能,就要看畫出來的效果有什么變化,即paint方法中的變化
-
怎樣考慮將一個變量設置為全局還是局部:由于一個類中多個方法都要用到該變量 則設置為全局變量
敵方坦克自由移動:由于要能不停移動---做成線程,即Enemy繼承Runnable,并在run方法中讓坦克移動。在初始化敵方坦克時啟動線程
控制坦克移動范圍:在移動的時候 判斷下一步還能移動嗎,直接在Tank父類中根據移動方向的不同控制
我方坦克發射的子彈消亡后才能再發子彈:按下J鍵時判斷 有無子彈存在(第一次發射)、子彈是否銷毀
我方坦克最多同時發射規定顆子彈:由于是多顆故放在集合中,創建一顆就放在集合中,滿個數就不創建了,在按下J鍵時調用則無需判斷了因為方法本身就判斷了
-
由于有多顆子彈了,所以判斷是否擊中敵方坦克的方法要變,即要依次取出我方子彈了
-
一個方法的變化,要考慮其他地方是否也要變---牽一發而動全身
敵方發射的子彈消亡后才能再發射:由于敵方坦克配備的是子彈集合,而且是在Enemy的run中不停發射子彈,故而在發射時判斷Enemy子彈集合中子彈的個數是否為零(為零就說明子彈被銷毀了),為零就再創建一顆放入集合然后發射
敵方可同時發射規定顆:只需再上述判斷改為判斷子彈集合中子彈的個數是否少于規定 個數
敵方子彈擊中我方坦克,消失和爆炸效果:和擊中敵方坦克的判斷類似,取出敵方子彈,取出我方坦克,判斷是否在我方坦克區域
防止敵方坦克重疊:將敵人坦克從集合中依次取出,判斷是否在其他坦克范圍內,故要在Enemy中定義坦克集合,并且要把MyPanel中真正的enemies設置到Enemy類(即setEnemies方法)。判斷重疊與否,根據要判斷的坦克的方向分成四大類,再根據用來判斷的坦克分為八類。如果重疊了,則不能move~了
-
再MyPanel中把集合設置到Enemy類中,不然有越界的異常
記錄玩家總成績(擊中的敵方坦克總數),存盤退出:首先在MyPanel中添加一個畫出記錄總成績的區域,在paint中調用。創建類記錄成績,在擊中敵方坦克時增加成績;能存盤退出,IO流,關閉窗口時調用
-
記錄的路徑跟著工程走,就在src里創建文件
-
關閉窗口時調用,addWindowListener
記錄退出游戲時敵人坦克的坐標和方向,存盤退出:關閉窗口時調用的方法中再加上敵人坦克的坐標和方向即可
-
在Recorder中創建敵人坦克集合,仍像Enemy那樣處理
玩游戲時 可以選擇新開游戲還是繼續上一局:要能繼續上一局,則需從文件中讀取數據---將文件的數據恢復成Node結點集合,再根據結點恢復坦克(這些數據主要是初始化坦克時確定坐標和方向)。在游戲開始時能根據玩家選擇開始游戲,故而創建一個菜單
-
在Recorder中創建Node集合,存放數據,在初始化的時候就用這里面的數據,就可以恢復敵方坦克的狀態【這兒不能恢復我方坦克的狀態】
-
菜單寫在很多位置都可以,寫在TankGame的構造器,可能是因為 在選擇游戲模式后才會畫出面板,故而寫在TankGame挺好;加載面板等一系列操作寫在構造器而不是主方法,主要是體現封裝吧
-
"\r\n" 和 newLine() 都可換行
-
readLine 讀取一行內容(返回字符串),但是沒有換行,所以需要的話 要自己插入一個換行
-
字符串轉int:Integer.parseInt(String)、 Integer.valueOf(String)
valueOf(String)方法會返回Integer類的對象,而parseInt(String)方法返回原始的int值
-
字符串分成幾個數據:字符串分割成數組,再根據索引獲取
總結
以上是生活随笔為你收集整理的Java坦克大战Summary的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python制作奖状,从excel表格中
- 下一篇: Java实现坦克大战(源码全)