編輯:Android資訊
本博文演示了如何通過自定義View實現微信打飛機游戲。
全部源碼已經開源到GitHub,如果覺得不錯,歡迎大家Star和Fork!
GitHub: https://github.com/iSpring/GamePlane/
我們定義了Sprite
類,即精靈類,游戲中的飛機、子彈、獎勵道具等都是繼承自該類,我們通過moveTo()、move()等方法控制精靈的位置,通過beforeDraw()、onDraw()、afterDraw()實現相應的繪圖邏輯。精靈類及其子類繼承如下所示:
GameView是我們自定義的View類,主要重寫了onDraw()
和onTouchEvent()
方法。onDraw()源碼如下所示:
@Override protected void onDraw(Canvas canvas) { //我們在每一幀都檢測是否滿足延遲觸發單擊事件的條件 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有三種狀態:游戲開始STATUS_GAME_STARTED、游戲暫停STATUS_GAME_PAUSED和游戲結束STATUS_GAME_OVER。在不同的狀態下我們會調用不同的繪制方法,這幾個方法中都會調用方法postInvalidate()
,這樣驅動著View不斷重繪,進而不斷調用onDraw()
方法實現游戲的動態效果。關於繪圖技巧,可以參見另一篇博文《Android中Canvas繪圖基礎詳解(附源碼下載)》。
我們也重寫了GameView的onTouchEvent()
方法。由於View只支持單擊事件,而不支持雙擊事件,所以我們自己定義了一個resolveTouchType()
方法,通過這個方法可以合成我們自己想要的事件類型,比如雙擊事件。我們記錄MotionEvent.ACTION_DOWN
和MotionEvent.ACTION_UP
的時間,一次單擊事件由ACTION_DOWN和ACTION_UP兩個事件合成,假設從ACTION_DOWN到ACTION_UP間隔小於200毫秒,我們就認為發生了一次單擊事件。一次雙擊事件由兩個點擊事件合成,兩個單擊事件之間小於300毫秒,我們就認為發生了一次雙擊事件。在觸發了雙擊事件的時候,我們就會觸發炸彈,將屏幕內的敵機都炸毀。當處於ACTION_MOVE狀態時,我們就通過event.getX()
和event.getY()
改變戰斗機的位置。關於MotionEvent
的詳細信息可以參另一篇博文《Android中TouchEvent觸摸事件機制》。
我們還為GameView提供了start()、pause()、resume()和destroy()等方法,使其具備類似於Activity的生命周期,方便在Activity中對GameView進行狀態管理。
小敵機類,體積小,抗打擊能力低;中敵機類,體積中等,抗打擊能力中等;大敵機類,體積大,抗打擊能力強。當敵機銷毀的時候,我們使用了爆炸效果,使用了如下的圖片:
這張圖片演示了爆炸從開始到結束14個階段的效果圖,我們用兩幀繪制爆炸的一個階段,這樣完整繪制一個爆炸效果需要28幀,在繪制完最後一個階段之後,Explosion
類會銷毀自己。
模式的定義 適配器模式把一個類的接口變換成客戶端所期待的另一種接口,從而使原本因接口不匹配而無法在一起工作的兩個類能夠在一起工作。 使用場景 用電源接口做例子,筆
2015年伊始,Google發布了關於Android性能優化典范的專題, 一共16個短視頻,每個3-5分鐘,幫助開發者創建更快更優秀的Android App。課程
“你走進一個咖啡店坐下來。等咖啡的時候,你拿出你的智能手機開始玩一款你前些天下載的游戲。接著,你繼續工作並且在電梯裡收郵件。在你不知情下,有攻擊者獲取了公司網絡的
有過Android開發經歷的人都不會對ANR陌生,它和崩潰一樣是程序設計的問題。本文將以較為深入的視角來介紹什麼是ANR,出現場景,如何避免以及如何定位分析ANR