飞机大战

微信经典飞机大战是微信5.0推出的一款手机游戏,该游戏在的画面并非美轮美奂,功能上也并非十分高大上,整个游戏的复杂程度可谓“简单得可怕”。但是,游戏支持用户与微信(QQ)好友进行分数对比,大大的满足玩家的攀比心理,因此,微信经典飞机大战在国内牵起浪潮——全名打飞机。
       简单得说一下游戏的玩法:玩家的任务是控制一部飞机,消灭敌方飞机,尽可能的取得更高的分数。
游戏资源(各个图片以及声音效果)的加载就不再累述。

一、首先来一个开发结果图:
飞机大战_第1张图片

二、游戏场景类的设计:
游戏场景(GameScene)是游戏的主体部分,包括了游戏中所有的元素:
(1)      我方飞机
(2)      敌方飞机
(3)      子弹
(4)      炸药包
(5)      背景
(6)      声音
游戏场景控制的操作:
(1)      飞机、炸药包、子弹的生成
(2)      各种碰撞的检测
(3)      使用炸弹
(4)      分数的实时统计
(5)      拖动屏幕,我方飞机的移动
(6)      背景的移动

三、创建各个类
       1.    创建敌机类(Enemy)
      敌方飞机分为三种(大中小),分别对应的血量(blood)、分值(score)、速度(speed)均不一样。同时我们定义了一个变量(IsPass)判断敌机飞过屏幕下端,以方便在游戏场景层遍历所有敌机。
      我们利用PhysicsHandle处理敌机飞行问题,不同种类的敌方飞机以不同的速度向屏幕的下端匀速飞行。
请看下面代码:
  1. public Enemy(float pX, float pY, StringpTextureRegionName,int type,
  2.                      VertexBufferObjectManagerpVertexBufferObjectManager) {
  3.               super(pX,pY, pTextureRegionName, pVertexBufferObjectManager);
  4.               this.type=type;
  5. this.IsPass=false;
  6.               switch(type) {
  7.               case 0 :
  8.                      this.blood= 25;
  9.                      this.Score=100;
  10.                      this.speed=300;
  11.                      break;
  12.               case 1:
  13.                      this.blood= 100;
  14.                      this.Score=500;
  15.                      this.speed=200;
  16.                      break;
  17.               case 2:
  18.                      this.blood= 300;
  19.                      this.Score=2000;
  20.                      this.speed=150;
  21.                      break;
  22.               }

  23.               mPhysicsHandler= new PhysicsHandler(this);
  24.               this.registerUpdateHandler(mPhysicsHandler);
  25.               //设置移动方向以及速度
  26.               mPhysicsHandler.setVelocityY(this.speed);              
  27.        }

  28.        /**
  29.         * 停止移动
  30.         */
  31.        public voidstopMove(){
  32.               this.unregisterUpdateHandler(mPhysicsHandler);
  33. }
复制代码
       2.    创建子弹类(Bullet)
      子弹分为两种,一种是普通子弹(一倍伤害),一种是高效子弹(两倍伤害),定义两个变量记录子弹是否超出屏幕上端(IsPass)以及子弹是否已经击中飞机(IsHit)。
      同样的,我们用PhysicsHandle处理子弹飞行问题,所有子弹以相同速度向屏幕的上端匀速飞行。
请看代码:
  1. public Bullet(float pX, float pY, String pTextureRegionName,inttype,
  2.                      VertexBufferObjectManagerpVertexBufferObjectManager) {
  3.               super(pX,pY, pTextureRegionName, pVertexBufferObjectManager);
  4.               this.type=type;
  5.               mPhysicsHandler= new PhysicsHandler(this);
  6.               this.registerUpdateHandler(mPhysicsHandler);
  7.               //设置移动方向以及速度
  8.               mPhysicsHandler.setVelocityY(-450);        
  9.        }

  10.        /**
  11.         * 停止移动
  12.         */
  13.        public voidstopMove(){
  14.               this.unregisterUpdateHandler(mPhysicsHandler);
  15.        }
复制代码
       3.    创建炸药包类(BoomBulletPackage)
       炸药包分为两种,一种是高效子弹炸药包,飞机“吃”后可以在一定时间内发出高效炮弹。另一种是炸弹包,飞机“吃”后可以点击按钮使用炸弹,一次将屏幕上所有敌机消灭掉,注意炸弹上线是3。同样的,我们设定一个变量记录炸药包是否飞出屏幕
