Java版打飞机小游戏

放假写的一个Java端打飞机小游戏。

复习到的知识点有:java图形界面,多线程,集合框架等。

主要的收获是知道了处理图层的方式,即JLayeredPane层次面板,主要思路

如下:

1.        创建一个JLayeredPanel对象实例layeredPane,声明大小

2.        将背景图片的JPanel 放到图层layeredPane最底层

3.        将飞机,子弹的JPanel放到背景图片之上的图层

4.        调用JFrame的setLayeredPane()方法加入图层面板

可改进方向:

1.排行榜

2.计时计分系统

3.敌机子弹

= =感觉都有思路了就没搞了2333

游戏截图:



 
 



 

游戏实现类(含注释):

Java代码   收藏代码
  1. public class GameFrame extends JFrame implements KeyListener {  
  2.     // 我的飞机  
  3.     private MyPlane myplane = null;  
  4.       
  5.     //控制子弹线程  
  6.     private boolean flagBullet = true;  
  7.     //控制敌方飞机线程  
  8.     private boolean flagPlane = true;  
  9.     // 创建一个JLayeredPane用于分层的。  
  10.     JLayeredPane layeredPane;  
  11.     // 创建一个Panel和一个Label用于存放图片,作为背景。  
  12.     JPanel backgroundJp;  
  13.     JLabel backgroundJLabel;  
  14.     ImageIcon image;  
  15.       
  16.     public static GameFrame game;  
  17.       
  18.     //子弹作业  
  19.     ArrayList<Bullet> bullets ;  
  20.   
  21.     private static int x;  
  22.     private static int y;  
  23.       
  24.     public GameFrame() {  
  25.         game = this;  
  26.         //实例化子弹队列  
  27.         bullets = new ArrayList<>();  
  28.           
  29.         myplane = new MyPlane();  
  30.         myplane.setLocation(633550);  
  31.         //创建一个用来分层的  
  32.         layeredPane = new JLayeredPane();  
  33.         image = new ImageIcon("images/background2.jpg");// 随便找一张图就可以看到效果。  
  34.         // 创建背景的那些东西  
  35.         backgroundJp = new JPanel();  
  36.         backgroundJp.setBounds(00, image.getIconWidth(), image.getIconHeight());  
  37.   
  38.         backgroundJLabel = new JLabel(image);  
  39.         backgroundJp.add(backgroundJLabel);  
  40.   
  41.         // 将jp放到最底层。  
  42.         layeredPane.add(backgroundJp, JLayeredPane.DEFAULT_LAYER);  
  43.         // 将jb放到高一层的地方  
  44.         layeredPane.add(myplane, JLayeredPane.MODAL_LAYER);  
  45.        
  46.         this.setLayeredPane(layeredPane);  
  47.         this.setBounds(33,  01300700);    
  48.         this.addKeyListener(this);  
  49.         this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
  50.            
  51.         //图标  
  52.         this.setIconImage(new ImageIcon("images/bfire.png").getImage());  
  53.         //不可放大或缩小  
  54.         this.setResizable(false);  
  55.         this.setVisible(true);  
  56.         //子弹线程  
  57.         launch();  
  58.         // 敌机线程  
  59.         otherPlane();  
  60.     }  
  61.   
  62.     @Override  
  63.     public void keyTyped(KeyEvent e) {  
  64.            
  65.     }  
  66.   
  67.     @Override  
  68.     public void keyPressed(KeyEvent e) {  
  69.         //获得飞机位置  
  70.         if (myplane!= null) {  
  71.              x = myplane.getX();  
  72.              y = myplane.getY();  
  73.         }  
  74.            
  75.   
  76.         //每次移动大小  
  77.         int speed = 20;  
  78.         //根据不同指令执行命令  
  79.         if (e.getKeyChar() == 'W' || e.getKeyChar() == 'w') { // 上移  
  80.             y -= speed;  
  81.         } else if (e.getKeyChar() == 'S' || e.getKeyChar() == 's') { // 下移  
  82.             y += speed;  
  83.         } else if (e.getKeyChar() == 'A' || e.getKeyChar() == 'a') { // 左移  
  84.             x -= speed;  
  85.         } else if (e.getKeyChar() == 'D' || e.getKeyChar() == 'd') { // 右移  
  86.             x += speed;  
  87.         }  
  88.           
  89.         //设置活动范围  
  90.         if (x > -5 && x < Constant.windowx*2 - 165 && y > 0  
  91.                 && y < Constant.windowy*2 - 175) {  
  92.             if (myplane!=null) {  
  93.                 myplane.setLocation(x, y);  
  94.             }  
  95.            
  96.         }  
  97.         // repaint();  
  98.     }  
  99.   
  100.     @Override  
  101.     public void keyReleased(KeyEvent e) {  
  102.     }  
  103.       
  104.     // 开启子弹线程  
  105.         private void launch() {  
  106.             new Thread() {  
  107.                 @Override  
  108.                 public void run() {  
  109.                     //如果为true,则启动线程,否则关闭  
  110.                     while (flagBullet) {  
  111.                         // 给出现时的坐标加上一个值,调整位置  
  112.                         //以飞机坐标为参数,生成一个子弹对象  
  113.                         Bullet bullet = new Bullet(myplane.getX() + 52,  
  114.                                 myplane.getY() + 30, game);  
  115.                         // 将子弹加入面板  
  116.                         layeredPane.add(bullet, JLayeredPane.MODAL_LAYER);  
  117.                         // 添加进子弹列表  
  118.                         GameList.bulletList.add(bullet);  
  119.                         /*// 开始行动 
  120.                         弄个子弹队列 
  121.                         然后开个线程遍历队列 
  122.                         然后每个子弹的x 和 y都相加  
  123.                         每次重设每个子弹的位置 
  124.                         bullets.add(bullet); 
  125.                         for (int i = 0; i < bullets.size(); i++) { 
  126.                               
  127.                             int by = bullets.get(i).getY(); 
  128.                             int bx = bullets.get(i).getX(); 
  129.                             System.out.println("第"+i+"个子弹" + x +"and" + y); 
  130.                             bullets.get(i).setY(by-60); 
  131.                             bullets.get(i).setLocation(bx, by); 
  132.                              
  133.                             //判断这颗子弹是否打到某个敌机 
  134.                              GameList.intersectsBullet(bullets.get(i),game); 
  135.                               
  136.                             // 将子弹加入面板 
  137.                             layeredPane.add(bullet, JLayeredPane.POPUP_LAYER); 
  138.                                 // 如果出了界面,就跳出循环,不再执行 
  139.                                 if (by < 0) { 
  140.                                     //该颗子弹已出了可见面板,从面板中移除,跳出循环 
  141.                                     layeredPane.remove(bullet); 
  142.                                      
  143.                                     //将子弹从列表中移除 
  144.                                     GameList.bulletList.remove(this); 
  145.                                     break; 
  146.                                 } 
  147.                         } 
  148.                         */  
  149.                         new Thread(bullet).start();  
  150.   
  151.                         // 每隔500毫秒发射一颗子弹  
  152.                         try {  
  153.                             Thread.sleep(300);  
  154.                         } catch (Exception e) {  
  155.                             e.printStackTrace();  
  156.                         }  
  157.                     }  
  158.                 }  
  159.             }.start();  
  160.         }  
  161.   
  162.   
  163.         /* 
  164.          * 启动敌机线程 
  165.          */  
  166.         private void otherPlane() {  
  167.             new Thread() {  
  168.                 @Override  
  169.                 public void run() {  
  170.                     //获得第一次出现敌机的时间  
  171.                     long firstTime = System.currentTimeMillis();  
  172.                     //一次最多存在number数量的敌机  
  173.                     int number = 5;  
  174.                     while (flagPlane) {  
  175.                         //获得当前时间  
  176.                         long currentTime = System.currentTimeMillis();  
  177.                         //每10秒多增加一架可以在界面上显示的敌机  
  178.                         if(currentTime - firstTime > 10000){  
  179.                             number ++;  
  180.                             //交换数据  
  181.                             firstTime = currentTime;  
  182.                         }  
  183.                         int size = GameList.planeList.size();  
  184.                         //如果list中的敌机数量小于总共可以在界面上显示的,则创建对象  
  185.                         if (size <= number) {  
  186.                             OtherPlane otherPlane = new OtherPlane(GameFrame.this);  
  187.                             //需要把该对象放到面板中去显示  
  188.                             layeredPane.add(otherPlane, JLayeredPane.MODAL_LAYER);  
  189.                             //加入list  
  190.                             GameList.planeList.add(otherPlane);  
  191.                             //启动,可以活动  
  192.                             new Thread(otherPlane).start();  
  193.   
  194.                             //没500毫秒生成一个  
  195.                             try {  
  196.                                 Thread.sleep(500);  
  197.                             } catch (Exception e) {  
  198.                                 e.printStackTrace();  
  199.                             }  
  200.                         }  
  201.                     }  
  202.                 }  
  203.             }.start();  
  204.         }  
  205.           
  206.   
  207.         // 返回MyPlane对象  
  208.         public MyPlane getMyPlane() {  
  209.             return myplane;  
  210.         }  
  211.         //将我方飞机的数据清除  
  212.         public void setMyPlane(MyPlane myplane){  
  213.             this.myplane = myplane;  
  214.         }  
  215.           
  216.         // 将子弹或者敌机从面板移除  
  217.         public void remove(Component c) {  
  218.             layeredPane.remove(c);  
  219.         }  
  220.   
  221.         //停止子弹线程  
  222.         public void setFlagBullet(boolean b) {  
  223.             this.flagBullet = b;  
  224.         }  
  225.   
  226.         //停止敌机线程  
  227.         public void setFlagPlane(boolean b) {  
  228.             this.flagPlane = b;  
  229.         }  
  230.   
  231. }  

 项目压缩包:

你可能感兴趣的:(打飞机,java游戏,打飞机小游戏,JavaGui编程)