zoukankan      html  css  js  c++  java
  • java飞机大战之子弹的自动生成

    import java.awt.Graphics;
    import java.util.ArrayList;
    
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    
    public class PlaneMain extends JPanel {
    
        public static void main(String[] args) {
            new PlaneMain();
        }
    
        private ArrayList<View> list;
    
        public PlaneMain() {
            list = new ArrayList<View>();
            View background = new View("background.jpg", 0, -60, 700, 460, 2, this);
            list.add(background);
            initUI();
        }
    
        private void initUI() {
            JFrame frame = new JFrame("飞机大战");
            frame.setSize(700, 400);
            frame.setDefaultCloseOperation(3);
            frame.setLocationRelativeTo(null);
            frame.setResizable(false);
    
            frame.add(this);
    
            frame.setVisible(true);
    
            AddListener al = new AddListener(this, list);
    
            this.addMouseListener(al);
    
            Thread t = new Thread(al);
            t.start();// 启动线程
        }
    
        /**
         * 重写JPanel的重绘方法
         */
        public void paint(Graphics g) {
            super.paint(g);
    
            for (int i = 0; i < list.size(); i++) {
                View v = list.get(i);
                g.drawImage(v.getBackground(), v.getX(), v.getY(), v.getWidth(),
                        v.getHeight(), this);
            }
        }
    
    }
    import java.awt.Image;
    import java.util.ArrayList;
    
    import javax.swing.ImageIcon;
    import javax.swing.JPanel;
    
    public class View {
    
        private Image background;
        private int x = 0, y = -60, moveY, width, height;
        private JPanel panel;
        private String imageName;
        private boolean flag;
        /**
         * 构造方法
         * 
         * @param background背景图片的对象
         * @param x起始X坐标
         * @param y起始Y坐标
         */
        public View(String imageName, int x, int y, int width, int height,
                int moveY, JPanel panel) {
            this.imageName = imageName;
            this.background = new ImageIcon(this.getClass().getResource(imageName))
                    .getImage();
            this.x = x;
            this.y = y;
            this.width = width;
            this.height = height;
            this.moveY = moveY;
            this.panel = panel;
        }
        /**
         * 构造方法
         * 
         * @param background背景图片的对象
         * @param x起始X坐标
         * @param y起始Y坐标
         */
        public View(String imageName, int x, int y, int width, int height,
                int moveY, JPanel panel, boolean flag) {
            this.imageName = imageName;
            this.background = new ImageIcon(this.getClass().getResource(imageName))
                    .getImage();
            this.x = x;
            this.y = y;
            this.width = width;
            this.height = height;
            this.moveY = moveY;
            this.panel = panel;
            this.flag = flag;
        }
    
        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 Image getBackground() {
            return background;
        }
    
        public void setBackground(Image background) {
            this.background = background;
        }
    
        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 getMoveY() {
            return moveY;
        }
    
        public void setMoveY(int moveY) {
            this.moveY = moveY;
        }
    
        public JPanel getPanel() {
            return panel;
        }
    
        public void setPanel(JPanel panel) {
            this.panel = panel;
        }
    
        public void move(ArrayList<View> list) {
            if (imageName.equals("background.jpg")) {
                y += moveY;
                if (y == 0)
                    y = -60;
            } else if (imageName.equals("bullet.png")) {
                if (flag) {//地方的子弹
                    y += moveY;
                    if (y >= 400)
                        y = 0;
                }else {
                    y -= moveY;
                    if (y <= 0)
                        list.remove(this);
                }
            } else if (imageName.equals("plane.jpg")) {
                y -= moveY;
                if (y <= 0)
                    y = 400;
            }
        }
    
        /**
         * 碰撞方法
         */
        public void collisions(ArrayList<View> list) {
            for (int i = 1; i < list.size(); i++) {
                View v = list.get(i);
                if (this != v) {
                    double distance = Math.sqrt((this.x - v.x) * (this.x - v.x)
                            + Math.pow(this.y - v.y, 2));
                    if (distance <= this.height + v.height) {
                        System.out.println(v.imageName + "和" + this.imageName
                                + "发生了碰撞");
                    }
                }
            }
        }
    
    }
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import java.util.ArrayList;
    import java.util.Timer;
    
    import javax.swing.JPanel;
    
    public class AddListener extends MouseAdapter implements Runnable {
    
        private int count = 0;
    
        private JPanel panel;
        private ArrayList<View> list;
    
        public AddListener(JPanel panel, ArrayList<View> list) {
            this.panel = panel;
            this.list = list;
        }
    
        public void mouseReleased(MouseEvent e) {
            if (count == 0) {
                View plane = new View("plane.jpg", e.getX(), e.getY(), 50, 50, 3,
                        panel, false);
                list.add(plane);
    
                //实例化定时任务类的对象(任务对象)
                BulletAI task = new BulletAI(panel, list, plane);
                //创建时间类的对象
                Timer timer = new Timer();
                //启动任务,第一次执行时在2秒之后,之后每一次执行都间隔2秒
                timer.schedule(task, 2000, 2000);
                
                //timer.cancel();//取消时间对象中所有定时任务
                
                //bai.start();
                count++;
            } else {
                View bullet = new View("bullet.png", e.getX(), e.getY(), 10, 20, 5,
                        panel, true);
                list.add(bullet);
            }
        }
    
        public void run() {
            while (true) {
                for (int i = 0; i < list.size(); i++) {
                    View v = list.get(i);
                    v.move(list);
                    if (i != 0)
                        v.collisions(list);
                }
    
                panel.repaint();
    
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
    
            }
        }
    
    }
    import java.util.ArrayList;
    import java.util.TimerTask;
    
    import javax.swing.JPanel;
    
    public class BulletAI extends TimerTask { // Thread {
    
        private JPanel panel;// 绘制飞机和子弹的面板对象
        private ArrayList<View> list;// 存储飞机和子弹的数组队列
        private View plane;// 发生子弹的飞机对象
    
        public BulletAI(JPanel panel, ArrayList<View> list, View plane) {
            this.panel = panel;
            this.list = list;
            this.plane = plane;
        }
    
        public void run() {
            //
            // try {
            // Thread.sleep(2000);
            // } catch (InterruptedException e1) {
            // e1.printStackTrace();
            // }
            //
            // while (true) {
            View v = new View("bullet.png", plane.getX(), plane.getY(), 10, 20, 5,
                    panel, false);// 最后一个参数false表示的是我方飞机发射的子弹
    
            list.add(v);
    
            // try {
            // Thread.sleep(1000);
            // } catch (InterruptedException e) {
            // e.printStackTrace();
            // }
            //
            // }
        }
    
    }

    1.如何自动生成子弹
    使用线程来控制子弹的生成。
    BulletAI.java

    2.Java的定时任务
    TimerTask implements Runnable
    Timer
    启动定时任务

  • 相关阅读:
    等宽字体的妙用-loading 点点点动画
    BFC块级格式上下文介绍
    css3 HSLA 颜色制造半透明效果
    css reset 代码
    CSS 文本截断方案
    CSS BEM 命名方式
    盒模型里的滚动条算什么?
    CSS 权重图
    纯 css column 布局实现瀑布流效果
    mysql 重新整理——sql 执行语句的顺序[五]
  • 原文地址:https://www.cnblogs.com/chang1203/p/5863165.html
Copyright © 2011-2022 走看看