请看下面代码:
  1. public BoomBulletPackage(float pX, float pY, StringpTextureRegionName,int type,
  2.                      VertexBufferObjectManagerpVertexBufferObjectManager) {
  3.               super(pX,pY, pTextureRegionName, pVertexBufferObjectManager);                        
  4.               this.setPass(false);
  5.               this.type=type;
  6.               mPhysicsHandler= new PhysicsHandler(this);
  7.               this.registerUpdateHandler(mPhysicsHandler);
  8.               //设置移动方向以及速度
  9.               mPhysicsHandler.setVelocityY(80);           
  10.        }
  11.        /**
  12.         * 停止移动
  13.         */
  14.        public voidstopMove(){
  15.               this.unregisterUpdateHandler(mPhysicsHandler);
  16.        }
复制代码
       4.    创建游戏结束类(OverLayer)
       当玩家的飞机碰撞到任意一架敌机,游戏失败,进入游戏结束层。游戏结束层包含了一个游戏结束提示图,以及重新开始游戏按钮。
设置onClick函数监听按钮是否被点击。
请看下面代码:
  1. private ButtonSprite startBtn;
  2.        public OverLayer(floatpWidth, float pHeight, Scene pScene) {
  3.               super(pWidth,pHeight, pScene);
  4.               pVertexBufferObjectManager= getVertexBufferObjectManager();
  5.               initView();
  6.        }
  7.        private voidinitView() {

  8.               gameOverTip= new AnimatedSprite(0, 150, Res.GAME_OVER, pVertexBufferObjectManager);
  9.               gameOverTip.setCentrePositionX(this.getCentreX());
  10.               this.attachChild(gameOverTip);        

  11.               startBtn =new ButtonSprite(0, 250, Res.GAME_START, pVertexBufferObjectManager);
  12.               startBtn.setCentrePositionX(this.getCentreX());
  13.               startBtn.setIgnoreTouch(false);
  14.               startBtn.setOnClickListener(this);
  15.               this.attachChild(startBtn);

  16.        }

  17.        @Override
  18.        public voidonClick(ButtonSprite pButtonSprite, float pTouchAreaLocalX,
  19.                      floatpTouchAreaLocalY) {
  20.               if(pButtonSprite== startBtn){
  21.                      ((GameScene)getScene()).restartGame();
  22.               }

  23.        }
复制代码

四、游戏场景类的编写
         1.    不急,首先添加各个变量的声明先。
  1.        //敌机列表
  2.        private List<Enemy> EnemyList;
  3.        //子弹列表
  4.        privateList<Bullet> BulletList;
  5.        //弹药包列表
  6.        privateList<BoomBulletPackage> packageList;
  7.        //当前分数
  8.        private intcurrScore;
  9.        //当前得分文本
  10.        private TexttCurrScore;
  11.        //暂停按钮
  12.        private ButtonSpritepause;
  13.        //使用炸弹按钮
  14.        privateButtonSprite useBomb;
  15.        //当前炸弹数
  16.        private intcurrBombNum;
  17.        //当前炸弹数文本
  18.        private TexttCurrBombNum;
  19.        //敌机生成注册表        
  20.        privateTimerHandler mTimerHandler_enemy;
  21.        //子弹生成注册表
  22.        privateTimerHandler mTimerHandler_bullet_creat;
  23.        //子弹变换注册表
  24.        privateTimerHandler mTimerHandler_bullet_change;
  25.        //炸药包生成注册表
  26.        privateTimerHandler mTimerHandler_package_creat;
  27.        //敌机生成时间
  28.        private floatpTimerSeconds_enemy = 2.0f;
  29.        //子弹生成时间
  30.        private floatpTimerSeconds_bullet_create = 0.2f;
  31.        //强效子弹持续时间
  32.        private floatpTimerSeconds_bullet_change = 10.0f;
  33.        //弹药包生成时间
  34.        private floatpTimerSeconds_package_creat = 20.0f;
  35.        //按概率生成敌机
  36.        private intenemyChance; 
  37.        // 游戏结束层
  38.        private OverLayermOverLayer;
  39.        //子弹种类
  40.        private intbullet_type=0;
  41.        //我方飞机精灵
  42.        AnimatedSpritemyPlane;
  43.        //第一背景精灵
  44.        AnimatedSpritegame_bg_1;
  45.        //第二背景精灵
  46.        AnimatedSpritegame_bg_2;
  47.        //屏幕滑动监听
  48.        SurfaceScrollDetectormScrollDetector;
  49.        //背景移动速度
  50.        float bg_speed = 120;
