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