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