賴建評
摘要:基于Android的游戲應(yīng)用,是Android市場中最重要的組成部分,而飛行射擊類游戲是經(jīng)典的游戲類型之一。該文采用Android平臺,分析設(shè)計了Android飛行射擊游戲開發(fā)的總體框架,研究Android飛行射擊游戲開發(fā)相關(guān)的技術(shù),包括SurfaceView視圖、背景滾動、碰撞檢測等、爆炸動畫等,設(shè)計實現(xiàn)飛行射擊游戲開發(fā)。
關(guān)鍵詞:Android;飛行射擊;游戲
中圖分類號:TP311 文獻(xiàn)標(biāo)識碼:A 文章編號:1009-3044(2016)12-0073-02
游戲發(fā)展至今,劃分出了休閑益智、體育競速、動作冒險、飛行射擊、經(jīng)營策略、角色扮演等游戲類型。在眾多的游戲分類中,飛行射擊游戲是發(fā)展較早的游戲類型之一,在電子游戲的歷史演變過程中扮演了重要的角色,留下很多經(jīng)典的代表作,如“斑鳩”、“1945”、“雷電”等。隨著Android智能終端的普及,飛行射擊游戲在Android平臺,通過用戶觸屏直接控制飛機,能給用戶帶來更刺激、更暢快的體驗。本文基于Android平臺,分析相關(guān)開發(fā)技術(shù),設(shè)計實現(xiàn)一款飛行射擊游戲。
1 飛行射擊游戲框架
1.1游戲視圖
在Android游戲開發(fā)中,游戲界面需要用到大量的圖片資源和處理圖像特效,如果采用Android應(yīng)用開發(fā)中單純的XML布局界面,會造成界面刷新時間過長、事件處理等待太久等問題。為解決以上問題,在Android游戲中采用自定義視圖繼承View或SurfaceView實現(xiàn)游戲界面繪制。
View對畫布的重新繪制,通過該類的invalidate()或postInvalidate()完成,畫布由系統(tǒng)的UI主線程進行更新。而SurfaceView中內(nèi)嵌有Surface對象,Surface是在后臺線程中繪制,畫布的重繪由新線程完成。在飛行射擊游戲中,游戲界面的物體是動態(tài)變化的,需要在游戲過程中不斷重新繪制,因此選擇SurfaceView視圖,能夠避免主線程阻塞,提高程序反應(yīng)速度,SurfaceView更適合用于飛行射擊游戲開發(fā)。
1.2 SurfaceView框架
SurfaceView繼承View,包含SurfaceHolder接口的實現(xiàn)實例,對外提供該實例的訪問接口。SurfaceHolder里包含對SurfaceView內(nèi)嵌的 Surface進行控制的接口,能夠獲取Surface、更改Surface顯示內(nèi)容及監(jiān)聽Surface狀態(tài)事件。
Surface狀態(tài)事件的監(jiān)聽通過重寫以下三個函數(shù)實現(xiàn):surfaceCreated(),當(dāng)SurfaceView首次創(chuàng)建后調(diào)用,在該函數(shù)中完成繪制界面相關(guān)信息的初始化工作;surfaceChanged(),當(dāng)SurfaceView的尺寸發(fā)生改變的時候調(diào)用,在surfaceCreated運行后會首次被調(diào)用;surfaceDestroyed(),當(dāng)SurfaceView被銷毀前調(diào)用,如退出游戲畫面,在該函數(shù)中停止繪圖線程和清理使用的資源。
SurfaceView采用了雙緩沖技術(shù),在繪圖前通過SurfaceHolder的lockCanvas()獲取Canvas,在 Canvas上繪制內(nèi)容,繪制完成后調(diào)用SurfaceHolder的unlockCanvasAndPost(),把畫布中的內(nèi)容提交到Surface渲染顯示,這種雙緩沖技術(shù)能夠避免更新視圖時畫面閃爍。在線程的run方法中循環(huán)調(diào)用繪圖函數(shù),實現(xiàn)動態(tài)刷新屏幕。
2 飛行射擊游戲關(guān)鍵技術(shù)
2.1背景滾動
在飛行射擊游戲運行后,通過用戶點擊“開始”按鍵,啟動游戲進入主界面,此時游戲的背景一般是用同一張圖片,在游戲過程中不斷從上到下滾動,使得飛機在游戲界面中給玩家留下不斷飛行的錯覺。為實現(xiàn)這一效果,設(shè)計一張上、下兩邊沿能夠銜接過渡的背景圖片,設(shè)置兩個位圖A、B初始化為同一背景圖,通過繪圖控制兩個位圖A、B前后連接一起向下移動,當(dāng)A的上邊到達(dá)屏幕底部后,把A設(shè)置到B的上方,當(dāng)B到達(dá)屏幕的底部后,把B設(shè)置到A 的上方,不斷循環(huán)以上過程,實現(xiàn)背景不斷向下滾動的效果,該過程如圖1所示。
2.2 碰撞檢測
游戲開發(fā)經(jīng)常需要進行碰撞檢測處理,飛行射擊游戲中要判斷子彈是否擊中飛機,然后根據(jù)檢測的結(jié)果做出不同的處理。在手機游戲開發(fā)中最常用到三種檢測碰撞的方式,包括矩形碰撞、圓形碰撞和像素碰撞檢測。當(dāng)碰撞檢測的物體形狀比較復(fù)雜時,需要進行組合碰撞檢測,將復(fù)雜物體分解成多個基本形狀的組合,然后分別進行碰撞檢測。本程序中用到的角色形狀近似矩形,下面只討論矩形碰撞檢測的其中一種實現(xiàn)方式。
矩形碰撞檢測是通過兩個矩形之間的位置關(guān)系,判斷它們是否發(fā)生碰撞。兩個矩形之間不碰撞時的位置關(guān)系有圖2所示的四種情況:當(dāng)矩形A的右端比矩形B的左端靠左,或矩形A的左端比矩形B的右端靠右,或矩形A的下端比矩形B的上端靠上,或矩形A的上端比矩形B的下端靠下時,兩個矩形不可能發(fā)生碰撞。根據(jù)德摩根定律,求不碰撞情況下的否定,既為碰撞情況:在水平方向上,矩形A的右端比矩形B的左端靠右,并且矩形A的左端比矩形B的右端靠左,同時在垂直方向上矩形A的下端比矩形B的上端靠下,并且矩形A的上端比矩形B的下端靠上時,兩個矩形發(fā)生碰撞。
2.3爆炸動畫
Android游戲開發(fā)中,爆炸效果可以用逐幀動畫實現(xiàn)。逐幀動畫實現(xiàn)有兩種方式:當(dāng)每一幀是單獨一張圖片時,可以通過XML資源設(shè)置animation-list定義每一幀圖片和播放時間,在碰撞點播放該逐幀動畫;當(dāng)多個幀的圖片合并在一張圖片里面的時候,需要通過畫布的剪切區(qū)域,更改剪切區(qū)域位置,依次在碰撞點繪制顯示每一幀。在本文中,采用第二種方式實現(xiàn)爆炸動畫效果。
3 飛行射擊游戲設(shè)計與實現(xiàn)
3.1 程序流程設(shè)計
游戲中設(shè)計了玩家飛機、敵機和Boss角色。程序運行后,進入菜單界面,點擊開始進入游戲界面。進入游戲界面后,背景和敵機不斷從上到下移動,同時敵機發(fā)射子彈,當(dāng)敵機移動到屏幕底部或者被玩家擊中后,敵機爆炸,隨后敵機在屏幕上方重新出現(xiàn);在游戲狀態(tài)下,玩家通過觸屏控制飛機上、下、左、右飛行,并不斷向上發(fā)射子彈,玩家飛機被擊中后減少血量,當(dāng)玩家能夠擊中足夠多的敵機時,通關(guān)成功,否則游戲失敗。
3.2程序?qū)崿F(xiàn)
程序主體框架使用自定義視圖類繼承SurfaceView并實現(xiàn)SurfaceHolder.Callback和Runnable接口。線程的run()方法不斷循環(huán)調(diào)用邏輯處理模塊和繪圖方法,根據(jù)玩家操作所處的階段,完成游戲初始狀態(tài)、游戲進行狀態(tài)、游戲結(jié)束狀態(tài)界面更新繪制。初始狀態(tài)菜單繪制使用GameMenu類完成,實現(xiàn)初始?xì)g迎界面;游戲過程中通過GameBg類設(shè)置背景循環(huán)滾動,Player類完成玩家飛機飛行繪制、玩家飛機與敵機碰撞檢測、玩家飛機與敵機子彈碰撞檢測,Enemy類完成敵機飛行繪制、敵機與玩家飛機子彈碰撞檢測,Boss類完成Boss飛行繪制、Boss與玩家飛機碰撞檢測,Bullet完成子彈飛行繪制,Boom類完成爆炸效果動畫顯示。
3.3 游戲運行效果
通過使用SurfaceView視圖,應(yīng)用背景滾動和矩形碰撞檢測技術(shù),實現(xiàn)完成的飛行射擊游戲運行效果如圖3所示。
4 結(jié)束語
本文介紹了Android游戲開發(fā)中的SurfaceView視圖,研究了飛行射擊游戲開發(fā)過程中背景滾動、碰撞檢測、爆炸動畫等關(guān)鍵技術(shù),設(shè)計實現(xiàn)了Android飛行射擊游戲的框架開發(fā),經(jīng)過運行測試,該游戲運行流暢、穩(wěn)定,后期為了增強趣味性,可以在游戲中增加武器選擇、音效等開發(fā)。
參考文獻(xiàn):
[1] 吳新華,萬強.基于Android平臺的手機游戲開發(fā)[J].萍鄉(xiāng)學(xué)院學(xué)報,2015,12(32).
[2] 李華明.Android游戲編程之從零開始[M].北京:清華大學(xué)出版社,2011.
[3] 吳亞峰,于復(fù)興,杜化美.Android游戲開發(fā)大全[M].北京:人民郵電出版社,2013.