⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 enemy.java

📁 一款Java开发的打飞机小游戏
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
import java.util.Random;
import java.util.Vector;

/**
 * 敌机类(这里将普通敌机和Boss进行统一处理)
 * @author  fantasyer
 * @version 1.0
 */
class Enemy implements Cloneable, Comparable
{
    //敌机属性信息

    //相对地图大背景的y坐标(用于控制飞机在整个大地图的绝对坐标)
    int startY;
    //x坐标、y坐标、x方向速度、y方向速度、运动类型、开火方式、分值、类型
    int x, y, xspeed, yspeed, movetype, firetype, life, kind;
    //图片的宽度、高度、发射子弹的概率、产生奖品的概率
    int width, height, bulletSeed, awardSeed;
    //是否显示、是否死亡
    boolean isVisible, isDead;
    //用于控制随机开火方式
    static Random r = new Random();
    //计算飞机的运动角度
    double angle;
    //飞机左右运动的摆幅、控制飞机摆动的方向、保存飞机初始的x值y值
    int dis, dir, basex, basey;
    //重要Boss使用,不同的step发生不同的子弹
    int step;

    /**
     * 设置飞机的属性,这里的9个属性和关卡文件完全一致
     * @param startY     相对整张背景地图的Y坐标
     * @param x          相对屏幕的x坐标
     * @param y          相对屏幕的y坐标
     * @param xspeed     x方向的速度
     * @param yspeed     y方向的速度
     * @param movetype   运动类型
     * @param firetype   开火类型
     * @param life       生命值
     * @param kind       飞机类型
     */
    Enemy(int startY, int x, int y, int xspeed, int yspeed, int movetype,
          int firetype, int life, int kind)
    {
        this.startY = startY;
        this.x = x;
        this.y = y;
        this.xspeed = xspeed;
        this.yspeed = yspeed;
        this.movetype = movetype;
        this.firetype = firetype;
        this.life = life;
        this.kind = kind;
        this.bulletSeed = 20; //1/20的方式
        setAwardSeed();
        isVisible = false;
        isDead = false;
        angle = 0;
        dis = 0;
        dir = 1;
        basex = x;
        basey = y;
        width = height = Utility.getSize(kind);
    }

    /**
     * 控制敌机的运动,根据不同的类型,有不同的运动轨迹
     */
    public void move()
    {
        if (movetype==Utility.LINE_MOVE)            //直线向下运动
        {
            y += yspeed;
        }
        else if (movetype==Utility.LEFT_CURVE_MOVE) //左边抛物线
        {
            x -= xspeed;
            y = (basex-x)*(basex-x)/30;
        }
        else if (movetype==Utility.RIGHT_CURVE_MOVE) //右抛物线
        {
            x += xspeed;
            y = (x-basex)*(x-basex)/30;
        }
        else if (movetype==Utility.LEFT_RIGHT_MOVE) //左右摇摆,这里需要调整水平和垂直的速度
        {
            dis = 30; //摆动幅度
            x += dir*3;
            if (x>(basex+dis)||x<(basex-dis)||x<0||x>Utility.GAME_WIDTH)
            {
                dir = -dir;
            }
            y += yspeed;
        }
        else if (movetype==Utility.CIRCLE_MOVE) //围绕中心的圆周运动,但效果不明显,圆半径60
        {
            x = basex+(int)(Math.sin(angle)*60);
            y = basey+(60-(int)(Math.cos(angle)*60));
            angle += 0.1; //可以调整角度变化量和圆的半径
        }
        else if (movetype==Utility.DOWN_LR_MOVE) //先向下然后左右
        {
            if (y<100)
            {
                //垂直下落
                y += yspeed;
            }
            else
            {
                //左右摇摆
                dis = 100; //Boss摆动的幅度大一些
                x += dir*3;
                if (x>(basex+dis)||x<(basex-dis)||x<0||x>Utility.GAME_WIDTH)
                {
                    dir = -dir;
                }
            }
        }
        else if (movetype==Utility.DOWN_CIRCLE_MOVE) //先下落然后圆周运动
        {
            y += yspeed;
            if (y>50)
            {
                basey = y;
                movetype = Utility.CIRCLE_MOVE;
            }
        }
    }

