飞机小游戏

 1 /**
 2  * 常量类
 3  * @author 罗摩衔那
 4  *
 5  */
 6 public class Constant {
 7      public static final int GAME_WIDTH=500;
 8      public static final int GAME_HEIGHT=500;
 9      
10 }
 1 import java.awt.Graphics;
 2 import java.awt.Image;
 3 
 4 public class Explode extends GameObject {
 5     double x, y;
 6       //声明一维静态数组长度
 7      static Image[]img=new Image[16];
 8      //用静态代码块加载数组图片
 9      static {
10          for (int i = 0; i < 16; i++) {
11             img[i]=GameUtil.getImage("images/explode/e"+(i+1)+".gif");
12             img[i].getWidth(null);
13         }
14      }
15      
16      int count;
17      /**
18       * 画出十六张图
19       */
20      public void draw(Graphics g) {
21          if(count<=15) {
22              g.drawImage(img[count], (int)x,(int) y, null);
23              count++;
24          }
25      }
26      public Explode(double x,double y) {
27          this.x=x;
28          this.y=y;
29      }
30 }
 1 import java.awt.Graphics;
 2 import java.awt.Image;
 3 
 4 public class GameObject {
 5         Image img;
 6         double x,y;//图像位置参数
 7         int speed;
 8         int width,height;
 9         
10         public void drawSelf(Graphics g) {
11             g.drawImage(img,(int) x,(int) y, null);
12         }
13 
14         public GameObject(Image img, double x, double y, int speed, int width, int height) {
15             super();
16             this.img = img;
17             this.x = x;
18             this.y = y;
19             this.speed = speed;
20             this.width = width;
21             this.height = height;
22         }
23 
24         public GameObject(Image img, double x, double y) {
25             super();
26             this.img = img;
27             this.x = x;
28             this.y = y;
29         }
30         
31         public GameObject() {
32         }       
33 }
 1 /**
 2  * 工具类实现图片的获取
 3  */
 4 import java.awt.Image;
 5 import java.awt.image.BufferedImage;
 6 import java.io.IOException;
 7 import java.net.URL;
 8 
 9 import javax.imageio.ImageIO;
