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 ArrayListlist; public PlaneMain() { list = new ArrayList (); 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(ArrayListlist) { 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 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 ArrayListlist; public AddListener(JPanel panel, ArrayList 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 ArrayListlist;// 存储飞机和子弹的数组队列 private View plane;// 发生子弹的飞机对象 public BulletAI(JPanel panel, ArrayList 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
启动定时任务