倪建新
摘要:戰(zhàn)棋類游戲是指回合制的,在地圖上按格子移動人物進行戰(zhàn)斗的游戲,其畫面絢麗,策略性高,可玩性強,還擁有豐富的劇情,隨著安卓手機性能的大幅提高,該類游戲越來越受到用戶的青睞。該文設計并實現(xiàn)了基于Android平臺的戰(zhàn)棋游戲《森林王子》,首先分析了游戲的整體架構,其次介紹了游戲中劇情模塊,地圖模塊,圖形繪制模塊,人物角色模塊,人工智能模塊,游戲數(shù)據(jù)保存等核心內(nèi)容的實現(xiàn)方法,最后在真機上調(diào)試并實現(xiàn)了該游戲。
關鍵詞:Android;手機游戲;戰(zhàn)棋;人工智能;SQLite
中圖分類號:TP311 文獻標識碼:A 章編號:1009-3044(2016)25-0075-03
Abstract: SLG game is turn based, according to the map on the grid to move the character combat game, the screen is gorgeous, strategic high, playability strong, also has a rich story. With the substantial increase in the performance of Androids mobile phone, this type of game more and more favored by the user. In this paper, the design and implementation of SLG game "forest Prince" based on Android platform. Firstly, the overall structure of the game, followed by the introduction Implementation game Drama module, map module, graphics rendering module, characters module, artificial intelligence module, the game data storage module and other core content, the final debug and realized that in the real machine.
Key words: Android; Mobile game; SLG; artificial intelligence; SQLite
隨著智能手機保有量和硬件性能的快速增長,全球用于手機游戲的智能手機和平板電腦的數(shù)量已經(jīng)超過10億臺,2015年中國手機游戲市場規(guī)模超過400億元,同比增長47.7%,呈現(xiàn)高速增長的態(tài)勢[1]。從游戲類型的分布來看,單機休閑益智類游戲數(shù)量最多,其中戰(zhàn)棋類游戲畫面絢麗,劇情豐富,策略性高,可玩性強,該類游戲易進易出,能充分利用碎片化的休息時間,滿足近8成用戶每天半小時的游戲需求?;谝陨媳尘埃疚奶岢隽嘶贏ndroid平臺的戰(zhàn)棋類游戲《森林王子》的設計與實現(xiàn)方法,通過游戲整體架構的構建,地圖數(shù)據(jù)載入,圖形繪制,人物及怪物角色設計,怪物人工智能,游戲數(shù)據(jù)保存等核心模塊的分析,對Android戰(zhàn)棋類游戲的開發(fā)方法和實現(xiàn)過程進行了相應的探索。
1 游戲架構分析
本文中的戰(zhàn)棋類游戲《森林王子》采用了安卓SurfaceView游戲框架,在架構上主要包括總控模塊,前臺界面模塊,游戲?qū)嶓w模塊,后臺邏輯模塊共四大部分組成。其中總控程序主要用來在各游戲畫面之間切換,初始化及載入地圖數(shù)據(jù),初始化圖片資源;前臺顯示模塊主要用來進行游戲劇情,游戲運行畫面以及游戲戰(zhàn)斗界面的繪制渲染;游戲?qū)嶓w模塊則包括游戲中出色的人物角色,敵方怪物以及游戲道具等;后臺邏輯模塊主要包括地圖數(shù)據(jù)的載入,怪物人工智能,如怪物的行走路徑,怪物的攻擊碰撞等以及后臺數(shù)據(jù)的保存。游戲的總體架構及各模塊之間的關系如圖1所示:
2 游戲關鍵模塊的設計與實現(xiàn)
2.1 游戲地圖的設計及實現(xiàn)
地圖的數(shù)據(jù)結構設計是整個游戲算法的基礎。本游戲為二維平面游戲,用二維數(shù)組來映射地圖元素和地圖數(shù)據(jù)之間的邏輯關系,將地圖中的格子對應為二維數(shù)組行列中的一個個單元,單元中存放不同的數(shù)值用來表示地圖上要展示的不同圖形元素,如數(shù)值0表示草地,數(shù)值1表示樹,數(shù)值2表示木柵欄等。
用數(shù)值表示的地圖數(shù)據(jù)比較抽象,行列數(shù)太多時很容易出錯,游戲地圖在實現(xiàn)時可以首先使用地圖編輯器直觀的畫出來,然后通過行列掃描轉換成數(shù)值,最后再保存成地圖文件[2]。
游戲中設計有若干關卡,需要相對應的地圖,當切換關卡時,二維數(shù)組中的數(shù)值要重新設置以用來表示不同的地圖,將事先保存地圖文件通過文件操作打開,切換關卡時,將具體的數(shù)值讀入到二維數(shù)組中就可以實現(xiàn)關卡地圖的切換。
2.2 前臺界面的渲染繪制及切換
游戲中的前臺界面主要包括劇情界面,主游戲界面,戰(zhàn)斗界面及一些輔助設置界面,主游戲關卡界面擴展自Android的SurfaceView視圖,使用獨立的畫圖線程并配合雙緩沖技術進行界面的渲染繪制,不會阻塞UI主線程,以滿足戰(zhàn)棋類游戲畫面絢麗的特點。通過Handler機制進行前臺界面之間消息的傳遞和接收從而實現(xiàn)界面的全屏切換。
劇情顯示界面和戰(zhàn)斗界面這兩類遮蓋于游戲界面上的窗口設計成包含獨立線程的類,滿足觸發(fā)條件時進行觸發(fā),遮蓋游戲界面部分區(qū)域,同時需要從主游戲界面中接管游戲的焦點和游戲屏幕的控制權,以響應觸屏操作。劇情和戰(zhàn)斗畫面顯示完畢后,則需要歸還游戲焦點和游戲屏幕的控制權,讓主游戲畫面響應觸屏操作,其核心在于OnTouchListener監(jiān)聽器的設置,返回及游戲狀態(tài)的恢復。
2.3 圖片加載技術的改進
游戲?qū)崿F(xiàn)過程中為了實現(xiàn)豐富的劇情,絢麗的畫面需要大量的圖片,而安卓游戲架構中加載大量圖片或大尺寸圖片到內(nèi)存時經(jīng)常會發(fā)生內(nèi)存溢出錯誤(Out of Memory)。為此本游戲沒有采用BitmapFactory.decodeResource方法將圖片加載到內(nèi)存,而是重寫了自己的圖片加載方法readBitmap。首先在readBitmap方法中創(chuàng)建一個12KB的臨時空間,其次將BitmapFactory.Options的采樣率inSampl-eSize設置為2,這樣一來圖片占用內(nèi)存的大小只有原來的1/4,最后使用decodeStream方法直接創(chuàng)建bitmap對象,大大節(jié)省了內(nèi)存的消耗,有效的阻止了內(nèi)存溢出錯誤。該方法需要在資源文件夾下Drawable對應的分辨率文件下放置相對應的圖片資源,以進行不同分辨率手機的自適應。
2.4 人物角色的移動算法
人物角色移動時按格子一格一格移動,但若格子寬高較大時,人物移動就會一格一格的跳躍,顯得很不連貫。本游戲移動算法實現(xiàn)時首先根據(jù)觸屏按下的坐標換算出目的地在地圖行列中的位置,從而計算出本次移動的方向和格子數(shù),其次創(chuàng)建控制人物移動的線程,將每格的距離等分成若干個小步,每移動一小步,將線程SLEEP,這樣就實現(xiàn)了人物的無極移動,不會產(chǎn)生跳躍感,最后當人物到達目標位置時,需要根據(jù)等分的小步距離,將人物的坐標微調(diào),以確保人物的中心在格子的中心位置。
游戲的地圖包含若干行列,當其超過手機屏幕所能表示的行列數(shù)后,人物移動時就需要對地圖進行滾屏操作。因此在人物的移動算法中,當人物每移動一小步后還需要加入對地圖滾屏的判斷,人物的坐標加上預設的偏移量若超過手機屏幕的寬高則需要進行滾屏操作[3]。
人物在移動的過程中可能會遇到怪物,障礙物,道具等實體對象,移動時就需要進行碰撞檢測,游戲中的人物,怪物等基本都和格子有關,所以碰撞檢測算法就采用了矩形碰撞,根據(jù)兩個矩形對象左上角的X坐標,Y坐標,寬度W和高度H計算出兩個矩形有無重疊,若重疊就表示發(fā)生了碰撞[4]。游戲中為了表現(xiàn)碰撞的真實性,還需要計算出兩個矩形重疊位置的面積占整個矩形面積的百分比,防止產(chǎn)生兩個實體邊緣碰擦也被視為碰撞的情形。
2.5 怪物人工智能的設定
為了使游戲中的怪物看起來具有智能,游戲中就必須給怪物設定人工智能。本文給怪物制定了兩類人工智能策略,一類是守護,算法思路為:在地圖守護點周圍選擇A,B兩點,怪物在A,B兩點之間徘徊,當人物角色進入守護點立即觸發(fā)戰(zhàn)斗;另一類是進攻,該策略又由兩個子目標組成,找到抵達人物角色的路徑和跟隨路徑到人物角色,當移動到人物位置時主動發(fā)起戰(zhàn)斗。
游戲中執(zhí)行進攻策略的怪物都擁有一個專門的路徑規(guī)劃類PathPlan,該類的算法為:將地圖二維數(shù)組中的無障礙物節(jié)點映射為一張靜態(tài)路網(wǎng)圖,尋找離當前怪物最近的、無障礙的圖節(jié)點A,尋找離人物角色最近的、無障礙的圖節(jié)點B,使用A*搜索算法尋找AB兩個圖節(jié)點之間的最低成本路徑,并將結果放置在表示路徑節(jié)點的列表PathOfNode中[5]。
當路徑規(guī)劃好之后,怪物執(zhí)行跟隨路徑到人物角色子目標并找到人物,算法為:遍歷PathOfNode,將怪物按順序在路徑節(jié)點之間移動,直至列表的末尾。為了減少手機CPU資源的消耗,游戲中并未實時更新怪物的路徑規(guī)劃,只有當人物角色移動結束之后才進行路徑的重新規(guī)劃。
2.6 游戲數(shù)據(jù)的保存及恢復
本游戲在實現(xiàn)時涉及到大量復雜的數(shù)據(jù),如各實體的屬性數(shù)據(jù),游戲地圖數(shù)據(jù)等,單純使用XML文件存儲對于保存和恢復就較為復雜,因此存儲數(shù)據(jù)時采用了SQLite數(shù)據(jù)庫,根據(jù)需求分析創(chuàng)建了四張表,分別是hero表,monster表,tools表和map表。當在游戲中選擇存盤或直接關閉游戲時就將人物屬性值,怪物列表屬性值,道具列表屬性值以及當前地圖的關鍵數(shù)值,如關卡數(shù),左上角的行列位置等存入到數(shù)據(jù)庫中,創(chuàng)建了SavaDate方法,直接利用標準SQL語句,以當前手機系統(tǒng)時間為標識,將數(shù)據(jù)存儲到SQLite數(shù)據(jù)庫中。當需要再次繼續(xù)游戲時,利用ReadData方法,選取存盤的時間點,查詢出相對應的數(shù)據(jù),在總控程序初始化過程中給相關實體對象和地圖數(shù)據(jù)直接賦值。
3 系統(tǒng)的開發(fā)環(huán)境及運行實例展示
本文中的戰(zhàn)棋類游戲《森林王子》采用了Eclipse+JDK6.0+Android4.2的開發(fā)環(huán)境,在虛擬機和Android真機U879,512M內(nèi)存,854*480像素配置機器上均可正常運行,游戲運行時采用橫屏設置,畫面無閃爍,繪制速度快,人物及怪物移動流暢不卡頓,用戶體驗良好。游戲運行效果如圖2所示:
4 結束語
戰(zhàn)棋類游戲在PC端有著堅實的用戶基礎,涌現(xiàn)過一大批優(yōu)秀的游戲作品。隨著智能手機硬件性能特別是內(nèi)存空間的不斷提升,手機端戰(zhàn)棋類游戲的開發(fā)呈現(xiàn)不斷增長的態(tài)勢。本文分析了基于Android平臺的戰(zhàn)棋類游戲《森林王子》的整體結構,并對地圖,界面繪制,人物移動,怪物人工智能,后臺數(shù)據(jù)庫運用等技術要點進行了闡述,為該類游戲的開發(fā)提供一些可行的開發(fā)思路和開發(fā)方法,下一步將對游戲屏幕的自適應做進一步的研究,以兼容絕大多數(shù)的智能手機設備,為游戲的商業(yè)化開發(fā)提供一些幫助。
參考文獻:
[1] 艾媒咨詢. 2015-2016中國手機游戲行業(yè)年度研究報告[EB/OL]. [2016-03-10]. http://www.iimedia.cn/41102.html.
[2] 程和俠, 孫宜南, 黃國興. 手機游戲地圖設計的高級技術研究[J]. 微型電腦應用, 2010(8):9-10.
[3] 吳亞峰,于復興. Android游戲開發(fā)大全[M]. 北京: 人民郵電出版社, 2013.
[4] 于曉霞. 碰撞檢測技術在游戲中的應用與實現(xiàn)[D]. 太原: 太原理工大學, 2007.
[5] Mat Buckland. 游戲人工智能編程案例精粹[M]. 羅岱, 譯. 北京: 人民郵電出版社, 2008.