2048遊戲程式碼邏輯分析
從主類開始走:
-->MainActivity-->找到一些控制元件-->點選開始按鈕時執行GameView中的startGame()方法
|
\|/
執行MainActivity的clearScore方法,分數的textview清空,並顯示結果。
執行 showBestScore方法,在顯示最高紀錄的textview中從sd卡中調出儲存的最大紀錄並顯示出來
將所有自定義的Card的初始值都定為0。
呼叫addRandomNum()將所有的Card的值為0的卡片通過陣列的X,Y座標一一對應的儲存到list裡面。
在為空的Card的view處隨機消除兩個,然後在消除的地方產生兩個Card,值為2或者4。
在生成Card的時候,會呼叫createScaleTo1()方法,為生成的Card新增動畫效果。
初始化完成之後,我們在點選螢幕的時候會觸發OnTouchListener()方法,(通過落下點的座標和擡起手指的座標的計算判斷出手指的方向)
向左移動: 執行swipeLeft();
向右移動: 執行swipeRight();
向上移動: 執行swipeUp();
向下移動: 執行swipeDown();
拿一個向左移動的例子來講解:
1.遇到左邊的值為0的情況:
首先將所有的card的值遍歷一遍,如果x1的值大於0,並且它左邊的值為0,那麼呼叫AnimLayer裡面的createMoveAnim()方法
|
\|/
將x1的Card的view佈局的寬和高都變成0,觸發了LinearLayout的onSizeChanged()方法,
\|/
Config.CARD_WIDTH = (Math.min(w, h) - 10) / Config.LINES;此值會發生改變
接著呼叫TranslateAnimation()方法,移動Card到目的Card處,並且呼叫recycleCard()方法回收原來X1處的位置,因為此時這裡變成了0,將此處新增到專門儲存0值的list裡面
2.遇到左邊的值不為0的情況:
多了兩步,一,將目的Card的值*2
二,呼叫addScore()方法,將目的Card的值加到顯示分數的那個TextView那裡。