    /**
     * 返回发出的子弹
     * @return Object[]  发出的子弹数组
     */
    public Object[] getBullets()
    {
        Vector v = new Vector();
        if (kind==Utility.ENEMY_1)
        {
            v.add(new Bullet(x+width/2-4, y+height+3, 180, 10, 10,Utility.DOWN_MOVE, Utility.BULLET_1));
        }
        else if (kind==Utility.ENEMY_2)
        {
            v.add(new Bullet(x+width/2, y+height+3, 180, 20, 10,Utility.DOWN_MOVE, Utility.BULLET_1));
            v.add(new Bullet(x+width/2, y+height+3, 180, 20, 10,Utility.TARGET_MOVE, Utility.BULLET_1));
        }
        else if (kind==Utility.ENEMY_3)
        {
            v.add(new Bullet(x+width/2, y+height+3, 180, 20, 10,Utility.DOWN_MOVE, Utility.BULLET_1));
            v.add(new Bullet(x+width/2, y+height+3, 180, 20, 10,Utility.TARGET_MOVE, Utility.BULLET_1));
        }
        else if (kind==Utility.ENEMY_4)
        {
            v.add(new Bullet(x+width/4, y+height+3, 180, 20, 10,Utility.TARGET_MOVE, Utility.BULLET_1));
            v.add(new Bullet(x+width*3/4, y+height+3, 180, 20, 10,Utility.TARGET_MOVE, Utility.BULLET_1));
        }
        else if (kind==Utility.ENEMY_5)
        {
            v.add(new Bullet(x+width/2-4, y+height+3, 180, 20, 10,Utility.DOWN_MOVE, Utility.BULLET_1));
            v.add(new Bullet(x+width/2-4, y+height+3, 225, 20, 10,Utility.DOWN_MOVE, Utility.BULLET_1));
            v.add(new Bullet(x+width/2-4, y+height+3, 135, 20, 10,Utility.DOWN_MOVE, Utility.BULLET_1));
        }
        else if (kind==Utility.ENEMY_6)
        {
            for (int i = 0; i<20; i++)
            {
                v.add(new Bullet(x+width/2, y+height/2, i*18, 10, 10,Utility.DOWN_MOVE, Utility.BULLET_1));
            }
        }
        else if (kind==Utility.ENEMY_7)
        {
            v.add(new Bullet(x+width/2, y+height, 180, 20, 10,Utility.DOWN_MOVE, Utility.BULLET_1));
            v.add(new Bullet(x+width/2, y+height+15, 180, 20, 10,Utility.DOWN_MOVE, Utility.BULLET_1));
            v.add(new Bullet(x+width/2, y+height+30, 180, 20, 10,Utility.DOWN_MOVE, Utility.BULLET_1));
            v.add(new Bullet(x+width/2, y+height/2, 30, 15, 10,Utility.DOWN_MOVE, Utility.BULLET_1));
            v.add(new Bullet(x+width/2, y+height/2, 90, 15, 10,Utility.DOWN_MOVE, Utility.BULLET_1));
            v.add(new Bullet(x+width/2, y+height/2, 270, 15, 10,Utility.DOWN_MOVE, Utility.BULLET_1));
            v.add(new Bullet(x+width/2, y+height/2, 330, 15, 10,Utility.DOWN_MOVE, Utility.BULLET_1));
        }
        else if (kind==Utility.ENEMY_8)
        {
            for (int i = 0; i<7; i++)
            {
                v.add(new Bullet(x+width/2-4, y+height-10, 135+i*15, 20, 10,Utility.DOWN_MOVE, Utility.BULLET_1));
            }
        }
        else if (kind==Utility.BOSS_1||kind==Utility.BOSS_2||kind==Utility.BOSS_3||kind==Utility.BOSS_4)
        {
            return getBossBulltes(kind);
        }
        else
        {
            v.add(new Bullet(x+width/2-5, y+height+3, 180, 5, 10,Utility.DOWN_MOVE, Utility.BULLET_1));
        }

        return v.toArray();
    }

