李湘一



摘 要:本文通過分析實際運行效果,闡述了捕魚達人游戲開發的體系結構,確定了游戲開發中需要創建哪些類,如何創建這些類。并對各實體類實現的功能進行了具體的描述。用線程實現了魚的游行,子彈的發射。最后給出了三種關鍵算法的描述,大炮旋轉角度的計算、子彈的運行軌跡的計算、判斷子彈是否擊中魚的算法描述。
關鍵詞: Android;捕魚達人;算法
中圖分類號:TP391 文獻標識號:A 文章編號:2095-2163(2015)06-
Abstract: Through the analysis of the actual operating results, this paper expounds the system structure of the game development of fishing up game, and determines what kind of game development need to create, and how to create these classes. After that, the function of each entity class is described in detail. The paper also uses threads to achieve the fish's parade, bullets fired. Three key algorithms are described,which respectively are the calculation of the rotation angle of the barrel, the calculation of the trajectory of the bullet, and judging whether the bullet hit the fish.
Keywords: Android; Fishing Talent; Algorithm
0引 言
近幾年來,Android憑借其開放性和靈活性成為時下熱門的移動終端操作系統之一。在Android平臺上進行游戲的開發,即已成為一個揮灑才智并極具魅力潛質的創意領域[1]。其中,手機游戲是Android平臺上眾多類型應用程序的一種,覆蓋面積大,傳播速度快。本文選取大眾較為熟知的捕魚達人游戲來進行詳細闡述該游戲開發的思路和具體步驟。
1捕魚達人游戲開發的體系結構
首先在eclipse中新建一個android項目名稱為fish,在src文件夾下新建com.tarena.fish包,捕魚達人游戲中用到的圖片素材全部拷貝到drawable目錄中。游戲最終顯示效果如圖1所示。
該游戲開發的體系結構如圖2所示。
2各實體類的功能實現描述
該游戲中有多條魚在池塘中游動,大炮將發射子彈進行擊中魚的作用過程,同時一并顯示擊中魚所得的分數。分析該游戲運行效果,則需要研發如下幾種主要實體類:
池塘類Pool、魚類Fish、大炮類Barrel、子彈類Bullet。
相對應地,研究中即在src文件夾下創建以上實體類Pool.java、Fish.java、Barrel.java、Bullet.java。其后,則給出各類重點實體的功能實現描述與闡析。
(1) Fish類實現的功能
確定魚的大小、魚的位置、魚的步伐、魚的十個動作,在魚的構造方法中,通過Random()函數來隨機產生魚每次游出的位置。魚類繼承了Thread類,如果魚被子彈擊中,讓魚重新游進來。如果魚重新游進來,魚的位置和步伐都隨之發生了改變;如果魚沒有被子彈擊中,就直線向前游,并在游的過程中通過循環語句依次完成自身的十個動作。十個動作完成后又將重新開始循環。如果魚已經游出了池塘,則讓魚再重新游進來。
(2) Barrel類實現的功能
確定Barrel的位置,Barrel的大小,在Barrel的構造方法中初始化這些參數值。
(3)Bullet類實現的功能
定義子彈的坐標、大小、子彈的角度、子彈的出發點,子彈運行軌跡的橫縱坐標,子彈是否存活(true表示子彈正常移動,false表示子彈已經擊中fish)。具體地,move()方法實現子彈移動的行為,hint()方法實現子彈擊中魚的方法。
(4)Pool類實現的功能
在Pool類中分別定義上述對象,并定義彈夾,用來存放子彈,定義捕魚的條數,創建fishes數組用來存放11條魚,使用循環向fishes數組中放入11條魚,并啟動魚的線程。
在onDraw()方法中將背景bg、所有的魚、大炮、積分板、子彈都畫出來。在onTouchEvent()方法中,鼠標彈起時,創建子彈,計算子彈的橫縱坐標,并使子彈的中心點和大炮的中心點一致。將子彈放入彈夾中,啟動子彈線程。
(5)MainActivity類實現的功能
在該類中創建一個池塘Pool對象,設置顯示的布局窗口,創建開始刷新界面的線程,定義一個內部類,通過調用onDraw()方法以實現不停地刷新Pool池塘中的內容變化。
3捕魚達人關鍵算法設計
3.1大炮旋轉角度的算法描述
大炮旋轉角度如圖3所示。
從圖3中,大炮中心點的坐標為(x,y),大炮左上角點的坐標為(barrel.x,barrel.y),鼠標點擊屏幕點的坐標為(mouseX,mouseY)。
大炮中心點的坐標計算如下:
int x=barrel.x+barrel.width/2;
int y=barrel.y+barrel.height/2;
其中,barrel.width和barrel.height分別表示大炮的寬度和高度。
double xx=(double)mouseY-y;//計算出的結果為負數
double yy=(double)mouseX-X;
用反余切來求出大炮的旋轉角度,f就是最后的角度。
f=Math.round(Math.toDegrees(-Math.atan(yy/xx)));
3.2子彈移動軌跡的算法描述
子彈運行軌跡如圖4所示。
圖4中,圓心坐標為(a,b),圓上任意一點的橫坐標x=a+Math.sin(弧度)*半徑,縱坐標y=b+Math.cos(弧度)*半徑。
具體算法如下:
int distance = p.y - y;// 求的半徑 ,其中p表示子彈的出發點
int x = Math.round((float) Math.sin(Math.toRadians(roate)) * distance);
xx = p.x + x;// 子彈運行軌跡的x坐標
int y = Math.round((float) Math.cos(Math.toRadians(roate)) * distance);
yy = p.y - Math.abs(yy);// 子彈運行軌跡的y坐標
}
}
3.3子彈擊中魚的算法描述
魚在池塘中游動,子彈發射的時候如何判斷魚被子彈擊中:如果子彈擊中了魚以后,彈夾中就會刪除這顆子彈,判斷魚是否存活的變量值則變為false。捕到魚的變量num加1。下面給出判斷魚是否被擊中的偽代碼。
for (int i = 0; i < 池塘中魚的數量; i++) {
if (子彈的橫坐標 >= 魚的左上角的頂點橫坐標 &&
子彈的橫坐標 < 魚左上角頂點 橫坐標+ 魚的寬度 &&
子彈的縱坐標 >=魚的左上角的頂點縱坐標&&
子彈的縱坐標 <= 魚的左上角頂點的縱坐標 + 魚的高度)
{
魚被擊中;
刪除彈夾中的這顆子彈;
isLive=false;
pool.num++;
} }
4結束語
本文介紹了基于Android系統捕魚達人游戲設計的總體流程,并詳細介紹了各個實體類實現的功能,在設計開發的同時,對游戲中用到的關鍵算法進行了詳細的闡述。但該游戲的模塊相對來說較為簡單,子彈擊中魚的范圍不夠精確等,有待在后期進行模塊的拓展和功能的完善。
參考文獻:
[1] 奚洋,郭健.基于Android的連連看游戲的算法研究[J].無線互聯科技, 2012(9):122.
[2] 劉毅.Android游戲開發課程教學改革與實踐[J].現代企業教育,2014,(16):379.
[3] 曲蘊慧. Android系統下手機游戲的設計與開發[J].電子科技,2013(6):94-95.
[4] 李嘉誠. Android應用程序開發研究與應用[J].軟件導刊,2014(13):64-67.
[5] 陳淮.基于Android游戲開發常用類庫的設計與研究[D].西安電子科技大學,2010.
[6] 李興華.Android開發實戰經典[M].北京:清華大學出版社, 2012.