前言
记录历时一周的飞机大战小成果
文章主题
窗口类
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 }
总结
暂无