今天我們要繼續(xù)開發(fā)Android游戲拼圖,今天同樣是做一些準(zhǔn)備工作,昨天我們把界面的準(zhǔn)備工作做好了,今天呢,我們想想,要完成一個拼圖,我們還需要做哪些準(zhǔn)備。
首先,我們需要一個工具類,去獲取屏幕的相關(guān)信息,讓我們的程序去自動適應(yīng)不同分辨率大小的屏幕:
- package com.xys.xpuzzle.util;
-
- import android.content.Context;
- import android.util.DisplayMetrics;
- import android.view.Display;
- import android.view.WindowManager;
-
- /**
- * 屏幕工具類:實現(xiàn)獲取屏幕相關(guān)參數(shù)
- *
- * @author xys
- *
- */
- public class ScreenUtil {
-
- /**
- * 獲取屏幕相關(guān)參數(shù)
- *
- * @param context
- * @return DisplayMetrics 屏幕寬高
- */
- public static DisplayMetrics getScreenSize(Context context) {
- DisplayMetrics metrics = new DisplayMetrics();
- WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
- Display display = wm.getDefaultDisplay();
- display.getMetrics(metrics);
- return metrics;
- }
- }
下面我們要開始設(shè)計一個實體bean,去封裝我們的拼圖,這里的方法有很多,我只是舉個磚頭。
我們知道,拼圖時會把圖片分割成NXN個方塊,移動方塊以完成拼圖,所以我將每個分割后的方塊做成一個對象,我們所有的實體bean都是基于每個分割后的方塊,所以自然的我們可以抽象出一個實體bean:
- package com.xys.xpuzzle.bean;
-
- import android.graphics.Bitmap;
-
- /**
- * 拼圖Item邏輯實體類:封裝邏輯相關(guān)屬性
- *
- * @author xys
- *
- */
- public class ItemBean {
-
- // Item的Id
- private int itemId;
- // bitmap的Id
- private int bitmapId;
- // bitmap
- private Bitmap bitmap;
-
- public int getItemId() {
- return itemId;
- }
-
- public void setItemId(int itemId) {
- this.itemId = itemId;
- }
-
- public ItemBean() {
- }
-
- public int getBitmapId() {
- return bitmapId;
- }
-
- public void setBitmapId(int bitmapId) {
- this.bitmapId = bitmapId;
- }
-
- public Bitmap getBitmap() {
- return bitmap;
- }
-
- public void setBitmap(Bitmap bitmap) {
- this.bitmap = bitmap;
- }
-
- public ItemBean(int itemId, int bitmapId, Bitmap bitmap) {
- this.itemId = itemId;
- this.bitmapId = bitmapId;
- this.bitmap = bitmap;
- }
-
- }
bean里面封裝了
1、方塊對應(yīng)在NXN格中的序號
2、分割后的圖片的ID和對應(yīng)的圖片
接下來就是對圖片的分割:
- package com.xys.xpuzzle.util;
-
- import java.util.ArrayList;
- import java.util.List;
-
- import com.xys.xpuzzle.R;
- import com.xys.xpuzzle.activity.PuzzleMain;
- import com.xys.xpuzzle.bean.ItemBean;
-
- import android.content.Context;
- import android.graphics.Bitmap;
- import android.graphics.BitmapFactory;
- import android.graphics.Matrix;
-
- /**
- * 圖像工具類:實現(xiàn)圖像的分割與自適應(yīng)
- *
- * @author xys
- *
- */
- public class ImagesUtil {
-
- public ItemBean itemBean;
-
- /**
- * 切圖、初始狀態(tài)(正常順序)
- *
- * @param type
- * @param picSelected
- * @param context
- */
- public void createInitBitmaps(int type, Bitmap picSelected, Context context) {
- Bitmap bitmap = null;
- List<Bitmap> bitmapItems = new ArrayList<Bitmap>();
- // 每個Item的寬高
- int itemWidth = picSelected.getWidth() / type;
- int itemHeight = picSelected.getHeight() / type;
- for (int i = 1; i <= type; i++) {
- for (int j = 1; j <= type; j++) {
- bitmap = Bitmap.createBitmap(picSelected, (j - 1) * itemWidth, (i - 1) * itemHeight, itemWidth, itemHeight);
- bitmapItems.add(bitmap);
- itemBean = new ItemBean((i - 1) * type + j, (i - 1) * type + j, bitmap);
- GameUtil.itemBeans.add(itemBean);
- }
- }
- // 保存最后一個圖片在拼圖完成時填充
- PuzzleMain.lastBitmap = bitmapItems.get(type * type - 1);
- // 設(shè)置最后一個為空Item
- bitmapItems.remove(type * type - 1);
- GameUtil.itemBeans.remove(type * type - 1);
- Bitmap blankBitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.blank);
- blankBitmap = Bitmap.createBitmap(blankBitmap, 0, 0, itemWidth, itemHeight);
-
- bitmapItems.add(blankBitmap);
- GameUtil.itemBeans.add(new ItemBean(type * type, 0, blankBitmap));
-
- GameUtil.blankItemBean = GameUtil.itemBeans.get(type * type - 1);
- }
-
- /**
- * 處理圖片 放大、縮小到合適位置
- *
- * @param newWidth
- * @param newHeight
- * @param bitmap
- * @return
- */
- public Bitmap resizeBitmap(float newWidth, float newHeight, Bitmap bitmap) {
- Matrix matrix = new Matrix();
- matrix.postScale(newWidth / bitmap.getWidth(), newHeight / bitmap.getHeight());
- Bitmap newBitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
- return newBitmap;
- }
- }
這個工具類主要完成這兩件事:
1、切圖、初始狀態(tài)(正常順序)
2、處理圖片 放大、縮小到合適位置
根據(jù)上一篇講的算法,我們需要將圖片進(jìn)行分割,然后生成一個切好圖后的Items集合,當(dāng)然,還要對要拼圖的圖片進(jìn)行下大小的處理,因為我們除了有默認(rèn)的圖片,還可以自定義圖片
圖片工具類完成后,接下來我們就要在一個工具類中實現(xiàn)這些算法,同時還要做一些對游戲的封裝:
可以看到,游戲工具類中,我們主要有以下幾個功能:
1、判斷點(diǎn)擊的Item是否可移動:主要難點(diǎn)是判斷需要分同行與不同行,否則會出現(xiàn)上一行的最后一個和本行的第一個可以移動的BUG
2、交換空格與點(diǎn)擊Item的位置:實際上是交換GridView中的某2個Item的背景
3、生成隨機(jī)的Item:根據(jù)上一篇講的算法,打隨機(jī)打亂分割后的圖片
4、判斷是否拼圖成功:根據(jù)上一篇講的算法的結(jié)論判斷
5、判斷該數(shù)據(jù)是否有解:根據(jù)上一篇講的算法的結(jié)論判斷
6、計算倒置和算法:算法的核心注意要踢出空格
到目前為止,我們的準(zhǔn)備工作就基本結(jié)束了,很多人可能會說開始的時候準(zhǔn)備這么多干嘛,其實這是我真實的思考順序,剛開始項目的時候,一定要先把項目整體規(guī)劃一下,而不是上手就做,當(dāng)你有了一個清晰的思路后,coding只是一個體力活而已。所以,工欲善其事,必先利其器,畫竹需要成竹在胸。
ps : 需要源碼的朋友請留言。
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請
點(diǎn)擊舉報。