zoukankan      html  css  js  c++  java
  • 疯狂连连看之开发游戏界面组件

    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<Point> 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://www.cnblogs.com/broadview/archive/2011/07/15/2107603.html

  • 相关阅读:
    药方
    Git配置
    黄俊俊:做一个有想法的技术人
    刘铁猛:程序员:造阀门前,先蓄满‘情商池’
    Nginx + Tomcat 配置负载均衡集群简单实例
    mysql 用户权限管理详细
    mysql数据权限操作
    搭建分布式系统
    数据库 -- 悲观锁与乐观锁
    tomcat7以下线程控制
  • 原文地址:https://www.cnblogs.com/broadview/p/2107621.html
Copyright © 2011-2022 走看看