臧利萍 劉燕美 高振
【摘要】針對(duì)Android平臺(tái)下游戲?qū)崟r(shí)交互的特點(diǎn),本文使用SurfaceView進(jìn)行界面布局的構(gòu)建,采用矩形碰撞檢測(cè)進(jìn)行算法分析,以數(shù)組、list、HashMap等進(jìn)行數(shù)據(jù)的存儲(chǔ)和更新。本文以Java多線(xiàn)程技術(shù)為開(kāi)發(fā)的關(guān)鍵技術(shù)。本文使用觸屏、鍵盤(pán)和重力傳感器三種控制方式,實(shí)現(xiàn)了游戲場(chǎng)景、游戲難度的選擇,游戲背景音樂(lè)、音效和震動(dòng)效果的設(shè)置以及白天模式和夜間模式兩種適合不同光照條件的游戲模式。
【關(guān)鍵詞】Android;飛行射擊游戲;多線(xiàn)程;傳感器
一、緒論
Android是Google公司針對(duì)手機(jī)等移動(dòng)終端設(shè)備設(shè)計(jì)的開(kāi)源平臺(tái),該平臺(tái)基于Linux內(nèi)核,有操作系統(tǒng)、中間層、用戶(hù)界面層和應(yīng)用程序組成,是首個(gè)為移動(dòng)終端打造的真正開(kāi)放和完整的操作系統(tǒng)。該平臺(tái)以其開(kāi)放性、平等性、無(wú)界性、方便性和硬件豐富性受到用戶(hù)和開(kāi)發(fā)者的青睞,并迅速占領(lǐng)移動(dòng)終端市場(chǎng)[1]。該平臺(tái)呈現(xiàn)眾多應(yīng)用程序。射擊類(lèi)游戲是一種較成熟的游戲類(lèi)型,在移動(dòng)手機(jī)中飛行射擊類(lèi)游戲更是受到用戶(hù)的特別青睞。隨著Android平臺(tái)的發(fā)展和移動(dòng)設(shè)備硬件水平的不斷提高,無(wú)論是在數(shù)量上還是質(zhì)量上,Android游戲手機(jī)游戲都得到很大的發(fā)展,優(yōu)秀的2D、3D游戲?qū)映霾桓F[2]。本文是基于Android平臺(tái)設(shè)計(jì)一款飛行射擊類(lèi)游戲。
本游戲使用Android中的SurfaceView作為主要視圖,采用矩形碰撞檢測(cè)作為游戲的主要碰撞檢測(cè)算法。游戲涉及Android圖形處理、數(shù)據(jù)存儲(chǔ)、多媒體開(kāi)發(fā)、傳感器開(kāi)發(fā)、Android進(jìn)程內(nèi)部通信和Java集合框架的應(yīng)用。
游戲提供了觸屏、鍵盤(pán)和重力傳感器三種控制方式,實(shí)現(xiàn)了游戲場(chǎng)景、游戲難度的選擇,游戲背景音樂(lè)、音效和震動(dòng)效果的設(shè)置以及白天模式和夜間模式兩種適合不同光照條件的游戲模式。
二、游戲設(shè)計(jì)
1.界面設(shè)計(jì)
本游戲的主要包括歡迎界面、菜單界面、幫助界面、游戲界面、設(shè)置界面、游戲勝利界面、游戲失敗界面等。其中游戲界面采用SurfaceView視圖,該視圖下采用onTouchEvent、onKeyUp、onKeyDown回調(diào)方法捕獲用戶(hù)輸入,實(shí)現(xiàn)人機(jī)交互。SurfaceView在使用時(shí)通過(guò)SurfaceHolder管理,SurfaceHolder通過(guò)其內(nèi)部接口CallBack實(shí)現(xiàn)對(duì)SurfaceView狀態(tài)變化的監(jiān)聽(tīng),從而實(shí)現(xiàn)對(duì)Surfaceview的管理[4]。SurfaceView用來(lái)保存界面像素信息,游戲界面的構(gòu)建、敵機(jī)、我機(jī)、子彈等繪制工作由SurfaceHolder完成。SurfaceView運(yùn)用雙緩沖技術(shù)實(shí)現(xiàn)界面繪制,提高界面繪制的實(shí)時(shí)性和交互性。
2.界面功能
游戲控制方式:游戲提供觸屏控制、傳感器控制、鍵盤(pán)控制三種控制方式。本文重點(diǎn)描述傳感器控制的過(guò)程。游戲通過(guò)調(diào)用相關(guān)的方法獲得傳感器服務(wù),該方法返回一個(gè)負(fù)責(zé)管理移動(dòng)終端設(shè)備的傳感器對(duì)象,并且提供了訪(fǎng)問(wèn)設(shè)備支持的傳感器的方法。Android系統(tǒng)提供了一個(gè)對(duì)傳感器數(shù)據(jù)進(jìn)行實(shí)時(shí)監(jiān)控的類(lèi)[5]。在傳感器對(duì)象中利用該對(duì)象的方法以特定的頻率監(jiān)聽(tīng)傳感器數(shù)據(jù)的更新。
游戲設(shè)置:主要實(shí)現(xiàn)游戲背景音樂(lè)、音效、震動(dòng)效果等設(shè)置,游戲控制方式設(shè)置,游戲模式(白天模式和夜間模式)設(shè)置。Andriod對(duì)音頻文件的處理主要通過(guò)MediaPlayer和soundpool實(shí)現(xiàn)。MediaPlayer具有資源占用率高、延遲時(shí)間較長(zhǎng),不支持同時(shí)播放多個(gè)音頻文件的特點(diǎn)[6]。考慮到游戲音樂(lè)實(shí)時(shí)性、多變性等特點(diǎn)Soundpool成為播放音效文件的最佳選擇,它支持多個(gè)音樂(lè)文件的同時(shí)播放。
游戲場(chǎng)景與難度選擇:實(shí)現(xiàn)不同游戲場(chǎng)景的選擇,實(shí)現(xiàn)游戲難度(容易、中等、困難)的選擇,保存游戲進(jìn)行到一半的信息。本文采用SQLite存儲(chǔ)游戲相關(guān)的數(shù)據(jù)。SQLite是Android系統(tǒng)內(nèi)嵌的一個(gè)非常優(yōu)秀輕型的數(shù)據(jù)庫(kù),它占用資源非常的低[7],支持目前市面上主流的操作系統(tǒng),同時(shí)又能夠跟很多程序語(yǔ)言相結(jié)合,與其他開(kāi)源數(shù)據(jù)庫(kù)管理系統(tǒng)如MySql相比,SQLite具有更快的處理速度。
三、游戲碰撞檢測(cè)
碰撞檢測(cè)是游戲開(kāi)發(fā)中的重要組成部分,游戲開(kāi)發(fā)中常用的碰撞檢測(cè)技術(shù)有矩形碰撞、圓形碰撞、像素碰撞等[8]。
矩形碰撞就是利用兩個(gè)矩形之間的位置關(guān)系來(lái)進(jìn)行判斷,如果一個(gè)矩形的像素和另外一個(gè)矩形有公共部分,就可以認(rèn)為這兩個(gè)矩形發(fā)生了碰撞[9]。
圓形碰撞是利用兩個(gè)圓形的圓心距與這兩個(gè)圓的半徑之和的大小關(guān)系進(jìn)行判定的;當(dāng)兩圓的圓心距小于兩圓半徑之和,則判定發(fā)生了碰撞,否則,沒(méi)有發(fā)生碰撞。
像素碰撞是通過(guò)檢測(cè)兩個(gè)對(duì)象的像素是否有重復(fù)判斷碰撞的一種碰撞檢測(cè)技術(shù),由于這種方法造成代碼效率低下,在游戲開(kāi)發(fā)中是不推薦使用的。實(shí)際的應(yīng)用中常用多矩形或多圓形的檢測(cè)方式來(lái)代替。分析飛機(jī)射擊游戲交互性和實(shí)時(shí)性的特點(diǎn),本文采用矩形碰撞技術(shù)實(shí)現(xiàn)碰撞檢測(cè),其實(shí),兩個(gè)矩形不發(fā)生碰撞的情況就只有以下四種,處理這四種情況外,其他的位置關(guān)系都應(yīng)判定為發(fā)生了碰撞。
四、多線(xiàn)程技術(shù)
1.進(jìn)程與線(xiàn)程
進(jìn)程就是一個(gè)有自己獨(dú)立的內(nèi)存空間和系統(tǒng)資源的執(zhí)行中的程序。線(xiàn)程是一段完成某個(gè)特定功能的代碼[10]。同類(lèi)的多個(gè)線(xiàn)程共享內(nèi)存空間和系統(tǒng)資源,所以系統(tǒng)在線(xiàn)程之間切換時(shí),系統(tǒng)開(kāi)銷(xiāo)占用要比進(jìn)程小得多,正因如此,線(xiàn)程也被稱(chēng)為輕量級(jí)進(jìn)程。進(jìn)程和線(xiàn)程之間是一對(duì)多的關(guān)系[11]。
基于Android操作系統(tǒng)而言,每個(gè)組件都是一個(gè)進(jìn)程,進(jìn)程之間通過(guò)IBinder對(duì)象進(jìn)行通信,進(jìn)程內(nèi)部通過(guò)Handler實(shí)現(xiàn)線(xiàn)程間的通信[12]。主線(xiàn)程主要工作是負(fù)責(zé)維護(hù)組件對(duì)象和應(yīng)用程序創(chuàng)建的窗口,以及更新主界面,如果組件在應(yīng)用程序中創(chuàng)建了自己的線(xiàn)程,子線(xiàn)程無(wú)法對(duì)用戶(hù)界面進(jìn)行更改,只能通過(guò)handler與主線(xiàn)程進(jìn)行交互,實(shí)現(xiàn)用戶(hù)界面的更新。
2.游戲中多線(xiàn)程實(shí)現(xiàn)
多線(xiàn)程技術(shù)是本游戲設(shè)計(jì)的關(guān)鍵技術(shù),多線(xiàn)程的思想在游戲的各個(gè)界面都有體現(xiàn),其中以游戲界面體現(xiàn)最為顯著。游戲界面中除了主線(xiàn)程之外還存在計(jì)數(shù)器線(xiàn)程、傳感器事件處理線(xiàn)程、鍵盤(pán)事件處理線(xiàn)程、游戲邏輯處理線(xiàn)程和界面繪制線(xiàn)程,這些線(xiàn)程都是以?xún)?nèi)部類(lèi)的形式創(chuàng)建的,方便實(shí)現(xiàn)線(xiàn)程同步。其中計(jì)數(shù)器線(xiàn)程負(fù)責(zé)對(duì)游戲時(shí)間軸計(jì)數(shù)器的維護(hù),傳感器數(shù)據(jù)處理線(xiàn)程只有在啟用傳感器時(shí)才存在并運(yùn)行在系統(tǒng)中,傳感器事件處理線(xiàn)程通過(guò)以一定的時(shí)間間隔獲取并處理傳感器事件數(shù)據(jù)控制我機(jī)的移動(dòng),鍵盤(pán)事件處理線(xiàn)程負(fù)責(zé)處理用戶(hù)鍵盤(pán)事件,游戲邏輯處理線(xiàn)程負(fù)責(zé)游戲中所有元素(敵機(jī)的移動(dòng)、碰撞檢測(cè)、敵機(jī)計(jì)數(shù)器的檢測(cè),武器的移動(dòng)邏輯和碰撞檢測(cè)等等)的邏輯處理。界面繪制線(xiàn)程負(fù)責(zé)游戲界面中所有游戲元素的繪制工作。
同時(shí),設(shè)計(jì)線(xiàn)程對(duì)象的初始化和啟動(dòng)工作在onCreate方法中處理,線(xiàn)程的銷(xiāo)毀工作在onDestroyed方法中,保證線(xiàn)程只在游戲界面可見(jiàn)的時(shí)候才存在和運(yùn)行,防止用戶(hù)不當(dāng)操作造成線(xiàn)程意外死亡或重建。
五、游戲測(cè)試
圖1 歡迎界面測(cè)試效果圖
圖2為游戲菜單界面,共有六個(gè)選項(xiàng)供玩家選擇。
圖2 菜單界面測(cè)試效果圖
圖3為游戲場(chǎng)景選擇界面,選擇玩家喜歡或者想挑戰(zhàn)的場(chǎng)景。
圖3 場(chǎng)景選擇界面測(cè)試效果圖
圖4為游戲設(shè)置界面,玩家可以選擇自己喜歡的模式以及操作方式。
圖4 設(shè)置界面測(cè)試效果圖
圖5 游戲界面測(cè)試效果圖
圖5為游戲界面的測(cè)試效果圖,該界面有敵方和我方的裝備、武器、爆炸以及一些魔法。
參考文獻(xiàn)
[1]李華明.Android游戲開(kāi)發(fā)之從零開(kāi)始[M].清華大學(xué)出版社,2011.
[2]李剛.瘋狂Android講義精粹[M].電子工業(yè)出版社,2012.
[3]何晨光, 李洪剛.Android編程入門(mén)經(jīng)典[M].清華大學(xué)出版社,2012.
[4]熊斌編.Android多媒體開(kāi)發(fā)技術(shù)實(shí)戰(zhàn)詳解[M].電子工業(yè)出版社,2012.
[5]范懷宇.Android開(kāi)發(fā)精要[M].機(jī)械工業(yè)出版社,2012.
[6]楊明羽.Android語(yǔ)法范例參考大全[M].電子工業(yè)出版社,2012.
[7]吳亞峰,蘇亞光.Android游戲開(kāi)發(fā)大全[M].人民郵電出版社,2012.
[8]李剛.瘋狂Java講義精粹[M].電子工業(yè)出版社,2012.
[9]楊豐盛.Android應(yīng)用開(kāi)發(fā)揭秘[M].機(jī)械工業(yè)出版社,2010.
[10]埃克爾,陳昊鵬.Thinking in java[M].機(jī)械工業(yè)出版社,2007.
[11]葉乃文,鄺勁筠,杜永萍.Java核心技術(shù)[M].電子工業(yè)出版社,2011.
[12]http://developer.android.com/develop/index.html.
項(xiàng)目來(lái)源:河南省重點(diǎn)科技攻關(guān)計(jì)劃項(xiàng)目(編號(hào):132102210054)。
作者簡(jiǎn)介:臧利萍(1984—),女,河南焦作人,碩士,助教,現(xiàn)供職于鄭州航空工業(yè)管理學(xué)院,主要從事計(jì)算機(jī)圖形、虛擬現(xiàn)實(shí)等計(jì)算機(jī)應(yīng)用教學(xué)研究。