WarPlane
——項目設計文檔
一、項目簡介
“WarPlane”是Geekers團隊在本次軟體工程課程中所完成的團隊項目作業。根據團隊成立初期大家經過使用者調查與分析,最終決定設計出一款Android平台的手機遊戲,後經過了成員們對Android開發的學習,綜合自身能力,最後設計出了這款名為“WarPlane”的遊戲,該遊戲是一款豎版射擊類遊戲,具有操作簡便、遊戲體積小巧的優點,同時也有諸多的缺點,Geekers将在本設計文檔中對本次的項目進行全面的描述與解析。
“WarPlane”項目曆時一個月,經過了調研分析、設立目标、開發語言學習,以及最終完成項目的設計。這整個流程對于Geekers來說是一次非常重要的體驗,也是一次困難的試煉,因為我們團隊中的小夥伴們基本都是對Android開發零基礎,大家在短短的一個月内學習JAVA、Android,并最終及時地傳遞出了一款App,這對Geekers來說,确實得到了鍛煉和提升。
Coding位址:https://coding.net/u/kpy/p/WarPlane/git/tree/master/
二、系統架構
(1)運作環境
“WarPlane”是一款運作在Android系統中的遊戲App,基于Android4.0開發,可以運作在Android3.0以上版本的手機中。
(2)組織結構
“WarPlane”是一款手機遊戲App,是以需要的唯一硬體就是Android手機,對于手機的硬體配置要求也非常低,現在大家使用的Android3.0版本以上的手機都可以完美運作本遊戲。編寫本軟體使用到的工具是Eclipse中的ADT功能,雖然有Google官方的Android Studio,不過學習JAVA時已經對Eclipse的操作比較熟悉,是以就一直使用Eclipse來編寫。以下為系統架構圖。
三、系統結構
我們采用了思維導圖的方式來展現系統結構。
遊戲的設計分為四大子產品:遊戲界面、背景音樂、我方機關(玩家)、敵方機關。
遊戲界面包括:遊戲的主界面(菜單界面)、遊戲進行的界面、遊戲勝利界面、遊戲失敗界面,這些界面均由背景圖與按鈕組成,并且由監聽器來完成點選按鈕的功能。
背景音樂包括:不同場景會有不同的音樂作為背景。
敵方機關包括:本遊戲目前我們隻設計了兩個關卡,每一關都會有敵機、Boss,每個敵方機關都需要進行繪圖、參數設定。邏輯設定,其中繪圖需要繪制敵方機關的外形、子彈、被擊中的效果,Boss則加入了“放大招”的效果,在圖中顯示為“狂暴模式”。
我方機關包括:玩家隻有一人,從始至終隻需要繪制玩家操作的飛機、子彈、被擊中、血量,還有玩家的邏輯。
四、詳細設計
(1)開始界面子產品設計
開始界面是進入遊戲後的第一個界面,在代碼中用GameMenu類來繪制開始頁面和為按鈕加上相應的監聽器,同時GameMenu也用來實作遊戲勝利與遊戲失敗的界面。界面中有兩個按鍵,分别是Start與Quit,Start是進入遊戲界面的按鈕,Quit是退出遊戲的按鈕。
(2)勝利與失敗界面設計
勝利與失敗界面與主界面類似,都是用GameMenu類來實作,加載對應的圖檔與按鈕,在這兩個界面中加入了“Again”與“Quit”兩個按鈕,“Again”的功能是按下之後重新開始第一關的遊戲,“Quit”為退出遊戲。
(3)遊戲中界面與邏輯設計
本項目最關鍵的地方是遊戲内的設計,包括界面設計與邏輯設計。
遊戲中共有6類對象,分别是主角、敵機、Boss、子彈效果、爆炸效果、遊戲背景滾動效果。在代碼中我們用Player類來實作主角玩家、Enemy類來實作敵機、Boss類來實作Boss、Bullet類來實作子彈效果、Boom類來實作爆炸效果、GameBg來實作遊戲背景滾動效果。
Player類用來實作玩家,在該類中實作了繪制玩家圖形、設定生命值、判斷玩家被子彈或敵方機關擊中後的邏輯、玩家通過觸屏控制飛機移動的方法,我們還人性化的為每次玩家受到傷害會有短暫的無敵時間。
Enemy類實作敵機,本遊戲共有兩關,設定了3中敵機類型,分别是垂直方向運動的、水準向右、水準向左3個類型,敵機被玩家子彈擊中即會爆炸,是以在該類中沒有設定生命值,設定了敵機圖形繪制方法、不同類型的敵機飛行軌迹方法、敵機飛出螢幕顯示範圍自動死亡的方法、敵機被子彈擊中毀滅的方法。
Boss類來實作每一關的Boss,Boss擁有特殊技能,會在螢幕頂端下降到中間位置發射出8個方向的子彈。在該類中,我們設計了Boss的血量、Boss繪制、Boss移動方法、Boss開大招時所産生的移動與發射子彈的方法,以及Boss受到攻擊掉血的方法。
Bullet類用來繪制子彈效果,使用Switch-case語句來分别實作玩家、敵機、Boss的子彈模型繪制,以及寫入了子彈超出螢幕顯示範圍自動消失的優化方法。
Boom類用來繪制爆炸效果,使用canvas.clipRect和canvas.drawBitmap方法将效果圖中的多張圖檔連續播放以達到動畫效果。
GameBg類用來實作遊戲中背景滾動,原理是使用兩張一樣的圖檔交替播放,以達到不停滾動的效果。
在各個類都定義完成之後,建立MySurfaceView類來完成整個遊戲的實作過程。在MySurfaceView類中定義表示遊戲狀态的常量gamestate,使用switch-case語句來完成不同遊戲狀态下實作不同方法以達到遊戲效果。建立initGame()方法來初始化一切參數,建立myDraw()方法來繪制不同狀态下的圖形,建立onTouchEvent()方法來完成不同狀态下監聽觸摸螢幕的功能,建立logic()方法來完成整個遊戲的邏輯建立。是以MySurfaceView類是用來連接配接各個子產品的核心部分。
五、項目示範
在本環節中,将會簡單地介紹一下項目完成後實際操作的過程:
1.首先在手機上安裝“WarPlane.apk”安裝包。
2.安裝完成後将會在手機上看到已安裝的“WarPlane”的圖示,點選打開。
3.開始遊戲之後,來到主菜單,點選Start即可開始遊戲,點選Quit則退出遊戲,回到桌面。
4.遊戲操作非常簡單,玩家隻需要用手指觸摸螢幕來控制飛機移動就可以了。
Level 1 Level 1 Boss
Level 2 Level 2 Boss
5.若玩家在遊戲中因失血過多而失敗,會出現“Game Over”的畫面,玩家可自行選擇“Again”重新開始,或者“Quit”退出遊戲;通關後勝利的畫面也是如此。
遊戲失敗畫面 遊戲勝利畫面
六、項目總結
冬去春來,花開葉茂,緊張而忙碌的一個學期,在季節的輪回中伴着我們全校師生堅實的腳步走過了這一程。過去的一個月多裡,我們Geekers團隊完成了軟體工程課程布置的團隊程式設計作業,自己設計并制作的一個小軟體。而我們這次制作的是一個基于安卓的簡易的手機遊戲——飛機大戰。整個過程有讨論制作方向、學習eclipse、設計遊戲、内部測試、大衆測試等幾個階段。
1. 隊員讨論
我們隊共有6個隊員,其中有一名女生,五名男生。我們為了讨論項目友善,就找到了學校圖書館的研修室進行集體讨論,每次讨論隊員們都能到全,沒有一個人對這個團隊項目有任何懈怠的感覺。隊伍讨論項目的時候,男生比較容易說的開,女生就有一些腼腆,而之後,通過不斷的交流與協作,大家今後的交流也都放得開了。這是很重要的一步,隊伍内部的交流很重要,如果隊員之間連話都不敢說,那麼這個項目就沒有一點堅韌性,就會錯誤連連,也沒有綜合的思想,達不到與時俱進的要求。
總之,隊員在項目開始之前的溝通管道要疏通,這是很重要的一步。通過不斷的讨論,最後也決定了我們制作的方向,一個基于安卓的簡易的手機遊戲——飛機大戰。
2. 團隊分工
我們團隊的模式是劇院模式,這種模式的理想狀态就是大家分工合作,各司其職,沒有絕對的上司,也沒有打醬油的同學,就目前而言這是最符合我們團隊的模式,大家實力比較平均,同時也不希望有人掉隊,采用了這種模式可以幫助大家共同合作,共同進步,這也是我們喜歡也最适合我們的模式,是以在大家讨論過後,最終選擇了此模式。
我們在項目制作中做了如下分工:
① 陳一鳴負責java代碼腳本的錯誤檢查和後期組裝;
② 口平音,黃冠譯,樊西江負責代碼腳本的程式設計及測試;
③ 王敬一和張倩負責遊戲界面整理布局和遊戲内部道具的繪制。
每個人都各司其職,都有不同的任務,而且每個人的完成效果都很好,整體組裝也較為順利,雖然在制作過程中也存在過錯誤和争議的發生,但這也是通向成功必不可少的一步,隻有這樣我們才能更加完善自己,更加經得起考驗,使我們在今後無論遇到多大的困難都能從容應對。
3. 項目測試及總結
經過一個月的制作,我們的團隊終于完成了這個小遊戲α作品,我們内部自己在考慮到不同情況下進行了一些測試,也正如我們所想到的,出現了一些問題,有大有小。例如:
① 飛機爆炸,遊戲結束時點選再來一局,會繼續着目前的進度而不是重新開始新的一局;
② 子彈還沒有遇到敵機時,敵機就發生了爆炸;
③ 關卡最後的BOSS是無敵的,無法擊敗;
④ 這個遊戲中不同場景都不同的音效,而我們發現切換場景後,音效卻沒有了。而且再也不會出現。
也有很多其它的小錯誤,但這幾個是很嚴重的問題,我們也進行了修複:
① 這個問題是因為有一個變量記錄着目前遊戲時間的進度,而這個進度還是一個全局變量,是以他在下一次開始之前必須初始化清零;
② 這個問題的原因在于飛機的圖檔太大,使得子彈碰到飛機圖檔的下邊緣就使得飛機爆炸,是以需要我們的遊戲圖檔制作更加完善,這個問題也花掉了我們很多時間,因為PS的過程要求更加的精細;
③ BOSS無敵我們最初認為是血量不減,但是錯誤還是發生,是以我們通過觀察代碼發現了飛機的繪圖代碼是無限循環的,無論血量怎樣,是以應該是血量減到0後,停止繪圖;
④ 我們最初用的切換音效函數分别是是:音效調用——音效停止——音效調用,我們發現了還有一個函數是“音效暫停”,我們應該用“音效暫停”,即暫停音效而不是“音效停止”,永遠關閉音效。
我們也給我們的其它朋友玩了玩我們的遊戲,也有一些很小的問題發生,我們也都改正了,最終的β版本也完成了。
測試是程式設計的必不可缺少的一部分,他是通過不同的情況來測試程式的可用性,程式在剛制作完成時,肯定會有我們想不到的bug,通過測試才能讓軟體更加完善,更具可用性,也是測試,讓我們明白了代碼程式設計者,也就我們自身的一些不足之處。
4. 總結及感想
β版本的釋出也就意味着我們的軟體制作階段基本上完成了,因為我們覺得軟體的階段并不适合釋出,是以我們也沒有選擇釋出,而是讓自己的朋友去适用。雖然沒有釋出,但是整個過程是值得我們永遠銘記的。作為程式員,這是我們的第一個團隊項目,而且我們覺得自己對待這個項目的态度也是很積極的。在這個制作過程中,我們6個人就是一個大家庭,每個人每天都要不停地互相溝通交流方法和詢問制作程序。想要完成一個團隊項目,最重要的就是一個“團”字,團結是基礎。
這個過程為我們今後的工作生活打下了基礎,我相信我們的Geekers隊員們都不會忘記這一次團隊作業的曆程,感謝每一位參加這次項目制作的隊員們,最後感謝這一學習老師的對我們悉心教導!