美文网首页
JAVA飞机大战(四)

JAVA飞机大战(四)

作者: 包佳奇 | 来源:发表于2018-03-06 15:54 被阅读651次

    接着JAVA飞机大战(三)继续写.

    一、实现删除越界的敌人和子弹
    1.在Flyingobject父类定义抽象方法,检查是否越界

    public abstract boolean outOfBounds();
    

    2.Airplane,bee,bullet,Hero子类重写outOfBounds()抽象方法

    /** 重写outOfBounds()检查Airplane是否出界 */
        public boolean outOfBounds(){
            return this.y>=ShootGame.HEIGHT; //敌机的y>=窗口的高,即为越界了
        }
    
    /** 重写outOfBounds()检查bee是否出界 */
        public boolean outOfBounds(){
            return this.y>=ShootGame.HEIGHT; //小蜜蜂的y>=窗口的高,即为越界了
        }
    
        /** 重写outOfBounds()检查bullet是否出界 */
        public boolean outOfBounds(){
            return this.y<=-this.height; //子弹的y<=负的子弹的高,即为越界了
        }
    
        /** 重写outOfBounds()检查Hero是否出界 */
        public boolean outOfBounds(){
            return false; //永不越界
        }
    
    action(){
          run(){
            ...
            outOfBoundsAction(); //删除越界的
            repaint();
          }
        }
    

    4.outOfBoundsAction(){
    1)声明活着的数组
    2)遍历flyings/bullets数组
    判断对象是否不越界:
    若true:
    将对象添加到活着的数组中
    3)将活着的数组复制到flyings/bullets数组中
    }

    /** 删除越界的飞行物 */
        public void outOfBoundsAction(){ //10毫秒走一次
            int index = 0; //1)不越界敌人数组下标 2)不越界敌人个数
            FlyingObject[] flyingLives = new FlyingObject[flyings.length]; //不越界敌人数组
            for(int i=0;i<flyings.length;i++){ //遍历所有敌人
                FlyingObject f = flyings[i]; //获取每一个敌人
                if(!f.outOfBounds()){ //不越界
                    flyingLives[index] = f; //将不越界敌人对象保存到不越界敌人数组中
                    index++; //1)不越界敌人数组下标增一 2)不越界敌人个数增一
                }
            }
            flyings = Arrays.copyOf(flyingLives,index); //将不越界敌人数组复制到flyings中,flyings的新长度为index,即不越界敌人个数
            
            index = 0; //1)不越界子弹数组下标归零 2)不越界子弹个数归零
            Bullet[] bulletLives = new Bullet[bullets.length]; //不越界子弹数组
            for(int i=0;i<bullets.length;i++){ //遍历所有子弹
                Bullet b = bullets[i]; //获取每一个子弹
                if(!b.outOfBounds()){ //不越界
                    bulletLives[index] = b; //将不越界子弹对象保存到不越界子弹数组中
                    index++; //1)不越界子弹数组下标增一 2)不越界子弹个数增一
                }
            }
            bullets = Arrays.copyOf(bulletLives,index); //将不越界子弹数组复制到bullets中,bullets的新长度为index,即不越界子弹个数
            
        }
    

    二、子弹和敌人碰撞的实现
    1.检测敌人是否和子弹相撞

    class FlyingObject{ //敌人
      public boolean shootBy(Bullet obj){
        this:敌人
        obj:子弹
      }
    }
    

    或者

    class Bullet{ //子弹
      public boolean shoot(FlyingObject obj){
        this:子弹
        obj:敌人
      }
    }
    
    /** 检查敌人是否被子弹击中 this:敌人 bullet:子弹 */
        public boolean shootBy(Bullet bullet){
            int x1 = this.x;             //x1:敌人的x
            int x2 = this.x+this.width;  //x2:敌人的x+敌人的宽
            int y1 = this.y;             //y1:敌人的y
            int y2 = this.y+this.height; //y2:敌人的y+敌人的高
            int x = bullet.x;            //x:子弹的x
            int y = bullet.y;            //y:子弹的y
            
            return x>=x1 && x<=x2
                   &&
                   y>=y1 && y<=y2; //x在x1与x2之间,并且,y在y1与y2之间,即为撞上了
        }
    

    2.英雄机得火力和命

        /** 英雄机增火力 */
        public void addDoubleFire(){
            doubleFire+=40; //火力值增40
        }
        /** 英雄机增命 */
        public void addLife(){
            life++; //命数增1
        }
    

    3.在ShootGame类中检查子弹与敌机是否相撞

    action(){
          run(){
            ...
            bangAction(); //检查碰撞
            repaint();
          }
        }
    
    /** 所有子弹与所有敌人(敌机+小蜜蜂)的碰撞检测 */
        public void bangAction(){ //10毫秒走一次
            for(int i=0;i<bullets.length;i++){ //遍历所有子弹,将子弹传给bang()方法
                Bullet b = bullets[i]; //获取每一个子弹
                bang(b); //一个子弹与所有敌人(敌机+小蜜蜂)的碰撞检测
            }
        }
    
    /** 一个子弹与所有敌人(敌机+小蜜蜂)的碰撞检测 */
        public void bang(Bullet b){
            int index = -1; //被撞敌人的下标
            for(int i=0;i<flyings.length;i++){ //遍历所有敌人,获取每一个敌人f
                FlyingObject f = flyings[i]; //获取每一个敌人
                if(f.shootBy(b)){ //撞上了
                    index = i; //记录被撞敌人的下标
                    break; //其余敌人不再比较了
                }
            }
            if(index!=-1){ //撞上了
                FlyingObject one = flyings[index]; //获取被撞的敌人对象
    
                    }
    }
    

    4.在相撞的前提下判断是敌人还是奖励

    if(index!=-1){ //撞上了
                FlyingObject one = flyings[index]; //获取被撞的敌人对象
                if(one instanceof Enemy){ //若是敌人
                    Enemy e = (Enemy)one; //强转为敌人类型
                    score += e.getScore(); //玩家得分
                }
                if(one instanceof Award){ //若是奖励
                    Award a = (Award)one; //强转为奖励类型
                    int type = a.getType(); //获取奖励类型
                    switch(type){ //根据不同的奖励得到不同的奖励
                    case Award.DOUBLE_FIRE: //若类型为火力
                        hero.addDoubleFire(); //则英雄机增火力
                        break;
                    case Award.LIFE: //若类型为命
                        hero.addLife(); //则英雄机增命
                        break;
                    }
                }
    }
    

    5.把子弹打中的敌人移除(从flyings中删除)

        //将被撞的敌人与数组中的最后一个元素交换
                FlyingObject t = flyings[index];
                flyings[index] = flyings[flyings.length-1];
                flyings[flyings.length-1] = t;
                //缩容(去掉最后一个元素,即被撞的敌人对象)
                flyings = Arrays.copyOf(flyings,flyings.length-1);
    

    注:保证最后一个元素就是被撞的敌人

    相关文章

      网友评论

          本文标题:JAVA飞机大战(四)

          本文链接:https://www.haomeiwen.com/subject/kjulfftx.html