10 
11 public class GameUtil {
12      //工具类最好将构造器私有化
13     private GameUtil() {
14         
15     }
16     
17     public static Image getImage(String path) {
18         BufferedImage bi=null;//图片缓存区为空
19         /**
20          *图片获取
21          */
22         try {
23             URL u=GameUtil.class.getClassLoader().getResource(path);
24             bi=ImageIO.read(u);
25         } catch (IOException e) {
26             e.printStackTrace();
27         }
28         return bi;
29     }
30 }
 1 /**
 2  * 飞机的图像自画
 3  */
 4 import java.awt.Graphics;
 5 import java.awt.Image;
 6 import java.awt.Rectangle;
 7 import java.awt.event.KeyEvent;
 8 
 9 public class Plane extends GameObject{
10        int speed=3;
11        boolean left,right,up,down;
12        boolean live=true;
13        
14       public void drawSelf(Graphics g) {
15         if(live) {//飞机若活着自画出
16               g.drawImage(img,(int) x,(int) y, null);//父类方法的重写
17               if(left) {
18                   x-=speed;
19               }
20               if(right) {
21                   x+=speed;
22               }
23               if(up) {
24                   y-=speed;
25               }
26               if(down) {
27                   y+=speed;
28               }
29         }else {
30             
31         }
32       }
33       
34       public Plane(Image img,double x,double y) {
35           this.img=img;
36           this.x=x;
37           this.y=y;
38           this.speed=3;
39           this.width=img.getWidth(null);
40           this.height=img.getHeight(null);
41       }
42       
43       //按下某个键,增加相应的方向
44       public void addDirection(KeyEvent e) {
45           switch(e.getKeyCode()) {
46           case KeyEvent.VK_LEFT:
47               left=true;
48               break;
49           case KeyEvent.VK_UP:
50               up=true;
51               break;
52           case KeyEvent.VK_RIGHT:
53               right=true;
54               break;
55           case KeyEvent.VK_DOWN:
56               down=true;
57               break;
58           }
59       }
60       //按下某个键,取消相应的方向
61         public  void   minusDirection(KeyEvent  e){
62             switch (e.getKeyCode()) {
63             case KeyEvent.VK_LEFT:
64                 left = false;
65                 break;
66             case KeyEvent.VK_UP:
67                 up = false;
68                 break;
69             case KeyEvent.VK_RIGHT:
70                 right = false;
71                 break;
72             case KeyEvent.VK_DOWN:
73                 down = false;
74                 break;
75             }
76         }
77       /**
78        * 返回物体所在的矩形.便于后续的碰撞检测
79        */
80       public Rectangle getRect() {
81           return new Rectangle((int)x,(int)y,width,height);
82       }
83 }
 1 import java.awt.Color;
 2 /**
 3  * 炮弹的设计及自画
 4  */
 5 import java.awt.Graphics;
 6 import java.awt.Image;
 7 import java.awt.Rectangle;
 8 
 9 public class Shell extends GameObject{
10      double degree;
11      
12      
13      
14     public Shell() {
15              x=200;
16              y=200;
17              width=10;//球的宽度
18              height=10;//球的高度
19              speed=3;//球的速度
20              degree=Math.random()*Math.PI*2;//生成随机的0~2π角度
21     }
22 
23 
24 
25     public  void draw(Graphics g) {
26         Color c=g.getColor();
27         g.setColor(Color.YELLOW);
28         
29         g.fillOval((int)x, (int)y, width, height);
30         
31         //炮弹沿着任意角度去飞
32         x+=speed*Math.cos(degree);
33         y+=speed*Math.sin(degree);
34         
35         if(x<0 || x>Constant.GAME_WIDTH-width)
36         {
37             degree=Math.PI-degree;
38         }
39         if(y<0 || y>Constant.GAME_HEIGHT-height)
40         {
41             degree=-degree;
42         }
43         
44         g.setColor(c);
45         
46     }
47 
48 
49 
50     public Rectangle getRect() {
51         
52         return new Rectangle((int)x,(int)y,width,height);
53     }
54 
55 }
  1 import java.awt.Color;
  2 import java.awt.Font;
  3 import java.awt.Frame;
  4 import java.awt.Graphics;
  5 import java.awt.Image;
  6 import java.awt.event.KeyAdapter;
  7 import java.awt.event.KeyEvent;
  8 import java.awt.event.WindowAdapter;
  9 import java.awt.event.WindowEvent;
 10 import java.util.Date;
 11 
 12 /**
 13  * 初始化窗口
 14  * @author 罗摩衔那
 15  *
 16  */
 17 public class MyGameFrame extends Frame{
 18      //图片加载
 19     Image bg=GameUtil.getImage("Image/bg.jpg");
 20     Image planeImg=GameUtil.getImage("Image/plane.png");
 21     Plane plane=new Plane(planeImg,250,250);//飞机对象的创建及构造参数的传入
 22     Shell[]s=new Shell[30];//定义了炮弹的个数
 23     Explode ex;//声明爆炸类对象
 24     Date startTime=new Date();//飞机开始时间
 25     Date endTime;//飞机死亡时间
 26     int time;//存活时间计数
 27     
 28     //图形的绘画
 29         public void paint(Graphics g) {
 30             Color c=g.getColor();
 31             g.drawImage(bg, 0, 0, null);
 32             plane.drawSelf(g);//调用飞机类的自画功能
 33             /*
 34              * 画出了炮弹的个数
 35              */
 36             for (int i = 0; i < s.length; i++) {
 37                 s[i].draw(g);
 38                 
 39                 //飞机和炮弹的碰撞检测
 40                 boolean peng=s[i].getRect().intersects(plane.getRect());
 41                     if(peng) {
 42                     plane.live=false;
 43                       if(ex==null) {//在飞机的坐标发生爆炸
 44                             ex=new Explode(plane.x, plane.y);
 45                             
 46                             endTime=new Date();
 47                            time=(int)((endTime.getTime()-startTime.getTime())/1000);
 48                         }
 49                      ex.draw(g);
 50                 }
 51                  if(!plane.live) {
 52                      g.setColor(Color.RED);
 53                      Font t=new Font("宋体", Font.BOLD, 50);
 54                      g.setFont(t);
 55                      g.drawString("时间:"+time+"秒" ,(int)plane.x, (int)plane.y);
 56                  }
 57              }
 58         }
 59         //反复的画窗口
 60         class PaintThread extends Thread{
 61             public void run() {
 62                 while(true) {
 63                     repaint();//重画
 64                     try {
 65                         Thread.sleep(40);
 66                     } catch (InterruptedException e) {
 67                         
 68                         e.printStackTrace();
 69                     }
 70                 }
 71             }
 72         }
 73         
 74         //定义键盘监听的内部类
 75         class KeyMonitor extends KeyAdapter{
 76 
 77             @Override
 78             public void keyPressed(KeyEvent e) {
 79                 
 80                 plane.addDirection(e);
 81             }
 82 
 83             @Override
 84             public void keyReleased(KeyEvent e) {
 85                 
 86                 plane.minusDirection(e);
 87             }
 88             
 89         }
 90        /**
 91         * 初始化窗口
 92         */
 93         public void Initialization () {
 94             this.setTitle("大应用最萌的程序狗子作品");//设置窗口标题
 95             this.setVisible(true);//设置可见窗口
 96             this.setSize(Constant.GAME_WIDTH, Constant.GAME_HEIGHT);//设置窗口大小
 97             this.setLocation(300, 300);//设置显示位置
 98             //设置监听事件
 99             this.addWindowListener(new WindowAdapter() {
100                 public void windowClosing(WindowEvent e) {
101                 System.exit(0);
102                 }
103             });
104             new PaintThread().start();//启动重画线程的方法
105             this.addKeyListener(new KeyMonitor());//增加键盘的监听
106             
107             
108             //初始化三十个炮弹的参数
109             for (int i = 0; i < s.length; i++) {
110                 s[i]=new Shell();
111             }
112             
113         }
114         public static void main(String[] args) {
115             MyGameFrame mg=new MyGameFrame();
116             mg.Initialization();
117     
118         }
119         /**
120          * 双缓冲 
121          */
122         private Image offScreenImage=null;
123         
124         public void update(Graphics g) {
125             if(offScreenImage==null)
126                 offScreenImage=this.createImage(Constant.GAME_WIDTH, Constant.GAME_HEIGHT);
127             
128             Graphics gOff=offScreenImage.getGraphics();//offScreenImage离屏图像
129             paint(gOff);
130             g.drawImage(offScreenImage, 0, 0, null);
131         }
132 }

原文地址:https://www.cnblogs.com/zjm1999/p/10116218.html