疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

android开发—连连看开发技巧(7)


 

android游戏开发之连连看(7)

以下代码接在上一篇文件《android开发—连连看开发技巧(6)》的后面

// 触碰游戏区域的处理方法

         private void gameViewTouchUp(MotionEvent e)

         {

                   this.gameView.postInvalidate();

         }

         // gameTime作为剩余时间开始或恢复游戏

         private void startGame(int gameTime)

         {

                   // 如果之前的timer还未取消,取消timer

                   if (this.timer != null)

                   {

                            stopTimer();

                   }

                   // 重新设置游戏时间

                   this.gameTime = gameTime;

                   // 如果游戏剩余时间与总游戏时间相等,即为重新开始新游戏

                   if(gameTime == GameConf.DEFAULT_TIME)

                   {

                            // 开始新的游戏游戏

                            gameView.startGame();

                   }

                   isPlaying = true;       

                   this.timer = new Timer();

                   // 启动计时器

                   this.timer.schedule(new TimerTask()

                   {

                            public void run()

                            {

                                     handler.sendEmptyMessage(0x123);

                            }

                   }, 0, 1000);

                   // 将选中方块设为null

                   this.selected = null;

         }

         /**

          * 成功连接后处理

          *

          * @param linkInfo 连接信息

          * @param prePiece 前一个选中方块

          * @param currentPiece 当前选择方块

          * @param pieces 系统中还剩的全部方块

          */

         private void handleSuccessLink(LinkInfo linkInfo, Piece prePiece,

                  Piece currentPiece, Piece[][] pieces)        //

         {

                   // 它们可以相连, GamePanel处理LinkInfo

                   this.gameView.setLinkInfo(linkInfo);

                   // gameView中的选中方块设为null

                   this.gameView.setSelectedPiece(null);

                   this.gameView.postInvalidate();

                   // 将两个Piece对象从数组中删除

                   pieces[prePiece.getIndexX()][prePiece.getIndexY()] = null;

                   pieces[currentPiece.getIndexX()][currentPiece.getIndexY()] = null;

                   // 将选中的方块设置null

                   this.selected = null;

                   // 手机振动(100毫秒)

                   this.vibrator.vibrate(100);

                   // 判断是否还有剩下的方块, 如果没有, 游戏胜利

                   if (!this.gameService.hasPieces())

                   {

                            // 游戏胜利

                            this.successDialog.show();

                            // 停止定时器

                            stopTimer();

                            // 更改游戏状态

                            isPlaying = false;

                   }

         }

         // 创建对话框的工具方法

         private AlertDialog.Builder createDialog(String title, String message,

                   int imageResource)

         {

                   return new AlertDialog.Builder(this).setTitle(title)

                            .setMessage(message).setIcon(imageResource);

         }

         private void stopTimer()

         {

                   // 停止定时器

                   this.timer.cancel();

                   this.timer = null;

         }

}

上面程序中的init()方法中粗体字代码负责为gameView组件的触碰事件绑定事件监听器,当用户触碰该区域时,事件监听器将会被触发;程序中①号粗体字代码定义的gameViewTouchDown方法负责处理触碰事件。它会根据先根据触碰点计算出触碰的方块,如上②号粗体字代码所示;接下来该方法会判断是否之前已有选中的方块:如果没有,直接将当前方块设为选中方块;如果有,判断两个方块是否可以相连,如上③号粗体字代码所示。

如果两个方块可以相连,程序将会从Piece[][]数组中删除这两个方块,该逻辑由上面程序中④号粗体字代码定义的handleSuccessLink()方法完成。

除此之外,该程序为了控制时间流逝,程序定义了一个计时器,该计时器会每隔1秒发送一条消息,程序将会根据该消息减少游戏的剩余时间。上面程序中startGame(int gameTime)方法内的粗体字代码负责启动计时器。该消息将会交给程序的Handler对象处理,如上面程序中开始部分的代码。

Link Activity用的两个类:

q  GameConf:负责管理游戏的初始化设置信息。

q  GameService:负责游戏的逻辑实现。

上面两个工具类中GameConf只是一个简单的设置类,此处不再给出介绍,读者自行参考光盘中的代码即可。(未完.摘自[疯狂Android讲义.李刚])