瘋狂連連看之開發遊戲介面元件

broadviewbj發表於2011-07-15

 

GameView主要就是根據遊戲的狀態資料來繪製介面上的方塊,GameView繼承了View元件,重寫了View元件上onDraw(Canvas canvas)方法,重寫該方法主要就是繪製遊戲裡剩餘的方塊;除此之外,它還會負責繪製連線方塊的連線線。

GamaView的程式碼如下。

程式清單:codes\18\Link\src\org\crazyit\link\view\GameView.java

public class GameView extends View

{

     // 遊戲邏輯的實現類

     private GameService gameService;          //

     // 儲存當前已經被選中的方塊

     private Piece selectedPiece;

     // 連線資訊物件

     private LinkInfo linkInfo;

     private Paint paint;

     // 選中標識的圖片物件

     private Bitmap selectImage;

     public GameView(Context context, AttributeSet attrs)

     {

          super(context, attrs);

          this.paint = new Paint();

          // 設定連線線的顏色

          this.paint.setColor(Color.RED);

          // 設定連線線的粗細

          this.paint.setStrokeWidth(3);

          this.selectImage = ImageUtil.getSelectImage(context);

     }

     public void setLinkInfo(LinkInfo linkInfo)

     {

          this.linkInfo = linkInfo;

     }

     public void setGameService(GameService gameService)

     {

          this.gameService = gameService;

     }

     @Override

     protected void onDraw(Canvas canvas)

     {

          super.onDraw(canvas);

          if (this.gameService == null)

               return;

          Piece[][] pieces = gameService.getPieces();            //

          if (pieces != null)

          {

               // 遍歷pieces二維陣列

               for (int i = 0; i < pieces.length; i++)

               {

                    for (int j = 0; j < pieces[i].length; j++)

                    {

                          // 如果二維陣列中該元素不為空(即有方塊),將這個方塊的圖片畫出來

                          if (pieces[i][j] != null)

                          {

                               // 得到這個Piece物件

                               Piece piece = pieces[i][j];

                               // 根據方塊左上角XY座標繪製方塊

                               canvas.drawBitmap(piece.getImage().getImage(),

                                 piece.getBeginX(), piece.getBeginY(), null);

                          }

                    }

               }

          }

          // 如果當前物件中有linkInfo物件, 即連線資訊

          if (this.linkInfo != null)

          {

               // 繪製連線線

               drawLine(this.linkInfo, canvas);

               // 處理完後清空linkInfo物件

               this.linkInfo = null;

          }

          // 畫選中標識的圖片

          if (this.selectedPiece != null)

          {

               canvas.drawBitmap(this.selectImage, this.selectedPiece.
                 
getBeginX(),

                    this.selectedPiece.getBeginY(), null);

          }

     }

     // 根據LinkInfo繪製連線線的方法

     private void drawLine(LinkInfo linkInfo, Canvas canvas)

     {

          // 獲取LinkInfo中封裝的所有連線點

          List points = linkInfo.getLinkPoints();

          // 依次遍歷linkInfo中的每個連線點

          for (int i = 0; i < points.size() - 1; i++)

          {

               // 獲取當前連線點與下一個連線點

               Point currentPoint = points.get(i);

               Point nextPoint = points.get(i + 1);

               // 繪製連線

               canvas.drawLine(currentPoint.x, currentPoint.y,

                    nextPoint.x, nextPoint.y, this.paint);

          }

     }

     // 設定當前選中方塊的方法

     public void setSelectedPiece(Piece piece)

     {

          this.selectedPiece = piece;

     }

     // 開始遊戲方法

     public void startGame()

     {

          this.gameService.start();

          this.postInvalidate();

     }

}

上面的GameView中第一段粗體字程式碼用於根據遊戲的狀態資料來繪製介面中的所有方塊,第二段粗體字程式碼則用於根據LinkInfo來繪製兩個方塊之間的連線線。

上面的程式中①號程式碼處定義了GameService物件,②號程式碼則呼叫了GameServicegetPieces()方法來獲取遊戲中剩餘的方塊,GameService是遊戲的業務邏輯實現類。後面會詳細介紹該類的實現,此處暫不講解。

瘋狂連連看之開發遊戲介面元件 

本文節選自《瘋狂Android講義(CD光碟1)》一書。

圖書詳細資訊:http://space.itpub.net/?uid-13164110-action-viewspace-itemid-702318

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/13164110/viewspace-702320/,如需轉載,請註明出處,否則將追究法律責任。

相關文章