复制代码
           2.    初始化GameSence类。
          主要完成如下工作,①加载各个图片、文字、按钮精灵、游戏结束层至游戏场景层。②初始化各个列表。③注册各个handle。
  1. @Override
  2.        public voidonSceneCreate(SceneBundle bundle) {
  3.               super.onSceneCreate(bundle);
  4.               this.setIgnoreTouch(false);
  5.               mScrollDetector= new SurfaceScrollDetector(this);

  6.               this.setWidth(this.getCameraWidth());
  7.               this.setHeight(this.getCameraHeight());

  8.               this.EnemyList= new ArrayList<Enemy>();
  9.               this.BulletList=new ArrayList<Bullet>();
  10.               this.packageList=newArrayList<BoomBulletPackage>();            

  11.               initTimerHander();
  12.               initView();
  13.               this.registerUpdateHandler(updateHandler);
  14.               this.registerUpdateHandler(mTimerHandler_bullet_creat);
  15.               this.registerUpdateHandler(mTimerHandler_package_creat);
  16.               this.registerUpdateHandler(mTimerHandler_enemy);
  17.        }

  18. private void initView() {

  19.               game_bg_1= new AnimatedSprite(0, 0, Res.BG,
  20.               getVertexBufferObjectManager());
  21.               game_bg_1.setRightPositionX(this.getRightX());
  22.               game_bg_1.setBottomPositionY(this.getBottomY());
  23.               this.attachChild(game_bg_1);

  24.               game_bg_2= new AnimatedSprite(0, 0, Res.BG,
  25.               getVertexBufferObjectManager());
  26.               game_bg_2.setRightPositionX(this.getRightX());
  27.               game_bg_2.setBottomPositionY(this.getTopY()+10);
  28.               this.attachChild(game_bg_2);

  29.               myPlane = newAnimatedSprite(200, 500, Res.PLANE,
  30.                             getVertexBufferObjectManager());
  31.               this.attachChild(myPlane);

  32.               tCurrScore= new Text(0, 20, FontRes.getFont(ConstantUtil.FONT_SCORE_NUM), "0",9, getVertexBufferObjectManager());
  33.               tCurrScore.setCentrePositionX(this.getCentreX());
  34.               tCurrScore.setColor(0,0,0);
  35.               currScore=0;
  36.               this.attachChild(tCurrScore);

  37.               tCurrBombNum= new Text(100,0,FontRes.getFont(ConstantUtil.FONT_SCORE_NUM), "0",9, getVertexBufferObjectManager());
  38.               tCurrBombNum.setBottomPositionY(this.getBottomY()-20);
  39.               currBombNum=0;
  40.               this.attachChild(tCurrBombNum);

  41.               pause=newButtonSprite(0, 0, Res.STOP, getVertexBufferObjectManager());
  42.               pause.setTopPositionY(this.getTopY()+20);
  43.               pause.setIgnoreTouch(false);
  44.               pause.setOnClickListener(onClickListener);
  45.               this.attachChild(pause);

  46.               useBomb=newButtonSprite(0,0,Res.BT_BOMB,getVertexBufferObjectManager());
  47.               useBomb.setBottomPositionY(this.getBottomY()-20);
  48.               useBomb.setIgnoreTouch(false);
  49.               useBomb.setOnClickListener(onClickListener);
  50.               this.attachChild(useBomb);

  51.               mOverLayer= new OverLayer(this.getCameraWidth(), this.getCameraHeight(), this);

  52.               MusicRes.playMusic(ConstantUtil.SOUND_GAME_MUSIC,true);  
  53.        }
复制代码
           3.    定义各个timerhandle。
           由上可知,一共有4个TimeHandle等待我们定义。
