关于飞机大战的非最终版源码
历时一周,在教程的指导下完成。
窗口类
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 }

浙公网安备 33010602011771号