目录
  • 整体思路
  • 代码实现
    • 英雄战机类
    • 敌机类
    • 子弹类
    • 图片工具类
    • 游戏窗体类
    • 启动游戏类
  • 运行效果图

    本文实例为大家分享了java实现简易飞机大战的具体代码,供大家参考,具体内容如下

    整体思路

    1.创建游戏窗体,添加面板JPanel,重写JPanel中的paint方法,遍历所有飞机和子弹绘制,用定时器进行重绘,实现动画效果
    2.添加敌机和发射子弹用的是多线程
    3.碰撞检测采用的是矩形类Rectangle中的intersects方法

    代码实现

    用手机查看代码好像只显示62行

    英雄战机类

    package com.cml.model;
    
    import java.awt.Graphics;
    import java.awt.Image;
    import java.awt.event.MouseEvent;
    import java.util.ArrayList;
    
    import com.cml.util.ImageUtil;
    
    public class Hero {
        private int x, y;// 坐标
        private int width, height;    //宽高
        private Image heroImage; // 图片
        private boolean isAlive = true;
        private ArrayList<Bullet> bullets = new ArrayList<>();
        public Hero() {
            this.x = 180;
            this.y = 600;
            this.heroImage = ImageUtil.hero;
            width = heroImage.getWidth(null);
            height = heroImage.getHeight(null);
            initBullets();
        }
        private void initBullets() {
            //用线程发射子弹
            new Thread() {
                @Override
                public void run() {
                    while (isAlive) {
                        bullets.add(new Bullet(Hero.this));
                        try {
                            sleep(200);
                        } catch (InterruptedException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                    }
                }
            }.start();
        }
    
        public Hero(int x, int y, Image heroImage) {
            super();
            this.x = x;
            this.y = y;
            this.heroImage = heroImage;
        }
    
        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 Image getHeroImage() {
            return heroImage;
        }
    
        public void setHeroImage(Image heroImage) {
            this.heroImage = heroImage;
        }
    
        //绘制英雄战机
        public void paint(Graphics g) {
            if (!isAlive) {
                heroImage = ImageUtil.hero_destory;
            }
            g.drawImage(heroImage, x, y, null);
            for (int i = 0; i < bullets.size(); i++) {
                Bullet bullet = bullets.get(i);
                if (bullet.getY() < 0) {
                    bullets.remove(bullet);
                }
                bullet.paint(g);
            }
        }
    
        public int getWidth() {
            return width;
        }
    
        public void setWidth(int width) {
            this.width = width;
        }
    
        public int getHeight() {
            return height;
        }
    
        public void setHeight(int height) {
            this.height = height;
        }
    
        //鼠标拖拽移动
        public void mouseDragged(MouseEvent e) {
            if (isAlive) {
                int x0 = e.getX();
                int y0 = e.getY();
                if (isInScopePanel(x0, y0)) {
                    if (isInScopeImageWidth(x0) && isInScopeImageheigth(y0)) {
                        this.x = x0 - width / 2;
                        this.y = y0 - height / 2;
                    }
                } else {
                    if (isInScopeImageWidth(x0)) {
                        this.x = x0 - width / 2;
                    }
                    if (isInScopeImageheigth(y0)) {
                        this.y = y0 - height / 2;
                    }
                }
    
            }
            
        }
    
        private boolean isInScopePanel(int x0, int y0) {
            if (x0 > 10 && x0 < 460 && y0 > 140 && y0 < 730) {
                return true;
            }
            return false;
        }
    
        private boolean isInScopeImageheigth(int y0) {
            if (y0 >= y && y0 <= y + height) {
                if (y0 > 140 && y0 < 730) {
                    return true;
                }
            }
            return false;
        }
    
        private boolean isInScopeImageWidth(int x0) {
            if (x0 >= x && x0<= x + width) {
                if (x0 > 10 && x0 < 460) {
                    return true;
                }
            }
            return false;
        }
        public ArrayList<Bullet> getBullets() {
            return bullets;
        }
        public void setAlive(boolean isAlive) {
            this.isAlive = isAlive;
        }
        public boolean isAlive() {
            return isAlive;
        }
    }

    敌机类

    package com.cml.model;
    
    import java.awt.Graphics;
    import java.awt.Image;
    import java.util.Random;
    
    import com.cml.util.ImageUtil;
    
    public class Enemy {
        private Random random = new Random();
    
        private int x, y;// 坐标
        private int width, height; // 宽高
        private boolean isAlive = true;
        private static final int SPEED = 4;
        private Image enemyImage; // 图片
    
        public Enemy() {
            RandomEnemyXY();
            enemyImage = ImageUtil.enemy;
            width = enemyImage.getWidth(null);
            height = enemyImage.getHeight(null);
        }
    
        private void RandomEnemyXY() {
            x = random.nextInt(430);
            y = 0;
        }
    
        public void paint(Graphics g) {
            if (!isAlive) {
                enemyImage = ImageUtil.bomb;
            }
            g.drawImage(enemyImage, x, y, null);
            move();
        }
    
        public boolean isAlive() {
            return isAlive;
        }
    
        public void setAlive(boolean isAlive) {
            this.isAlive = isAlive;
        }
    
        private void move() {
            if (isAlive) {
                y += SPEED;
            }
            
        }
    
        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 int getWidth() {
            return width;
        }
    
        public void setWidth(int width) {
            this.width = width;
        }
    
        public int getHeight() {
            return height;
        }
    
        public void setHeight(int height) {
            this.height = height;
        }
    }

    子弹类

    package com.cml.model;
    
    import java.awt.Graphics;
    import java.awt.Image;
    
    import com.cml.util.ImageUtil;
    
    public class Bullet {
        private int x, y;// 坐标
        private int width, height; // 宽高
        private static final int SPEED = 10; // 速度
        private Image bulletImage; // 图片
    
        public Bullet(Hero hero) {
            bulletImage = ImageUtil.bullet;
            width = bulletImage.getWidth(null);
            height = bulletImage.getHeight(null);
            this.x = hero.getX() + hero.getWidth() / 2 - width / 2;
            this.y = hero.getY();
        }
    
        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 int getWidth() {
            return width;
        }
    
        public void setWidth(int width) {
            this.width = width;
        }
    
        public int getHeight() {
            return height;
        }
    
        public void setHeight(int height) {
            this.height = height;
        }
    
        public void paint(Graphics g) {
            g.drawImage(bulletImage, x, y, null);
            move();
        }
    
        private void move() {
            y -= SPEED;
        }
    }

    图片工具类

    package com.cml.util;
    
    import java.awt.image.BufferedImage;
    import java.io.IOException;
    
    import javax.imageio.ImageIO;
    
    public class ImageUtil {
        public static BufferedImage hero;
        public static BufferedImage enemy;
        public static BufferedImage bullet;
        public static BufferedImage bg;
        public static BufferedImage bomb;
        public static BufferedImage hero_destory;
        public static BufferedImage login;
        
        static {
            try {
                hero = ImageIO.read(ImageUtil.class.getResource("/img/hero.png"));
                enemy = ImageIO.read(ImageUtil.class.getResource("/img/enemy.png"));
                bullet = ImageIO.read(ImageUtil.class.getResource("/img/bullet.png"));
                bg = ImageIO.read(ImageUtil.class.getResource("/img/bg.png"));
                bomb = ImageIO.read(ImageUtil.class.getResource("/img/bomb.png"));
                hero_destory = ImageIO.read(ImageUtil.class.getResource("/img/hero_destory.png"));
    //            login = ImageIO.read(new File("img/login.png"));
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

    游戏窗体类

    package com.cml.frame;
    
    import java.awt.Font;
    import java.awt.Graphics;
    import java.awt.Rectangle;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import java.util.ArrayList;
    import java.util.Timer;
    import java.util.TimerTask;
    
    import javax.swing.JFrame;
    import javax.swing.JOptionPane;
    import javax.swing.JPanel;
    
    import com.cml.model.Bullet;
    import com.cml.model.Enemy;
    import com.cml.model.Hero;
    import com.cml.util.ImageUtil;
    import com.sun.java.swing.plaf.windows.resources.windows;
    
    public class GameFrame extends JFrame {
    
        private JPanel gamePanel;
    
        private Hero hero;
        private ArrayList<Enemy> enemies = new ArrayList<Enemy>();
        private ArrayList<Bullet> hero_bullet;
        private Timer timer;
    
        public GameFrame() {
            // 初始化游戏窗体
            initGameFrame();
            // 初始化英雄战机
            initHero();
            // 初始化游戏面板
            initGamePanel();
            // 初始化定时器
            initTimer();
            // 初始化敌军战机
            initEnemies();
        }
    
        private void initEnemies() {
            new Thread() {
                @Override
                public void run() {
                    while (true) {
                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                        enemies.add(new Enemy());
                    }
    
                }
            }.start();
    
        }
    
        private void initTimer() {
            timer = new Timer();
            TimerTask task = new TimerTask() {
    
                @Override
                public void run() {
                    gamePanel.repaint();
                }
            };
            timer.scheduleAtFixedRate(task, 0, 20);
        }
    
        private void initHero() {
            hero = new Hero();
            hero_bullet = hero.getBullets();
        }
    
        private void initGameFrame() {
            setTitle("打飞机");
            setSize(480, 800);
            setLocationRelativeTo(null);
            setDefaultCloseOperation(EXIT_ON_CLOSE);
            setResizable(false);
        }
    
        private void initGamePanel() {
            gamePanel = new JPanel() {
                private int score = 0;
                /**
                 * 判断敌机与子弹相撞
                 * @param enemy
                 * @param bullet
                 * @return
                 */
                public boolean isHit(Enemy enemy, Bullet bullet) {
                    Rectangle r1 = new Rectangle(enemy.getX(), enemy.getY(), enemy.getWidth(), enemy.getHeight());
                    Rectangle r2 = new Rectangle(bullet.getX(), bullet.getY(), bullet.getWidth(), bullet.getHeight());
                    return r1.intersects(r2);
                }
                
                /**
                 * 判断英雄战机与敌机相撞
                 * @param enemy
                 * @param hero
                 * @return
                 */
                public boolean isHit(Enemy enemy, Hero hero) {
                    Rectangle r1 = new Rectangle(enemy.getX(), enemy.getY(), enemy.getWidth(), enemy.getHeight());
                    Rectangle r2 = new Rectangle(hero.getX() + hero.getWidth() / 3, hero.getY() + hero.getHeight() / 3,
                            hero.getWidth() / 3, hero.getHeight() / 3);
                    return r1.intersects(r2);
                }
    
                @Override
                public void paint(Graphics g) {
                    super.paint(g);
                    g.drawImage(ImageUtil.bg, 0, 0, 480, 800, null);
                    for (int i = 0; i < enemies.size(); i++) {
                        Enemy enemy = enemies.get(i);
                        for (int j = 0; j < hero_bullet.size(); j++) {
                            Bullet bullet = hero_bullet.get(j);
                            if (isHit(enemy, bullet) && enemy.isAlive()) {
                                enemy.setAlive(false);
                                hero_bullet.remove(bullet);
                                new Thread() {
                                    public void run() {
                                        score += 10;
                                        try {
                                            sleep(200);
                                        } catch (InterruptedException e) {
                                            // TODO Auto-generated catch block
                                            e.printStackTrace();
                                        }
                                        enemies.remove(enemy);
                                    };
                                }.start();
                                break;
                            }
                        }
                        if (isHit(enemy, hero)) {
                            timer.cancel();
                            hero.setAlive(false);
                            enemy.setAlive(false);
                            JOptionPane.showMessageDialog(this, "游戏结束,您的得分是:" + score);
                            System.exit(0);
                        }
                        if (enemy.getY() > 800) {
                            enemies.remove(enemy);
                        }
                        enemy.paint(g);
                    }
                    if (hero != null) {
                        hero.paint(g);
                    }
                    g.setFont(new Font("宋体", Font.BOLD, 24));
                    g.drawString("得分:" + score, 350, 30);
    
                }
            };
            add(gamePanel);
            // 设置拖拽监听事件
            gamePanel.addMouseMotionListener(new MouseAdapter() {
    
                @Override
                public void mouseDragged(MouseEvent e) {
                    if (hero != null) {
                        hero.mouseDragged(e);
                    }
                }
            });
        }
    
    }

    启动游戏类

    package com.cml.main;
    
    import com.cml.frame.GameFrame;
    
    public class Start {
    
        public static void main(String[] args) {
            /**
             * 初始化窗体
             */
            new GameFrame().setVisible(true);
        }
    }

    运行效果图

    java实现简易飞机大战

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

    声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。