代码如下:
  1. private void initTimerHander() {

  2.               // TODOAuto-generated method stub
  3.               mTimerHandler_enemy= new TimerHandler(pTimerSeconds_enemy, true,
  4.                             newITimerCallback() {
  5.                                    @Override
  6.                                    publicvoid onTimePassed(TimerHandler pTimerHandler) {

  7.                                           enemyChance=(int)(Math.random()*50);
  8.                                           intpX = new Random().nextInt(480);
  9.                                           if(0 <=enemyChance && enemyChance <20)
  10.                                                  createEnemy((int)(pX%(431)+25), 0);
  11.                                           elseif (20 <=enemyChance && enemyChance <40)
  12.                                                  createEnemy((int)(pX%(411)+35), 1);
  13.                                           else
  14.                                                  createEnemy((int)(pX%(396)+85), 2);
  15.                                    }
  16.                             });
  17.               mTimerHandler_bullet_creat= new TimerHandler(pTimerSeconds_bullet_create, true,
  18.                             newITimerCallback() {

  19.                                    @Override
  20.                                    public voidonTimePassed(TimerHandler pTimerHandler) {

  21.                                           createBullet();
  22.                                    }     
  23.                             });

  24.               mTimerHandler_bullet_change= new TimerHandler(pTimerSeconds_bullet_change, false,
  25.                             newITimerCallback() {

  26.                                    @Override
  27.                                    publicvoid onTimePassed(TimerHandler pTimerHandler) {
  28.                                           bullet_type=0;                                                                                  
  29.                                    }     
  30.                             });

  31.               mTimerHandler_package_creat= new TimerHandler(pTimerSeconds_package_creat, true,
  32.                             newITimerCallback() {

  33.                                    @Override
  34.                                    publicvoid onTimePassed(TimerHandler pTimerHandler) {
  35.                                           creatPackage();                                                                                 
  36.                                    }                                 
  37.                             });

  38.        }
复制代码
           4.    上述的注册时间表对应的函数:
           包括四个函数:敌机按概率论生成、子弹生成、弹药包生成。
代码如下:
  1. private void createEnemy(int pX,int type) {
  2.               float pY =0;
  3.               Enemyenemy = null;
  4.               switch(type) {
  5.                      case0:
  6.                             enemy= new Enemy(pX, pY, Res.SENEMY, 0,
  7.                                           getVertexBufferObjectManager());
  8.                             enemy.setType(0);
  9.                             enemy.setPass(false);
  10.                             break;

  11.                      case1:
  12.                             enemy= new Enemy(pX, pY, Res.MENEMY, 1,
  13.                                           getVertexBufferObjectManager());
  14.                             enemy.setType(1);
  15.                             enemy.setPass(false);
  16.                             break;
  17.                      case2:
  18.                             enemy= new Enemy(pX, pY, Res.BENEMY, 2,
  19.                                           getVertexBufferObjectManager());
  20.                             enemy.setType(2);
  21.                             enemy.setPass(false);
  22.                             break;
  23.               }

  24.               this.attachChild(enemy);

  25.               EnemyList.add(enemy);      

  26.        }
复制代码
            5.    实现滑动屏幕使得我方飞机位置移动。
           利用onScroll方法使得屏幕能够监听滑动,并且得出滑动距离,最终计算出飞机最终位置。
代码如下:
  1. @Override
  2.        public voidonScroll(ScrollDetector pScollDetector, int pPointerID,
  3.                      floatpDistanceX, float pDistanceY) {
  4.               myPlane.setPosition(myPlane.getX()+pDistanceX,myPlane.getY()+pDistanceY);
  5.               //边界检测,如果滑动到屏幕外边则飞机移动到边界
  6.               if(myPlane.getRightX()>this.getWidth())
  7.                      myPlane.setRightPositionX(this.getWidth());
  8.               if(myPlane.getLeftX()<0)
  9.                      myPlane.setLeftPositionX(0);
  10.               if(myPlane.getTopY()<0)
  11.                      myPlane.setTopPositionY(0);
  12.               if(myPlane.getBottomY()>this.getHeight())
  13.                      myPlane.setBottomPositionY(this.getHeight());            
  14.        }
