JavaOO項目TankWar 項目總結

項目語言:Java

項目軟件:Eclipse

項目時間:6月6日——6月22日

項目內容:TankWar(類似坦克大戰1990的小遊戲)

項目過程:6日開始,由項目經理閆老師開始帶着我們寫,把基礎的 顯示界面、控制移動、碰撞監測、播放聲音等事件代碼,邊講解 邊寫並最後發送給了我們,然後讓我們自發的理解代碼,並接着 代碼去衍生的去寫其它功能,完善等。比如遊戲道具、使得地方 坦克種類變的更加豐富,自定義其他規則等。於22日結束該項目。

項目難點:

1.界面問題:整個遊戲界面是不斷更新的,所以需要啓動一個線程在後臺不斷的畫出新的界面,同時刪除舊的界面,一直不停的刷新。就需要用到Timer類,該類實例化需要兩個形式參數:int類型(例如:傳入50,就代表每50毫秒執行一次ActionListener監聽事件),ActionListener監聽事件(系統要執行的操作,例如:刷新界面)。其實刷新界面並不是在ActionListener監聽事件中完成,而是在Swing圖形界面中的Windows類下的print()方法,print()方法需要一個參數Graphics畫筆類,來畫圖形界面。而在ActionListener監聽事件中只需要調用repaint()方法實現調用paint()方法。

2.碰撞檢測:項目中有地形障礙物,不同類型的坦克,所以需要使用碰撞監測,判斷坦克是否發生碰撞,能否繼續移動。碰撞檢測原理是兩個物體是否有交集,所在的面積是否有重疊補分,有則爲發生了碰撞。在Java中,Rectangle矩形類中有一個intersects()方法是監測兩個矩形是否發生了碰撞,所幸的是我們並不需要去寫檢測碰撞,只需要實現Rectangle矩形類和調用Rectangle矩形類中的intersects()方法,就可以檢測兩個矩形物體是否發生了碰撞。

3.播放音頻:坦克的移動和發射子彈還有擊中物體都有與之對應的聲音,那麼怎麼播放聲音呢?在網上搜了一下,發現可以使用如下代碼播放音頻:


File file = new File(FilePath); // 獲取文件,傳入的參數爲String類型,文件的路徑
URL url = file.toURL(); //獲取文件的路徑
AudioClip ac = Applet.newAudioClip(url); // 因爲AudioClip是接口不能實例化,所有用Applet中的newAduioClip來實例化
ac.play(); //播放
 File file = new File(FilePath); // 獲取文件,傳入的參數爲String類型,文件的路徑
 URL url = file.toURL(); //獲取文件的路徑 
 AudioClip ac = Applet.newAudioClip(url); // 因爲AudioClip是接口不能實例化,所有用Applet中的newAduioClip來實例化
 ac.play(); //播放
 javazoomjlayer1.0.1

但是這樣,必須用設置一定的休眠時間來讓音頻播放,但是這樣會造成線程的停止,所以並不好,我嘗試把段代碼放入一個新new的線程中,但是好像並沒有什麼用。最後只能拋棄這種方法,使用老師給我們封裝好的聲音播放類。

4.出現坦克:戰場(界面)上的坦克數量是在一定的範圍內,每擊毀一輛敵方坦克,戰場上就會出現一輛新的坦克,直到達到關卡限制(每個關卡地方坦克數量是一定的)就不會再出現,然後擊爆敵方所有坦克進入下一關。那麼戰場上出現一輛新的坦克並不是在戰場上隨機出現(因爲如果這樣的話,敵方坦克出現在自己後方結果就太糟糕了。)所以我設定了四個出口提供地方坦克出現,每一次出現坦克就需要去檢測該出口是否被佔用,沒有的話就派出一輛新的敵方坦克,被佔用的話就需要去檢測下一個出口。如何檢測出口是被佔用就需要把場上所有可能出現在敵方坦克出口位置的物體拿去和出口位置做碰撞檢測,如果發生碰撞就判斷下一個出口,如果所有物體都沒有與該出口發生碰撞,那麼這個出口可以派出一個新的坦克了。

5.道具效果:該項目我設計了共六個道具,如下介紹:


每個道具都有不同的功能,其中較爲難點的是:時間、鐵鍬、金星(根據圖片形狀命名)。暫停就是在敵方坦克執行事件的時候加個判斷,如果滿足條件才執行地方坦克執行事件,反之跳過。鐵鍬需要找出BOSS的位置,並且在BOSS的周圍的創建鋼鐵牆,在一定時間後,刪除創建的鋼鐵牆(創建牆的時候加在集合裏面,世間到了只需要把集合清空就行了)。金星就需要去改數據,判斷拾到金星擊中鐵牆是擊毀,而不是子彈被鐵牆阻擋(添加一個boolean屬性),在檢測子彈碰撞其他的物體的時候判斷是否有金星效果(我設置的是int類型,持續一定的時間),有就實現金星的效果。其餘的道具就相對比較簡單了。

6.雙人遊戲:添加一個玩家,並不是添加一組按鍵那麼簡單,需要改的地方有很多,出現位置不同。不同的玩家重生的位置也是不同的。具有不同的屬性,要執行不同的操作,拾到道具自己對應的屬性也將改變。每次執行的時候也需要判斷是哪個玩家在執行什麼操作,這些都需要在適當的地方進行判斷,確保程序不會分辨錯誤玩家,造成系統bug。

7.封裝:我們要儘可能實現類的單一性,規定每個類都是單一的職責,類的行爲也儘可能通過實現接口來完成,實現低耦合、高類聚的特點。

項目總結:

這此項目爲期十三天(除去假期),其主要目的是回顧JavaOO所學的知識,回顧並鞏固,如何創建對象、實現接口、資源共享、引用傳遞、變量的應用等等,通過本次項目,我認識到了自己不足的地方,例如項目開始的設計分析沒做足,編寫代碼的時候思路、邏輯等還不夠清晰,導致編程的過程中,寫了之後又改,改了寫,寫了改這樣的情況反覆出現。編程的過場中也出現了較多的異常和bug。還有Scoket編程,對Scoket編程理解不夠,所以TankWar聯網並沒有做出來,只做了一個有很多bug的半成品。在學習完JavaOO之後,我對書本的知識也是一知半解,或許知道個大概,但是問個所以然,我就迷茫了,對理論基礎知識掌握的並不牢靠,問一個問題,換一種問法或許我就答不上來了,這也證明了我們課外的閱讀量太少,積累的也太少了。同樣的,本次項目我們也學到了些許東西:在編程的路上,或許會遇見bug和難點,但是我們靜下心,仔細思考,難點和bug終將會被解決的,實在不懂的,也可以虛心向他人請教,這也是學習的過場,每解決一個問題,都是一份收穫。出的錯誤越多,你收穫也就越多。編程需要一個冷靜的頭腦,不是遇到問題就說好難,不會等,當我們根據代碼一步一步的檢查、調試等,總會發現代碼的地方在哪,同時也說明了清晰的邏輯思維對編碼的重要性。

項目結語:項目雖然結束,但是學習並沒結束,通過項目了 解到了自己的不足,接下來就是彌補和以更高的熱情和嚴 謹的態度投入到學習新的知識中。


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