    /**
     * 返回Boss发出的子弹
     * @return Object[]  发出的子弹数组
     */
    public Object[] getBossBulltes(int kind)
    {
        Vector v = new Vector();

        if (kind==Utility.BOSS_1)
        {
            if (step==0)
            {
                for (int i = 0; i<6; i++)
                {
                    v.add(new Bullet(x+width/2, y+height-30+i*15, 180, 20, 10,Utility.DOWN_MOVE, Utility.BULLET_1)); //子弹类型可以改变
                }
                step++;
            }
            else if (step==1)
            {
                for (int i = 0; i<6; i++)
                {
                    v.add(new Bullet(x+width*3/8, y+height-30+i*15, 180, 20, 10,Utility.DOWN_MOVE, Utility.BULLET_1));
                    v.add(new Bullet(x+width*5/8, y+height-30+i*15, 180, 20, 10,Utility.DOWN_MOVE, Utility.BULLET_1));
                }
                step++;
            }
            else if (step==2)
            {
                for (int i = 0; i<7; i++)
                {
                    v.add(new Bullet(x+width*3/20, y+height-30+i*15, 180, 20,10, Utility.DOWN_MOVE, Utility.BULLET_1));
                    v.add(new Bullet(x+width*17/20, y+height-30+i*15, 180, 20,10, Utility.DOWN_MOVE, Utility.BULLET_1));
                    v.add(new Bullet(x+width*3/20+10, y+height-30+i*15, 180, 20,10, Utility.DOWN_MOVE, Utility.BULLET_1));
                    v.add(new Bullet(x+width*17/20-10, y+height-30+i*15, 180,20, 10, Utility.DOWN_MOVE,Utility.BULLET_1));
                }
                step = 0;
            }
        } //Boss1
        else if (kind==Utility.BOSS_2)
        {
            if (step==0)
            {
                for (int i = 0; i<8; i++)
                {
                    v.add(new Bullet(x+width/2, y+height-30+i*15, 180, 20, 10,Utility.DOWN_MOVE, Utility.BULLET_1)); //子弹类型可以改变
                }
                step++;
            }
            else if (step==1)
            {
                for (int i = 0; i<6; i++)
                {
                    v.add(new Bullet(x+width*2/5, y+height-30+i*15, 180, 20, 10,Utility.DOWN_MOVE, Utility.BULLET_1));
                    v.add(new Bullet(x+width*3/5-4, y+height-30+i*15, 180, 20,10, Utility.DOWN_MOVE, Utility.BULLET_1));
                    v.add(new Bullet(x+width*2/5, y+height-30+i*15, 180, 20, 10,Utility.DOWN_MOVE, Utility.BULLET_1));
                    v.add(new Bullet(x+width*3/5-4, y+height-30+i*15, 180, 20,10, Utility.DOWN_MOVE, Utility.BULLET_1));
                }
                step++;
            }
            else if (step==2)
            {
                v.add(new Bullet(x+width/2, y+height-30, 180, 20, 10,Utility.DOWN_MOVE, Utility.BULLET_1));
                for (int i = 1; i<=6; i++)
                {
                    v.add(new Bullet(x+width/2-i*10, y+height-30-5*i, 180+i*15,20, 10, Utility.DOWN_MOVE,Utility.BULLET_1));
                    v.add(new Bullet(x+width/2+i*10, y+height-30-5*i, 180-i*15, 20, 10, Utility.DOWN_MOVE,Utility.BULLET_1));
                }
                step = 0;
            }
        }
        else if (kind==Utility.BOSS_3)
        {
            step = r.nextInt(3);
            if (step==0)
            {
                for (int i = 0; i<8; i++)
                {
                    v.add(new Bullet(x+width/2-15, y+height-30+i*15, 180, 20, 0, Utility.DOWN_MOVE, Utility.BULLET_1)); //子弹类型可以改变
                    v.add(new Bullet(x+width/2+15, y+height-30+i*15, 180, 20, 10, Utility.DOWN_MOVE, Utility.BULLET_1)); //子弹类型可以改变
                    v.add(new Bullet(x+width/2-30, y+height-30+i*15, 180, 20, 10, Utility.DOWN_MOVE, Utility.BULLET_1));
                    v.add(new Bullet(x+width/2+30, y+height-30+i*15, 180, 20, 10, Utility.DOWN_MOVE, Utility.BULLET_1));
                }
            }
            else if (step==1)
            {
                v.add(new Bullet(x+width/2, y+height-30, 180, 10, 10,Utility.DOWN_MOVE, Utility.BULLET_1));
                for (int i = 1; i<=36; i++)
                {
                    v.add(new Bullet(x+width/2, y+height/2, i*10, 20, 10,Utility.DOWN_MOVE, Utility.BULLET_1));
                }
            }
            else if (step==2)
            {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -