关于飞机大战的非最终版源码


前言

记录历时一周的飞机大战小成果


文章主题

窗口类

1 package PlayGame;
  2 
  3 import java.awt.Frame;
  4 import java.awt.*;
  5 import java.awt.event.KeyAdapter;
  6 import java.awt.event.KeyEvent;
  7 import java.awt.event.WindowAdapter;
  8 import java.awt.event.WindowEvent;
  9 import java.util.Date;
 10 
 11 public class MyGameFrame extends Frame {
 12     Image bg = GameUtil.getImage("images/背景.png");      //调取图片
 13     Image planeImage = GameUtil.getImage("images/飞机.png");
 14 
 15     Explode explode;    //调用 爆炸 类
 16     Shell[] shells = new Shell[50];     //(数组里放五十个炮弹)
 17     Plane plane = new Plane(planeImage,300,300);//新建对象 接下来plane 就代表了 Plane类
 18     Date starTime = new Date();//开始时间
 19     Date endTime;    //结束时间
 20     int time;       //游戏持续的时间
 21 
 22     //窗口绘制,自动被调用 不需要管他 ,g相当于一只画笔
 23     @Override
 24     public void paint(Graphics g) {
 25         Color aa=g.getColor();      //让画笔最终换回最初的颜色
 26         g.setColor(Color.WHITE);    //给画笔赋予颜色
 27         Font f = new Font("宋体",Font.HANGING_BASELINE,50);   //换字体、粗细、大小
 28         g.setFont(f);
 29 
 30         g.drawImage(bg,0,0,null);    //画背景
 31         plane.drawSelf(g);    //画飞机
 32 
 33         //循环画炮弹
 34         for(int a = 0;a<50;a++ ) {
 35             shells[a].drawSelf(g);
 36 
 37             //飞机和炮弹的碰撞检测
 38             boolean peng =shells[a].getRectangle().intersects(plane.getRectangle());
 39             if(peng){
 40                 plane.live = false;
 41                 explode = new Explode(plane.x, plane.y);
 42                 explode.draw(g);
 43                 //屏幕显示持续时间
 44                 endTime = new Date();
 45                 time = (int) ((endTime.getTime() - starTime.getTime())/1000) ;
 46             }
 47         }
 48         if (!plane.live)
 49             g.drawString("游戏时间:" + time, 150, 150);
 50 
 51         g.setColor(aa);//还回颜色
 52     }
 53 
 54     //内部类,多次重写窗口
 55     class PaintThread extends Thread{
 56         @Override
 57         public void run() {
 58             while(true) {
 59                 repaint();//重画窗口
 60                 try {
 61                     Thread.sleep(40);   //1s=1000ms(毫秒),每40毫秒重画一次,一秒重画25次
 62                 } catch (InterruptedException e) {
 63                     e.printStackTrace();
 64                 }
 65             }
 66         }
 67     }
 68 
 69     //初始化窗口
 70     public void launchFrame(){
 71 
 72         this.setTitle("飞机大战");
 73         //窗口可视化
 74         this.setVisible(true);
 75         //窗口大小
 76         this.setSize(Constant.GAME_WIDH,Constant.GAME_HIGHT);
 77         //窗口位置
 78         this.setLocation(250,300);
 79         //窗口监视(关闭窗口,停止运行)
 80         this.addWindowListener(new WindowAdapter() {
 81             @Override
 82             public void windowClosing(WindowEvent e) {
 83                 System.exit(0);
 84             }
 85         });
 86         addKeyListener(new KeyMonitor());//监听键盘
 87         new PaintThread().start();   //启动重画窗口的线程
 88         //在窗口刚建立的时候就出现飞机
 89         for(int a = 0; a < 50 ; a++){
 90             shells[a] = new Shell();
 91         }
 92     }
 93 
 94     //键盘监视,看按下、抬起哪个键
 95     class KeyMonitor extends KeyAdapter{
 96 
 97         //按下哪个键,增加该键
 98         @Override
 99         public void keyPressed(KeyEvent e) {
100             plane.addDirection(e);
101         }
102         //抬起哪个键,就取消该键
103         @Override
104         public void keyReleased(KeyEvent e) {
105             plane.minusDirection(e);
106         }
107     }
108 
109     //双缓冲
110     private Image offScreenImage = null;
111 
112     public void update(Graphics g) {
113         if(offScreenImage == null)
114             offScreenImage = this.createImage(Constant.GAME_WIDH,Constant.GAME_HIGHT);//这是游戏窗口的宽度和高度
115 
116         Graphics gOff = offScreenImage.getGraphics();
117         paint(gOff);
118         g.drawImage(offScreenImage, 0, 0, null);
119     }
120 
121 
122     public static void main(String[] args) {
123         MyGameFrame mFame = new MyGameFrame();
124         mFame.launchFrame();
125     }
126 }

飞机类

