之前寫了很多自定義View理論方面的文章祟峦,具體可以參見《Android中自定義View、ViewGroup理論基礎詳解》 副渴。 理論指導實踐翼悴,本博文演示了如何通過自定義View實現(xiàn)微信打飛機游戲。
全部源碼已經(jīng)開源到GitHub隔缀,如果覺得不錯题造,歡迎大家Star和Fork!
GitHub: https://github.com/iSpring/GamePlane/
游戲說明
- 飛機一直發(fā)射子彈猾瘸,用手指滑動可以改變飛機的位置
- 不同的敵機抗擊打能力不同界赔,當敵機被擊中一定子彈數(shù)量時會爆炸,爆炸有動畫效果
- 每隔一段時間都會有雙發(fā)子彈或炸彈等道具獎勵
- 獲得雙發(fā)子彈之后牵触,子彈變?yōu)殡p發(fā)
- 獲得炸彈道具之后淮悼,可以通過雙擊將屏幕內(nèi)的所有敵機炸毀
實現(xiàn)
- 我們定義了
Sprite
類,即精靈類揽思,游戲中的飛機袜腥、子彈、獎勵道具等都是繼承自該類钉汗,我們通過moveTo()羹令、move()等方法控制精靈的位置鲤屡,通過beforeDraw()、onDraw()福侈、afterDraw()實現(xiàn)相應的繪圖邏輯酒来。精靈類及其子類繼承如下所示:
-
GameView是我們自定義的View類,主要重寫了
onDraw()
和onTouchEvent()
方法癌刽。onDraw()源碼如下所示:@Override protected void onDraw(Canvas canvas) { //我們在每一幀都檢測是否滿足延遲觸發(fā)單擊事件的條件 if(isSingleClick()){ onSingleClick(touchX, touchY); } super.onDraw(canvas); if(status == STATUS_GAME_STARTED){ drawGameStarted(canvas); }else if(status == STATUS_GAME_PAUSED){ drawGamePaused(canvas); }else if(status == STATUS_GAME_OVER){ drawGameOver(canvas); } }
在某一時刻GameView有三種狀態(tài):游戲開始STATUS_GAME_STARTED役首、游戲暫停STATUS_GAME_PAUSED和游戲結(jié)束STATUS_GAME_OVER。在不同的狀態(tài)下我們會調(diào)用不同的繪制方法显拜,這幾個方法中都會調(diào)用方法
postInvalidate()
衡奥,這樣驅(qū)動著View不斷重繪,進而不斷調(diào)用onDraw()
方法實現(xiàn)游戲的動態(tài)效果远荠。關(guān)于繪圖技巧矮固,可以參見另一篇博文《Android中Canvas繪圖基礎詳解(附源碼下載)》。 我們也重寫了GameView的
onTouchEvent()
方法譬淳。由于View只支持單擊事件档址,而不支持雙擊事件,所以我們自己定義了一個resolveTouchType()
方法邻梆,通過這個方法可以合成我們自己想要的事件類型守伸,比如雙擊事件。我們記錄MotionEvent.ACTION_DOWN
和MotionEvent.ACTION_UP
的時間浦妄,一次單擊事件由ACTION_DOWN和ACTION_UP兩個事件合成尼摹,假設從ACTION_DOWN到ACTION_UP間隔小于200毫秒,我們就認為發(fā)生了一次單擊事件剂娄。一次雙擊事件由兩個點擊事件合成蠢涝,兩個單擊事件之間小于300毫秒,我們就認為發(fā)生了一次雙擊事件阅懦。在觸發(fā)了雙擊事件的時候和二,我們就會觸發(fā)炸彈,將屏幕內(nèi)的敵機都炸毀耳胎。當處于ACTION_MOVE狀態(tài)時惯吕,我們就通過event.getX()
和event.getY()
改變戰(zhàn)斗機的位置。關(guān)于MotionEvent
的詳細信息可以參另一篇博文《Android中TouchEvent觸摸事件機制》怕午。我們還為GameView提供了start()混埠、pause()、resume()和destroy()等方法诗轻,使其具備類似于Activity的生命周期钳宪,方便在Activity中對GameView進行狀態(tài)管理。
-
小敵機類,體積小吏颖,抗打擊能力低凉馆;中敵機類丁恭,體積中等拘央,抗打擊能力中等式塌;大敵機類,體積大缩多,抗打擊能力強呆奕。當敵機銷毀的時候,我們使用了爆炸效果衬吆,使用了如下的圖片:
這張圖片演示了爆炸從開始到結(jié)束14個階段的效果圖梁钾,我們用兩幀繪制爆炸的一個階段,這樣完整繪制一個爆炸效果需要28幀逊抡,在繪制完最后一個階段之后姆泻,Explosion
類會銷毀自己。
全部源碼已經(jīng)開源到GitHub冒嫡,如果覺得不錯拇勃,歡迎大家Star和Fork!