何向文
(湖南科技學(xué)院 電子與信息工程學(xué)院,湖南 永州 425199)
街頭籃球機(jī)是一項(xiàng)源于美國(guó)流行世界的現(xiàn)代體育競(jìng)枝項(xiàng)目,屬于街頭籃球文化的一部分,是一項(xiàng)適合全民健身、老少皆宜的具有較強(qiáng)競(jìng)技性、趣味性的運(yùn)動(dòng)新項(xiàng)目。投籃機(jī)是把籃球運(yùn)動(dòng)中的投籃動(dòng)作獨(dú)立出來(lái),設(shè)計(jì)成一種專門用于投籃的練習(xí)設(shè)備。其種類很多,有“兒童籃球機(jī)”“雙人籃球機(jī)”和“單人籃球機(jī)”等。由于其時(shí)尚的外形和動(dòng)感的音樂(lè)效果,很快就流行到了世界各地。
“瘋狂投籃”游戲的操作很簡(jiǎn)單,只需用手指輕觸屏幕上的籃球并將其甩出,通過(guò)控制甩的力度和方向來(lái)調(diào)整球的速度和球的走向,進(jìn)行投籃,在規(guī)定時(shí)間內(nèi)得盡可能多的分?jǐn)?shù)即可。該游戲的運(yùn)行步驟如下。
(1)啟動(dòng)游戲后首先進(jìn)入的是公司圖標(biāo)界面。(2)自動(dòng)進(jìn)入游戲聲音設(shè)置界面,單擊“是”鏈接,則開啟游戲聲音;單擊“否”鏈接,則關(guān)閉游戲聲音。(3)聲音設(shè)置完畢后,自動(dòng)切換到游戲開始菜單界面,該界面共有4個(gè)菜單,分別是開始游戲、幫助、關(guān)于及退出。(4)在開始菜單界面若單擊“幫助”按鈕,則進(jìn)入游戲幫助界面,該界面介紹了本游戲的游戲規(guī)則和游戲控制方法。(5)在開始菜單界面若單擊“關(guān)于”按鈕,則進(jìn)入游戲關(guān)于界面,該界面介紹了關(guān)于本游戲的相關(guān)信息。(6)在開始菜單界面若單擊“退出”按鈕,則退出游戲。(7)在開始菜單界面若單擊“開始游戲”按鈕,則首先切換到游戲加載畫面,加載游戲,由此開始“瘋狂投籃”游戲之旅。(8)游戲加載成功后,則進(jìn)入游戲界面。一開始,屏幕下方有3個(gè)籃球,靜止于地板,屏幕左上方的數(shù)字用來(lái)記錄玩家得分,右上方的數(shù)字表示倒計(jì)時(shí)的時(shí)間。玩家可以通過(guò)手指甩動(dòng)籃球進(jìn)行投籃。(9)游戲中,一旦玩家投出去了球,則開始倒計(jì)時(shí)。(10)游戲中,如果玩家投出去的球進(jìn)了籃筐,則相應(yīng)地增加玩家得分。(11)游戲中,如果玩家投出去的球沒有進(jìn)入籃筐,則不增加玩家得分。(12)游戲中,玩家投出去的球落到地面后便自動(dòng)回滾到屏幕下方。(13)游戲中,如果倒計(jì)時(shí)到0,則此輪游戲結(jié)束,進(jìn)入游戲結(jié)束界面。游戲的功能闡述完畢。本游戲只有一種快速游戲模式,后續(xù)開發(fā)中可自行添加如限分模式、劇情模式等,以增加游戲難度,提高游戲的可玩性。
現(xiàn)代社會(huì)人們工作日益繁忙,通過(guò)參加體育活動(dòng)來(lái)放松的時(shí)間越來(lái)越少。因此,“瘋狂投籃”作為一款體育類游戲,模擬了現(xiàn)實(shí)世界的體育活動(dòng),只要帶著手機(jī),玩家便可以隨時(shí)隨地進(jìn)入虛擬體育世界,享受體育帶來(lái)的樂(lè)趣,滿足玩家對(duì)體育娛樂(lè)性的要求。
“瘋狂投籃”的可玩性強(qiáng),需要玩家在規(guī)定時(shí)間內(nèi)得盡可能多的分?jǐn)?shù)。游戲過(guò)程中玩家不僅需要控制投籃的方向,還要恰到好處地掌握好投籃的力度,只有協(xié)調(diào)好這兩個(gè)因素,才能將球順利投進(jìn)籃筐,這也是游戲的魅力所在[1]。
如果程序中需要對(duì)圖片進(jìn)行不等比例的拉伸時(shí),可使用Android sdk安裝目錄下tools文件夾中的draw9patch工具對(duì)圖片進(jìn)行處理,以達(dá)到更好的拉伸效果。
2.2.1 游戲中用到的主要技術(shù)
程序中聲音設(shè)置界面、開始菜單、幫助界面、關(guān)于界面、加載界面及結(jié)束界面均用2D技術(shù)實(shí)現(xiàn)。以上界面均繼承和擴(kuò)展自SurfaceView并重寫了其中的onDraw方法,所有的按鈕均為筆者用貼圖實(shí)現(xiàn),避免了使用Android的自帶控件,使游戲畫面更加絢麗、個(gè)性。
游戲時(shí)的界面使用3D技術(shù)實(shí)現(xiàn),游戲界面繼承和擴(kuò)展了GLSurfaceView并實(shí)現(xiàn)了Renderer接口,通過(guò)重寫onTouchEvent方法實(shí)現(xiàn)與用戶的交互。
本游戲開發(fā)中使用的碰撞檢測(cè)是一大難點(diǎn),運(yùn)用到了數(shù)學(xué)中的向量知識(shí)和相關(guān)的物理知識(shí)。實(shí)際商業(yè)化游戲開發(fā)中,往往使用的碰撞檢測(cè)算法更效率、更準(zhǔn)確、更成熟。而這些算法都是由數(shù)學(xué)家研究的。
2.2.2 游戲的框架與游戲界面類的設(shè)計(jì)與實(shí)現(xiàn)
(1)啟動(dòng)游戲后,首先在BasketballActivity中初始化,閃過(guò)界面。(2)在BasketbalLActivity中初始化SoundView,將用戶界面切換到聲音設(shè)置界面。(3)設(shè)置完游戲聲音后,SoundsView通過(guò)重寫其onTouchEvent方法,向BasketbaIIActivity中的消息管理器發(fā)送消息,初始化MenuView,并通過(guò)調(diào)用MenuThread線程繪制開始菜單界面,將界面切換至開始菜單界面。(4)在開始菜單界面MenuView中,單擊不同的按鈕,將向BasketballActivity中的消息管理器發(fā)送不同的消息,進(jìn)入不同界面。如單擊“幫助”按鈕,則向消息管理器發(fā)送消息,進(jìn)入幫助界面。(5)當(dāng)單擊“開始游戲”按鈕時(shí),先向消息管理器發(fā)送消息,初始化LoadView,將開始菜單切換至游戲加載界面。(6)在加載界面加載動(dòng)畫完成時(shí),向消息管理器發(fā)送消息,初始化GLGameView,進(jìn)入游戲界面。首先GLGameView會(huì)初始化背景類、球類等場(chǎng)景類來(lái)繪制場(chǎng)景。同時(shí)將啟動(dòng)線程BallGoThread來(lái)改變球運(yùn)動(dòng)的位置及其狀態(tài),刷新游戲界面,進(jìn)行動(dòng)畫的繪制,同時(shí)通過(guò)調(diào)用CollisionUtil類來(lái)進(jìn)行碰撞檢測(cè)。(7)游戲界面類需要初始化的類為:BackWall,LeftWall,RightWall,F(xiàn)loor,Roof,Board,Ring,Cylinder,Assemble,Panel,Score,Deadtime,BallForDraw,LogicalBall,BallGoThread。(8)在MenuView中一旦單擊“開始游戲”按鈕則啟動(dòng)線程DeadTimeThread來(lái)實(shí)時(shí)判斷倒計(jì)時(shí)是否到零。如果到零則向消息管理器發(fā)送消息,初始化OveView,進(jìn)入結(jié)束界面。(9)在結(jié)束界面,如果觸摸屏幕的“再玩一次”字樣,則向消息管理器發(fā)送消息,將結(jié)束界面切換到開始菜單界面。
本游戲中的界面有很多,包括游戲主菜單、幫助界面、關(guān)于界面、加載界面及結(jié)束界面。但實(shí)現(xiàn)方式類似,均繼承了SurfaceView。
游戲開始菜單是游戲的一個(gè)重要界面,當(dāng)一開始進(jìn)入游戲,設(shè)置完音樂(lè)后就會(huì)進(jìn)入這個(gè)界面,而游戲勝利后,依然回到該界面。開始菜單MenuView類是本程序最主要的類之一,其實(shí)現(xiàn)比較復(fù)雜。
本游戲?yàn)?D游戲,游戲界面繼承了GLSurfaceView,游戲界面的主要作用是組裝各個(gè)已經(jīng)實(shí)現(xiàn)了的部件,并進(jìn)行游戲結(jié)束的判斷。
本游戲場(chǎng)景由較多部件組成,由于篇幅有限,筆者在這里只給出較為典型的部件的繪制。游戲中的墻壁、地板、屋頂、儀表板和計(jì)分均采用矩形貼紋理的方式實(shí)現(xiàn),即繪制一個(gè)矩形,然后對(duì)其貼背景或者地板的紋理,然后進(jìn)行平移和旋轉(zhuǎn),把背景和地板放置到游戲界面合適的位置。
籃板的實(shí)質(zhì)是一個(gè)正六面體,其正面貼有籃板的紋理。正六面體的中心點(diǎn)與其坐標(biāo)原點(diǎn)重合,這樣在以后調(diào)用時(shí)會(huì)很方便。真實(shí)籃板的整體繪制需要非常復(fù)雜的數(shù)學(xué)模型,包括圓環(huán)、圓柱和六面立方體。用圓環(huán)知識(shí)構(gòu)造籃環(huán),用圓柱知識(shí)構(gòu)造籃筐支架,用六面立方體的知識(shí)構(gòu)建籃板。
由于倒計(jì)時(shí)的紋理是采用分割位圖來(lái)獲得的,并且倒計(jì)時(shí)的變化是通過(guò)特定的DeadtimeThread.java來(lái)控制的。
為了實(shí)現(xiàn)真實(shí)的籃球運(yùn)動(dòng)效果,本游戲中籃球的運(yùn)動(dòng)拋物線完全模擬現(xiàn)實(shí)中的籃球運(yùn)動(dòng)的拋物線軌跡[2]。
進(jìn)行籃球與籃筐的碰撞檢測(cè)的最終目的是為了判斷籃球是否投進(jìn)籃筐,編寫CollisionUtil.java主要考慮的是籃球與籃筐碰撞的情況,即已知籃球碰撞前的速度、籃球撞擊時(shí)的位置、籃球撞擊時(shí)的撞擊點(diǎn),得出籃球撞擊后的反彈速度。思路如下:(1)求籃球碰撞后的反彈速度。(2)求籃球的撞擊點(diǎn)。
在整個(gè)游戲當(dāng)中,籃球不僅會(huì)和籃筐發(fā)生碰撞,還會(huì)與墻壁、地板和屋頂發(fā)生碰撞,所以同樣要對(duì)其進(jìn)行碰撞檢測(cè)。由于將速度分成了沿XYZ軸的分速度Vx,Vy,Vz,所以每次碰撞時(shí),只是垂直于碰撞面的分速度的方向變成它的相反方向,其余分速度方向不變。
在2D游戲中,觸屏游戲的物體拾取只需判斷所觸屏幕點(diǎn)的坐標(biāo)與所要拾取的物體所在點(diǎn)的坐標(biāo)(物體投影到屏幕上的坐標(biāo))的關(guān)系,如果所觸點(diǎn)坐標(biāo)在物體所在坐標(biāo)范圍內(nèi)表示拾取到物體,則可以進(jìn)行下一步操作,反之則不執(zhí)行拾取操作。
在3D游戲中,同樣要判斷所觸屏幕點(diǎn)的坐標(biāo)與所要拾取的物體所在點(diǎn)坐標(biāo)的關(guān)系,但所要考慮的就不光是屏幕觸控點(diǎn)的問(wèn)題了。3D物體處于三維立體空間中,不同物體不一定處于同一平面,這時(shí)候就要從手指所觸屏幕點(diǎn)對(duì)應(yīng)的3D空間中的點(diǎn)沿目光方向向遠(yuǎn)處發(fā)出一條射線,第1個(gè)與射線相交的物體即是要拾取的物體[3]。
在玩家眼中,好的游戲總會(huì)是有聲有色、豐富多彩的,離開了生動(dòng)的音效,游戲的體驗(yàn)就會(huì)大打折扣,所以對(duì)音效的處理是游戲開發(fā)中必不可少的。本游戲中,對(duì)音效的處理并不夠完善,有能力的玩家可以在適當(dāng)?shù)牡胤教砑由弦粜?,以提升玩家的體驗(yàn)感。
[參考文獻(xiàn)]
[1]吳亞峰.Android3D游戲開發(fā)技術(shù)詳解與典型案例[M].北京:電子工業(yè)出版社,2012.
[2]吳志霞.基于Android平臺(tái)的“戰(zhàn)斗士”游戲軟件案例設(shè)計(jì)及實(shí)現(xiàn)[J].九江學(xué)院學(xué)報(bào),2016(1):67-69.
[3]弋改珍,趙丹.基于Android平臺(tái)的飛機(jī)游戲的設(shè)計(jì)與開發(fā)[J].計(jì)算機(jī)技術(shù)與發(fā)展,2016(7):183-186.