复制代码
           6.    定义UpdateHandle,检测界面
           该handle主要负责如下工作:背景移动、碰撞检测、越界检测。
           (1)  背景移动
                  背景移动的原理是初始时两张相同的背景图片上下相连(屏幕显示下边图片),然后将两张图片以同样速度向下移动,如果检测到上边             的图片已经完全在屏幕中,那么将两张图片移回至初始位置。
                  在UpdateHandle直接调用bgmove(pSecondsElapsed);
                  下面是背景移动函数的定义:
  1. private void bgmove(floatpSecondsElapsed) {
  2.         game_bg_1.setPositionY(game_bg_1.getY()+bg_speed*pSecondsElapsed);
  3.         game_bg_2.setPositionY(game_bg_2.getY()+bg_speed*pSecondsElapsed);
  4.         if(game_bg_1.getTopY()>=this.getBottomY()){
  5.                game_bg_1.setBottomPositionY(this.getBottomY());
  6.                game_bg_2.setBottomPositionY(this.getTopY()+10);
  7.         }
  8. }
复制代码
           (2) 碰撞检测
                     碰撞一共分为三种:①我机与炸药包发生碰撞(吃掉炸药包)。②我机与敌机发生碰撞。③敌机与子弹发生碰撞。
                          ①      遍历整个炸药包列表,                                  如果我机与炸药包列表中元素发生碰撞,则认为吃掉炸药包。注意下面代码并不完整,必须与②、③、④、⑤按顺序整合才                               可以运行。
代码如下:
  1. /** 弹药包碰撞检测 **/
  2.                for(inti=0;i<packageList.size();i++) {
  3.                       boombulletpackageSprite= packageList.get(i);
  4.                       if(myPlane.collidesWith(boombulletpackageSprite)){
  5.                              switch(boombulletpackageSprite.getType()){
  6.                                     case0:                                             
  7.                                      SoundRes.playSound(ConstantUtil.SOUND_GET_DOUBLE_LASER);
  8. //高效弹药包
  9.                                            bullet_type=1;                                               
  10.                                            mTimerHandler_bullet_change.reset();
  11.                                            registerUpdateHandler(mTimerHandler_bullet_change); 
  12.                                            break;
  13.                                     case1:
  14.                                            SoundRes.playSound(ConstantUtil.SOUND_GET_BOMB);
  15. //炸弹包,炸弹的最高上限为3
  16.                                            if(currBombNum < 3)
  17.                                                   currBombNum++;
  18.                                            tCurrBombNum.setText(currBombNum+"");                                       
  19.                                            break;
  20.                              }
  21.                              //删除吃掉的炸药包
  22.                              detachChild(boombulletpackageSprite);
  23.                              packageList.remove(i);
  24.                       }
  25.                }