1 package PlayGame;
 2 
 3 import java.awt.*;
 4 import java.awt.event.KeyEvent;
 5 
 6 public class Plane extends GameObject {
 7     int speed = 5;
 8     boolean live = true;
 9 
10     boolean left,right,up,down;//飞机方向
11 
12     public void drawSelf(Graphics g) {
13 
14 
15         //通过判断上下左右键的真假值,来使得飞机移动
16         if(live) {
17 
18             g.drawImage(img, (int) x, (int) y, null);
19             if (left) {             //如果 left 是真,坐标x-speed(x = 50 ,speed = 1,就是说明按一下left键 ,就成了49)
20                 x -= speed;
21             }
22             if (right) {
23                 x += speed;
24             }
25             if (up) {
26                 y -= speed;
27             }
28             if (down) {
29                 y += speed;
30             }
31         }
32     }
33 
34     //被调用对象,传送图片,坐标
35     public Plane(Image img, double x, double y) {
36         this.img = img;
37         this.x = x;
38         this.y = y;
39         this.height = img.getWidth(null);
40         this.width = img.getWidth(null);
41 
42     }
43 
44     //按下某个键,增加相应的方向
45     public void addDirection(KeyEvent e){
46         switch (e.getKeyCode()){
47             case KeyEvent.VK_LEFT:  //KeyEvent.VK_left :告诉left对应的数字是多少
48                 left = true;
49                 break;
50             case KeyEvent.VK_UP:
51                 up = true;
52                 break;
53             case KeyEvent.VK_RIGHT:
54                 right = true;
55                 break;
56             case KeyEvent.VK_DOWN:
57                 down = true;
58                 break;
59             case KeyEvent.VK_Q:
60                 live = true;
61                 break;
62         }
63     }
64 
65     //按下某个键,取消相应的方向 ,如果不取消 就会一直向这个方向移动
66     public void minusDirection(KeyEvent e){
67         switch (e.getKeyCode()){
68             case KeyEvent.VK_LEFT:  //KeyEvent.VK_left :告诉left对应的数字是多少
69                 left = false;
70                 break;
71             case KeyEvent.VK_UP:
72                 up = false;
73                 break;
74             case KeyEvent.VK_RIGHT:
75                 right = false;
76                 break;
77             case KeyEvent.VK_DOWN:
78                 down = false;
79                 break;
80 
81         }
82     }
83 
84 }

炮弹类

1 package PlayGame;
 2 
 3 import java.awt.*;
 4 
 5 public class Shell extends GameObject{
 6 
 7     double degree;      //角度
 8     Image img = GameUtil.getImage("images/炮弹.png");
 9 
10     public Shell(){
11         degree = Math.random()*Math.PI*2; // random()是0-1之间的随即数,2Π就是360度
12         x = 200;
13         y = 200;
14         width = 10;
15         height = 20;
16         speed = 3;
17     }
18 
19     public void drawSelf(Graphics g){
20         //传进来一直画笔,作为连接两个类的点
21         g.drawImage(img,(int)x,(int)y,width,height,null);
22         //炮弹沿着任意角度飞行
23         x += speed*Math.cos(degree);
24         y += speed*Math.sin(degree);
25 
26         //设立边界
27         if(x<0||x>Constant.GAME_WIDH-height){
28             degree = Math.PI - degree;
29         }
30         if(y<20||y>Constant.GAME_HIGHT-width){
31             degree = -degree;
32         }
33 
34     }
35 
36 
37 
38 
39 }

窗口大小类

1 package PlayGame;
2 
3 public class Constant {
4     public static final int GAME_WIDH = 500;
5     public static final int GAME_HIGHT = 500;
6 
7 }

爆炸特效类

1 package PlayGame;
 2 
 3 import java.awt.*;
 4 
 5 public class Explode extends GameObject{
 6     double x,y;
 7     static Image[] imgs = new Image[16];
 8     static {
 9         for(int i=0;i<6;i++){
10             imgs[i] = GameUtil.getImage("images/"+(i+1)+".png");
11             imgs[i].getWidth(null);
12         }
13     }
14 
15     int count;
16 
17     public void draw(Graphics g){
18         if(count<=15){
19             g.drawImage(imgs[count], (int)x, (int)y, null);
20             count++;
21         }
22     }
23     //x,y是飞机的坐标
24     public Explode(double x,double y){
25         this.x = x;
26         this.y = y;
27     }
28 }

物体父类

1 package PlayGame;
 2 
 3 //游戏物体的父类
 4 
 5 import java.awt.*;
 6 
 7 public class GameObject {
 8     Image img;          //图片
 9     double x, y;         //坐标
10     int speed;          //速度
11     int width, height;   //宽和高
12 
13     //画图
14     public void drawSelf(Graphics g) {
15         g.drawImage(img, (int) x, (int) y, null);
16     }
17 
18     public GameObject(Image img, double x, double y, int speed, int width, int height) {
19         this.img = img;
20         this.x = x;
21         this.y = y;
22         this.speed = speed;
23         this.width = width;
24         this.height = height;
25     }
26 
27     public GameObject(Image img, double x, double y) {
28         this.img = img;
29         this.x = x;
30         this.y = y;
31     }
32 
33     //返回当前物体所在的矩形,便于以后设置碰撞检测
34     public Rectangle getRectangle (){
35         return new Rectangle((int) x,(int) y,width,height);
36     }
37 
38 
39     public GameObject(){
40     }
41 
42 }

工具类

1 package PlayGame;
 2 
 3 import java.awt.Image;
 4 import java.awt.image.BufferedImage;
 5 import java.io.IOException;
 6 import java.net.URL;
 7 import javax.imageio.ImageIO;
 8 
 9 public class GameUtil {
10     // 工具类最好将构造器私有化。这样除了包里面的人外都不能使用。
11     private GameUtil() {
12 
13     }
14     //指定图片路径,返回对象
15     public static Image getImage(String path) {
16         BufferedImage bi = null;
17         try {
18             URL u = GameUtil.class.getClassLoader().getResource(path);
19             bi = ImageIO.read(u);
20         } catch (IOException e) {
21             e.printStackTrace();
22         }
23         return bi;
24     }
25 }

总结

暂无

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值