游戏创意投稿大赛-简单实现飞机大战

738 阅读3分钟

我正在参加掘金社区游戏创意投稿大赛个人赛,详情请看:游戏创意投稿大赛

前言

「游戏」创意 对于一名后端CURD程序员来说是比较陌生的,不是很擅长,但是我有想要一份奖励,思索许久,想到了初学java时,培训老师带领做的经典小游戏-【飞机大战】,那么这期就记录下飞机大战的开发过程吧。

设计思路:

1.创建游戏界面的JFrame窗体实现

2.创建战机类和子弹类,并将子弹始发点坐标定在战机坐标前面

3.创建敌机类。

4.判断敌机与子弹碰撞方法,即敌机被击中后消失,判断敌机与战机碰撞方法

总体开发思想

第一步创建JFrame窗体,设置大小

public class Game {
​
    public static void main(String[] args) {
        JFrame j = new JFrame(); //创建窗口
        j.setSize(400, 650);
        j.setTitle("PlaneWar"); //设置标题
        j.setLocationRelativeTo(null); //设置居中
        j.setDefaultCloseOperation(3); //默认关闭
        j.setVisible(true); //窗口可见性
​
    }
​
}
​

创建画布,设置背景图片

   //构造方法
    public GamePanel() {
        state=START;
        bx = 0;
        by = -5350;
        bg = new ImageIcon("src/images/background_1.png").getImage();
​
    }

创建战机类,定义x,y为战机坐标,并创建子弹,置于飞机前面,

List fires = new ArrayList();

public class Bullet {
​
    int x, y;
​
    //构造方法
    public Bullet(int a, int b) { //参数为英雄机坐标
​
        this.x=a;
        this.y=b;
​
    }
​
   
​
    //x,y的get和set方法
    public int getX() {
        return x;
    }
​
    public void setX(int x) {
        this.x = x;
    }
​
    public int getY() {
        return y;
    }
​
    public void setY(int y) {
        this.y = y;
    }
     //画子弹
    public void drawZd(Graphics g) {
        Image zd=new ImageIcon("src/images/bullet_7.png").getImage();
        g.drawImage(zd, x-19, y-80, null);
​
    }
}
​

创建敌机类,同战机类,随机x坐标,y不变,保证敌机固定在顶部生成。

public class Enemy {
    int x,y;
    String icon;
​
    public Enemy(String icon) { //参数为敌机图片路径
        this.icon=icon;
        x=(int)(Math.random()*360)+10; //随机生成x坐标
        y=-30;
    }
​
    //画敌机
    public void drawPlane(Graphics g) {
        Image plane=new ImageIcon(icon).getImage();
        g.drawImage(plane, x-15, y-15, null);
​
    }
​
}
​

判断子弹和敌机碰撞方法实现,获取子弹坐标和敌机中心坐标,判断是否相撞

public boolean Boom(Bullet z, Enemy d) {
        int zx, zy, dx, dy;
        boolean crash = false;
​
        //子弹坐标
        zx = z.getX();
        zy = z.getY();
​
        //敌机坐标
        dx = d.getX();
        dy = d.getY();
​
        if (dx < zx && zy - dy < 30 && dx + 30 > zx) {
            crash = true; //如果相撞返回真值
​
        }
        return crash;
​
    }

判断飞机与敌机相撞方法,获取英雄机中心坐标和敌机中心坐标.

  public boolean Boom2(Enemy d, int x, int y) {
        int dx, dy;
        boolean crash = false;
​
        //敌机坐标
        dx = d.getX();
        dy = d.getY();
​
        //英雄机坐标
        x = x - 50;
        y = y - 80;
​
        //相撞条件
        if (dx > x+20 && y - dy < 20 && dx < x + 60) {
            crash = true; //如果相撞返回真值
​
        }
        return crash;
​
    }

在画布类中增加监听鼠标移动方法,并设置生成子弹速度及敌机速度,用集合来存储子弹的对象,子弹的发射是从集合中调出对象,子弹的消失是从集合中删除相应的子弹对象,当子弹与敌机碰撞时删除子弹和敌机,当敌机与战机碰撞时,游戏结束

子弹的移动: 子弹图片在窗口中显示位置横纵坐标的改变

    List<Bullet> zd = new ArrayList<Bullet>(); //存储子弹对象
 重新MouseMotionListener 中的mouseMoved方法获取取鼠标的坐标值
    @Override
    public void mouseMoved(MouseEvent e) {
        x = e.getX(); //动态获取鼠标的坐标值
        y = e.getY();
​
    }
 // 子弹和敌机碰撞
                        Crash crash = new Crash();
                       for (int j = 0; j < zd.size(); j++) {
                            Bullet z = zd.get(j);
                            for (int i = 0; i < dj.size(); i++) {
                                Enemy d = dj.get(i);
                                if (crash.Boom(z, d)) { //调用Crash对象的Boom方法判断是否相撞
                                    score += 2; //分数加2
                                    dx = dj.get(i).getX(); //敌机坐标
                                    dy = dj.get(i).getY();
                                    db = true; //敌机爆炸
                                    dj.remove(i); //从集合中删除敌机
                                    zd.remove(j); //从集合中删除子弹
                                    break;
                                }
                            }
                        }
​
                        //判断飞机相撞
                        for (int i = 0; i < dj.size(); i++) {
                            Enemy d = dj.get(i);
                            if (crash.Boom2(d, x, y)) {
                                score += 2; //分数加2
                                dx = dj.get(i).getX();
                                dy = dj.get(i).getY();
                                db = true;
                                dj.remove(i); //从集合中删除敌机
​
                            }
                        }
                    }
​

好了,本文就给大家介绍到这里,感觉有帮助的,留下个赞或评论再走吧!谢啦~ 💐