复制代码
                          ②      我机与敌机发生碰撞
                           遍历整个敌机列表,如果有敌机与我机发生碰撞,那么游戏失败,跳转至游戏结束层。
  1. /** 敌机与我机碰撞检测以及子弹与敌机的碰撞检测**/
  2.                for(inti=0;i<EnemyList.size();i++) {
  3.                       enemySprite=EnemyList.get(i);
  4.                       if(!enemySprite.IsPass()){
  5.                              if(myPlane.collidesWith(enemySprite)){
  6.                                     PlaneBoom(myPlane,1);
  7.                                     PlaneBoom(enemySprite,2);                                                                                    
  8.                                     EnemyList.remove(i);
  9.                                     enemySprite.PlaySound();  
  10.                                     SoundRes.playSound(ConstantUtil.SOUND_GAME_OVER);

  11.                                     unregisterUpdateHandler(mTimerHandler_enemy);
  12.                                     unregisterUpdateHandler(mTimerHandler_package_creat);
  13.                                     unregisterUpdateHandler(mTimerHandler_bullet_creat);      

  14.                                     if(!mOverLayer.hasParent()){
  15.                                            attachChild(mOverLayer);
  16.                                     }                                        

  17.                                     i--;//下一架敌机已经移动到列表第i个位置

  18.                                     //已经碰撞的飞机不在做子弹碰撞检测与边界检测                              
  19.                                     continue;
  20.                              }
  21.                       }
复制代码
                      ③      敌机与子弹发生碰撞
                            遍历敌机列表(上面已经进行),遍历子弹列表,一旦子弹与敌机发生碰撞,则消除子弹,并且降低敌机的生命值。如果飞机生                         命值低于0则消除飞机。
代码如下:
  1. for (int j=0;j<BulletList.size();j++) {
  2.                              bulletSprite= BulletList.get(j);
  3.                              if(!bulletSprite.IsPass()&& !bulletSprite.IsHit()) {
  4.                                     if(bulletSprite.collidesWith(enemySprite)){
  5.                                            bulletSprite.setHit(true);
  6.                                            detachChild(bulletSprite);
  7.                                            bulletSprite.dispose(); 
  8.                                            BulletList.remove(j);
  9.                                            j--;//下一颗子弹已经移动到第j个位置
  10.                                            switch(bulletSprite.getType()) {
  11.                                                   case0:
  12.                                                    enemySprite.setBlood(enemySprite.getBlood()-25);
  13.                                                          break;
  14.                                                   case1:
  15.                                                    enemySprite.setBlood(enemySprite.getBlood()-50);
  16.                                                          break;
  17.                                            }                                               
  18.                                            if(enemySprite.getBlood()<=0){
  19.                                                   updateScore(enemySprite.getScore());
  20.                                                   PlaneBoom(enemySprite,2);
  21.                                                   enemySprite.PlaySound();
  22.                                                   EnemyList.remove(i);
  23.                                                   i--;//下一架飞机已经移动到第i个位置
  24.                                            }
  25.                                     }
复制代码
          (3)越界检测
                  越界是指飞行物已经飞离了屏幕显示区域,对这些元素我们要在器列表中删除其位置,并且在屏幕不再显示。分为两种情况:④子弹越             界⑤敌机越界
                    ④      子弹越界  
  1.   //已经碰撞的子弹不在做边界检测
  2.                                     if(bulletSprite.IsHit())
  3.                                            continue;                                          
  4.                                     //没有碰撞的子弹做碰撞检测
  5.                                     if(bulletSprite.getBottomY()<0){
  6.                                            bulletSprite.setPass(true);
  7.                                            detachChild(bulletSprite);
  8.                                            bulletSprite.dispose(); 
  9.                                            BulletList.remove(j);
  10.                                            j--;//下一颗子弹已经移动到第j个位置
  11.                                     }
复制代码
                    ⑤      飞机越界                  
  1. //已经爆炸的飞机不在做边界检测
  2.                       if(enemySprite.getBlood()<=0)
  3.                              continue;

  4.                       //将移出了下边镜头的敌方飞机删除
  5.                       if(enemySprite.getBottomY() > getCameraHeight()) {
  6.                              enemySprite.setPass(true);
  7.                              detachChild(enemySprite);
  8.                              enemySprite.dispose();       
  9.                              EnemyList.remove(i);
  10.                              i--;//下一架飞机已经移动到第i个位置
  11.                       }
复制代码
         7.      爆炸处理
                飞机爆炸时,必须播放爆炸效果,在爆炸结束后将飞机从场景类中删除或者隐藏。具体代码如下:
  1. <p style="text-indent: 2em;">private void PlaneBoom (final AnimatedSprite Plane,finalint type) {</p>
  2. <p style="text-indent: 2em;">       Plane.animate(100,false, new IAnimationListener(){</p>
  3.               @Override
  4. <p style="text-indent: 2em;">              publicvoid onAnimationFinished(AnimatedSprite arg0) {</p><p style="text-indent: 2em;">                     //TODO Auto-generated method stub</p><p style="text-indent: 2em;">                     if(type==2){</p>                            //敌机爆炸
  5.                             detachChild(Plane);
  6.                             Plane.dispose();    
  7.                             Plane.setVisible(false);                      
  8.                      }
  9. <p style="text-indent: 2em;">                     else{</p>                            //我机爆炸
  10.                             Plane.setVisible(false);
  11.                      }
  12.               }

  13.               @Override
  14. <p style="text-indent: 2em;">              publicvoid onAnimationFrameChanged(AnimatedSprite arg0, int arg1,</p><p style="text-indent: 2em;">                            intarg2) {</p><p style="text-indent: 2em;">                     //TODO Auto-generated method stub</p>
  15.               }

  16.               @Override
  17. <p style="text-indent: 2em;">              publicvoid onAnimationLoopFinished(AnimatedSprite arg0, int arg1,</p><p style="text-indent: 2em;">                            intarg2) {</p><p style="text-indent: 2em;">                     //TODO Auto-generated method stub</p>
  18.               }

  19.               @Override
  20. <p style="text-indent: 2em;">              publicvoid onAnimationStarted(AnimatedSprite arg0, int arg1) {</p><p style="text-indent: 2em;">                     //TODO Auto-generated method stub</p>
  21.               }});        
  22.        }
复制代码
            8.    重新开始游戏。
            如果在结束层点击了重新开始按钮,则重新开启游戏。重新开启游戏时必须将分数等信息重置。
代码如下:
  1. public void restartGame() {

  2.               SoundRes.playSound(ConstantUtil.SOUND_COUNTDOWN);
  3.               this.registerUpdateHandler(mTimerHandler_bullet_creat);
  4.               this.registerUpdateHandler(mTimerHandler_package_creat);
  5.               this.registerUpdateHandler(mTimerHandler_enemy);

  6.               myPlane.setVisible(true);;
  7.               this.detachChild(mOverLayer);
  8.               this.currScore= 0;
  9.               updateScore(currScore);
  10.               this.currBombNum= 0;
  11.               this.bullet_type=0;
  12.               tCurrBombNum.setText(currBombNum+"");
  13.               this.myPlane.stopAnimation(0);        

  14.               //清空原先敌机
  15.               for (Enemyenemy : EnemyList) {
  16.                      enemy.detachSelf();
  17.                      enemy.dispose();
  18.               }
  19.               this.EnemyList.clear();                      

  20.               // 播放音效
  21.               MusicRes.playMusic(ConstantUtil.SOUND_GAME_MUSIC,true);
  22.        }
复制代码
            9.    使用炸弹
                  当点击炸弹按钮时候,必须将敌机列表中所有飞机删除,并且播放敌机爆炸效果。具体代码如下:
  1. private void usebomb() {
  2.               SoundRes.playSound(ConstantUtil.SOUND_USE_BOMB);
  3.               EnemyenemySprite_boom = null;
  4.               for(inti=0;i<EnemyList.size();i++) {
  5.                      enemySprite_boom= EnemyList.get(i);
  6.                      PlaneBoom(enemySprite_boom,2);         
  7.                      updateScore(enemySprite_boom.getScore());
  8.                      EnemyList.remove(i);  
  9.                      i--;//下一架飞机已经移动到列表的第i个位置
  10.               }
  11.        }     
复制代码
             10.  退出游戏提示框以及使用炸弹
                   当点击暂停按钮,以及点击手机回退键,屏幕将会弹出退出游戏提示框。当点击使用炸弹按钮,调用usebomb函数,使用炸弹
具体代码:
  1. private OnClickListener onClickListener = newOnClickListener() {

  2.                       @Override
  3.                       publicvoid onClick(ButtonSprite pButtonSprite, float pTouchAreaLocalX,
  4.                                     floatpTouchAreaLocalY) {
  5.                              if(pButtonSprite == pause) {
  6.                                     //点击了帮助按钮
  7.                                     showDialog();
  8.                              }
  9.                              elseif(pButtonSprite == useBomb) {
  10.                                     //点击使用炸弹按钮
  11.                                     if(currBombNum>0) {
  12.                                            currBombNum--;
  13.                                            tCurrBombNum.setText(currBombNum+"");
  14.                                            usebomb();
  15.                                     }                                        
  16.                              }
  17.                              else
  18.                                     ;             
  19.                       }
  20.                      };

  21. //退出游戏提示框
  22. private voidshowDialog() {
  23.         getActivity().runOnUiThread(newRunnable() {

  24.                @Override
  25.                publicvoid run() {

  26.                       newAlertDialog.Builder(getActivity())
  27.                                     .setTitle("退出游戏")
  28.                                     .setMessage("是否要退出游戏!")
  29.                                     .setPositiveButton("确定",
  30.                                                   newDialogInterface.OnClickListener() {
  31.                                                          @Override
  32.                                                          publicvoid onClick(DialogInterface dialog,
  33.                                                                        intwhich) {
  34.                                                                 SoundRes.playSound(ConstantUtil.SOUND_BUTTON);
  35.                                                                 getActivity().finish();
  36.                                                                 System.exit(0);
  37.                                                          }
  38.                                                   }).setNegativeButton("取消",null).show();
  39.                }
  40.         });
  41. }

  42. @Override
  43. public booleanonKeyDown(int keyCode, KeyEvent event) {
  44.         if(keyCode ==KeyEvent.KEYCODE_BACK){
  45.                showDialog();
  46.                returntrue;
  47.         }
  48.         returnsuper.onKeyDown(keyCode, event);
  49.        }
复制代码


呼,讲解就到这里,详情请看代码~

你可能感兴趣的:(android,手机游戏)