Snake是Android SDK例子程序中的一個小游戲,工程源代碼:android-sdk-windows-1.5_r2\platforms\android-1.1\samples\Snake。這個小游戲在手機、游戲機、電腦中都出現過,游戲具體的玩法想必大家都知道,我主要是從Android開發應用程序的角度來分析這個游戲的框架、結構等。
首先將工程添加到Eclipes中,看源代碼,分析類之間的關系,如下:
整個工程主體也就3個類:Snake,SnakeView,TitleView。Activity,View,Handler是Android SDK提供的基礎類,Coordinate,RefreshHandler是2個輔助類,也是SnakeView類中的內部類。其中,Coordinate就相當於是一個點的坐標(x,y),RefreshHandler的主要功能是將RefreshHandler對象綁定某個線程並與給它發送消息。Snake類是這個游戲的入口點,TitleView類負責游戲的繪畫,SnakeView類負責對游戲控制操作的處理。
類的結構在上圖中已經清晰說明,主要接口解析如下:
TitleView extends View
繼承的接口
onSizeChanged()
在視圖大小改變的時候調用,比如說手機由垂直旋轉為水平
onDraw()
在視圖需要重畫的時候調用,比如說使用invalidate刷新界面上的某個矩形區域
Snake extends TitleView
繼承的接口
onKeyDown()
監聽用戶鍵盤操作,並處理這些操作
新增加的接口
restoreState()/saveState()
恢復/保存游戲的數據
update()
重新計算當前游戲的數據
然後具體分析整個游戲的框架,任何一個游戲都需要有個引擎來推動游戲的運行,最簡化的游戲引擎就是:在一個線程中While循環,檢測用戶操作,對用戶的操作作出反應,更新游戲的界面,直到用戶退出游戲。
先解析下RefreshHandler這個輔助類的作用,RefreshHandler繼承至Handler,其主要作用就是把RefreshHandler與當前線程進行綁定,然後就可以直接給線程發送消息並處理消息,有一點需要強調的是:Handle對消息的處理都是異步。RefreshHandler在Handler的基礎上增加sleep()接口,其主要作用就是每隔一個時間段後給當前線程發送一個消息;而handleMessage()則就是在接受消息後,讓界面對當前的游戲狀態作出處理,運行機制如下:
實際上以上就相當於一個定時器,在特定的時刻發送消息,根據消息處理相應的事件。Update()與Sleep()這2個函數間接的相互調用就構成了一個循環。
需要注意的是:mRedrawHandle綁定的是Avtivity所在的線程,也就是程序的主線程;另外由於sleep()是個異步函數,所以Update()與Sleep()之間的相互調用才沒有構成死循環。
最後分析下游戲數據的保存機制,如下:
以上主要考慮了Activity的生命周期:如果用戶在游戲期間離開游戲界面,游戲暫停;如果由於內存比較緊張,Android關閉游戲釋放內存,那麼當用戶返回游戲界面的時候恢復到上次離開時的界面。
Snake源代碼的內部細節,就不額外說明,在了解了框架後,再閱讀代碼就輕松多了。
總結說明
通過學習Snake這個簡單的游戲,初步學習了如何開發游戲的界面、如何處理游戲的交互、如何保存游戲的數據等,這為我們以後開發更加復雜的游戲打好堅實的基礎。