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