李湘一
摘 要:本文通過分析實(shí)際運(yùn)行效果,闡述了捕魚達(dá)人游戲開發(fā)的體系結(jié)構(gòu),確定了游戲開發(fā)中需要?jiǎng)?chuàng)建哪些類,如何創(chuàng)建這些類。并對(duì)各實(shí)體類實(shí)現(xiàn)的功能進(jìn)行了具體的描述。用線程實(shí)現(xiàn)了魚的游行,子彈的發(fā)射。最后給出了三種關(guān)鍵算法的描述,大炮旋轉(zhuǎn)角度的計(jì)算、子彈的運(yùn)行軌跡的計(jì)算、判斷子彈是否擊中魚的算法描述。
關(guān)鍵詞: Android;捕魚達(dá)人;算法
中圖分類號(hào):TP391 文獻(xiàn)標(biāo)識(shí)號(hào):A 文章編號(hào):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憑借其開放性和靈活性成為時(shí)下熱門的移動(dòng)終端操作系統(tǒng)之一。在Android平臺(tái)上進(jìn)行游戲的開發(fā),即已成為一個(gè)揮灑才智并極具魅力潛質(zhì)的創(chuàng)意領(lǐng)域[1]。其中,手機(jī)游戲是Android平臺(tái)上眾多類型應(yīng)用程序的一種,覆蓋面積大,傳播速度快。本文選取大眾較為熟知的捕魚達(dá)人游戲來進(jìn)行詳細(xì)闡述該游戲開發(fā)的思路和具體步驟。
1捕魚達(dá)人游戲開發(fā)的體系結(jié)構(gòu)
首先在eclipse中新建一個(gè)android項(xiàng)目名稱為fish,在src文件夾下新建com.tarena.fish包,捕魚達(dá)人游戲中用到的圖片素材全部拷貝到drawable目錄中。游戲最終顯示效果如圖1所示。
該游戲開發(fā)的體系結(jié)構(gòu)如圖2所示。
2各實(shí)體類的功能實(shí)現(xiàn)描述
該游戲中有多條魚在池塘中游動(dòng),大炮將發(fā)射子彈進(jìn)行擊中魚的作用過程,同時(shí)一并顯示擊中魚所得的分?jǐn)?shù)。分析該游戲運(yùn)行效果,則需要研發(fā)如下幾種主要實(shí)體類:
池塘類Pool、魚類Fish、大炮類Barrel、子彈類Bullet。
相對(duì)應(yīng)地,研究中即在src文件夾下創(chuàng)建以上實(shí)體類Pool.java、Fish.java、Barrel.java、Bullet.java。其后,則給出各類重點(diǎn)實(shí)體的功能實(shí)現(xiàn)描述與闡析。
(1) Fish類實(shí)現(xiàn)的功能
確定魚的大小、魚的位置、魚的步伐、魚的十個(gè)動(dòng)作,在魚的構(gòu)造方法中,通過Random()函數(shù)來隨機(jī)產(chǎn)生魚每次游出的位置。魚類繼承了Thread類,如果魚被子彈擊中,讓魚重新游進(jìn)來。如果魚重新游進(jìn)來,魚的位置和步伐都隨之發(fā)生了改變;如果魚沒有被子彈擊中,就直線向前游,并在游的過程中通過循環(huán)語(yǔ)句依次完成自身的十個(gè)動(dòng)作。十個(gè)動(dòng)作完成后又將重新開始循環(huán)。如果魚已經(jīng)游出了池塘,則讓魚再重新游進(jìn)來。
(2) Barrel類實(shí)現(xiàn)的功能
確定Barrel的位置,Barrel的大小,在Barrel的構(gòu)造方法中初始化這些參數(shù)值。
(3)Bullet類實(shí)現(xiàn)的功能
定義子彈的坐標(biāo)、大小、子彈的角度、子彈的出發(fā)點(diǎn),子彈運(yùn)行軌跡的橫縱坐標(biāo),子彈是否存活(true表示子彈正常移動(dòng),false表示子彈已經(jīng)擊中fish)。具體地,move()方法實(shí)現(xiàn)子彈移動(dòng)的行為,hint()方法實(shí)現(xiàn)子彈擊中魚的方法。
(4)Pool類實(shí)現(xiàn)的功能
在Pool類中分別定義上述對(duì)象,并定義彈夾,用來存放子彈,定義捕魚的條數(shù),創(chuàng)建fishes數(shù)組用來存放11條魚,使用循環(huán)向fishes數(shù)組中放入11條魚,并啟動(dòng)魚的線程。
在onDraw()方法中將背景bg、所有的魚、大炮、積分板、子彈都畫出來。在onTouchEvent()方法中,鼠標(biāo)彈起時(shí),創(chuàng)建子彈,計(jì)算子彈的橫縱坐標(biāo),并使子彈的中心點(diǎn)和大炮的中心點(diǎn)一致。將子彈放入彈夾中,啟動(dòng)子彈線程。
(5)MainActivity類實(shí)現(xiàn)的功能
在該類中創(chuàng)建一個(gè)池塘Pool對(duì)象,設(shè)置顯示的布局窗口,創(chuàng)建開始刷新界面的線程,定義一個(gè)內(nèi)部類,通過調(diào)用onDraw()方法以實(shí)現(xiàn)不停地刷新Pool池塘中的內(nèi)容變化。
3捕魚達(dá)人關(guān)鍵算法設(shè)計(jì)
3.1大炮旋轉(zhuǎn)角度的算法描述
大炮旋轉(zhuǎn)角度如圖3所示。
從圖3中,大炮中心點(diǎn)的坐標(biāo)為(x,y),大炮左上角點(diǎn)的坐標(biāo)為(barrel.x,barrel.y),鼠標(biāo)點(diǎn)擊屏幕點(diǎn)的坐標(biāo)為(mouseX,mouseY)。
大炮中心點(diǎn)的坐標(biāo)計(jì)算如下:
int x=barrel.x+barrel.width/2;
int y=barrel.y+barrel.height/2;
其中,barrel.width和barrel.height分別表示大炮的寬度和高度。
double xx=(double)mouseY-y;//計(jì)算出的結(jié)果為負(fù)數(shù)
double yy=(double)mouseX-X;
用反余切來求出大炮的旋轉(zhuǎn)角度,f就是最后的角度。
f=Math.round(Math.toDegrees(-Math.atan(yy/xx)));
3.2子彈移動(dòng)軌跡的算法描述
子彈運(yùn)行軌跡如圖4所示。
圖4中,圓心坐標(biāo)為(a,b),圓上任意一點(diǎn)的橫坐標(biāo)x=a+Math.sin(弧度)*半徑,縱坐標(biāo)y=b+Math.cos(弧度)*半徑。
具體算法如下:
int distance = p.y - y;// 求的半徑 ,其中p表示子彈的出發(fā)點(diǎn)
int x = Math.round((float) Math.sin(Math.toRadians(roate)) * distance);
xx = p.x + x;// 子彈運(yùn)行軌跡的x坐標(biāo)
int y = Math.round((float) Math.cos(Math.toRadians(roate)) * distance);
yy = p.y - Math.abs(yy);// 子彈運(yùn)行軌跡的y坐標(biāo)
}
}
3.3子彈擊中魚的算法描述
魚在池塘中游動(dòng),子彈發(fā)射的時(shí)候如何判斷魚被子彈擊中:如果子彈擊中了魚以后,彈夾中就會(huì)刪除這顆子彈,判斷魚是否存活的變量值則變?yōu)閒alse。捕到魚的變量num加1。下面給出判斷魚是否被擊中的偽代碼。
for (int i = 0; i < 池塘中魚的數(shù)量; i++) {
if (子彈的橫坐標(biāo) >= 魚的左上角的頂點(diǎn)橫坐標(biāo) &&
子彈的橫坐標(biāo) < 魚左上角頂點(diǎn) 橫坐標(biāo)+ 魚的寬度 &&
子彈的縱坐標(biāo) >=魚的左上角的頂點(diǎn)縱坐標(biāo)&&
子彈的縱坐標(biāo) <= 魚的左上角頂點(diǎn)的縱坐標(biāo) + 魚的高度)
{
魚被擊中;
刪除彈夾中的這顆子彈;
isLive=false;
pool.num++;
} }
4結(jié)束語(yǔ)
本文介紹了基于Android系統(tǒng)捕魚達(dá)人游戲設(shè)計(jì)的總體流程,并詳細(xì)介紹了各個(gè)實(shí)體類實(shí)現(xiàn)的功能,在設(shè)計(jì)開發(fā)的同時(shí),對(duì)游戲中用到的關(guān)鍵算法進(jìn)行了詳細(xì)的闡述。但該游戲的模塊相對(duì)來說較為簡(jiǎn)單,子彈擊中魚的范圍不夠精確等,有待在后期進(jìn)行模塊的拓展和功能的完善。
參考文獻(xiàn):
[1] 奚洋,郭健.基于Android的連連看游戲的算法研究[J].無(wú)線互聯(lián)科技, 2012(9):122.
[2] 劉毅.Android游戲開發(fā)課程教學(xué)改革與實(shí)踐[J].現(xiàn)代企業(yè)教育,2014,(16):379.
[3] 曲蘊(yùn)慧. Android系統(tǒng)下手機(jī)游戲的設(shè)計(jì)與開發(fā)[J].電子科技,2013(6):94-95.
[4] 李嘉誠(chéng). Android應(yīng)用程序開發(fā)研究與應(yīng)用[J].軟件導(dǎo)刊,2014(13):64-67.
[5] 陳淮.基于Android游戲開發(fā)常用類庫(kù)的設(shè)計(jì)與研究[D].西安電子科技大學(xué),2010.
[6] 李興華.Android開發(fā)實(shí)戰(zhàn)經(jīng)典[M].北京:清華大學(xué)出版社, 2012.