• 飞机躲避炮弹---java


    最近闲来无事,花了一天多的时间写了一个小游戏,虽然说游戏本身很无聊吧,但是自己也从这个过程中学到了许多东西。。。分享一下。

    代码内容自行理解吧。。。

    层次结构:

      1 package cn.sxt.game;
      2 
      3 import java.awt.Color;
      4 import java.awt.Font;
      5 import java.awt.Frame;
      6 import java.awt.Graphics;
      7 import java.awt.Image;
      8 import java.awt.event.KeyAdapter;
      9 import java.awt.event.KeyEvent;
     10 import java.awt.event.WindowAdapter;
     11 import java.awt.event.WindowEvent;
     12 import java.util.Date;
     13 
     14 import javax.swing.JFrame;
     15 
     16 /*
     17  * 飞机游戏的主窗口
     18  * @author Brave_WTZ
     19  */
     20 public class MyGameFrame extends Frame{
     21     
     22     Image bgImg = GameUtil.getImage("images/bg.jpg");
     23     Image planeImg = GameUtil.getImage("images/plane.png");
     24     
     25     Plane plane = new Plane(planeImg,250,250);
     26     Shell[] shells = new Shell[20];//声明50个炮弹
     27     
     28     Explode bao;
     29     
     30     Date startTime = new Date();
     31     Date endTime;
     32     int period;//游戏持续的时间
     33     
     34     @Override 
     35     public void paint(Graphics g) {//自动被调用
     36         Color c = g.getColor();
     37         
     38         g.drawImage(bgImg,0,0,null);
     39         
     40         plane.drawSelf(g);//画飞机
     41          
     42         /*画出所有的炮弹*/
     43         for( int i=0; i<shells.length; i++ ) {
     44             shells[i].draw(g);//画炮弹
     45             
     46             /*飞机和炮弹的碰撞检测!!!*/
     47             boolean peng = shells[i].getRect().intersects(plane.getRect());
     48             if(peng) {
     49                  plane.live = false; 
     50                  if(bao==null) {
     51                      bao = new Explode(plane.x,plane.y);
     52                       
     53                      endTime = new Date();
     54                      period = (int)((endTime.getTime()-startTime.getTime())/1000);
     55                  }                 
     56                  bao.draw(g);
     57             }
     58             if(!plane.live) {
     59                 g.setColor(Color.white);
     60                 Font f = new Font("宋体",Font.BOLD,50);
     61                 g.setFont(f);
     62                 g.drawString("时间:"+period+"秒", (int)plane.x, (int)plane.y);
     63             }
     64         }
     65         
     66         g.setColor(c); 
     67     }
     68     
     69     /*定义内部类,方便实用外部类的属性*/
     70     class PaintThread extends Thread{
     71         @Override
     72         public void run() { 
     73             while(true) {//帮助我们反复重画窗口
     74                 repaint();//重画
     75                 
     76                 try {
     77                     Thread.sleep(40);/*动态视觉效果是由一帧帧照片连续而成*/
     78                 } catch (InterruptedException e) {
     79                     // TODO Auto-generated catch block
     80                     e.printStackTrace();
     81                 }
     82             }
     83         }
     84     }
     85     
     86     /* 
     87      * 定义键盘监听的内部类
     88      */
     89     class KeyMonitor extends KeyAdapter{
     90         @Override
     91         public void keyPressed(KeyEvent e) {
     92             plane.addDirection(e);
     93         } 
     94         @Override
     95         public void keyReleased(KeyEvent e) { 
     96             plane.minusDirection(e);
     97         }
     98     } 
     99     
    100     /*
    101      * 初始化窗口
    102      */
    103     public void launchFrame() {
    104         this.setTitle("Brave_WZT");
    105         this.setVisible(true); 
    106         this.setSize(Constant.GAME_WIDTH,Constant.GAME_HEIGHT);
    107         this.setLocation(300,300);
    108         //正常情况下推出虚拟机操作
    109         this.addWindowListener(new WindowAdapter(){
    110             public void windowClosing(WindowEvent e) {
    111                 System.exit(0); 
    112             }
    113         }); 
    114         
    115         new PaintThread().start();//启动线程
    116         addKeyListener(new KeyMonitor());//启动键盘监听
    117         
    118         //初始化50个炮弹
    119         for( int i=0; i<shells.length; i++ ) {
    120             shells[i] = new Shell();
    121         }
    122     }
    123     
    124     /*
    125      * 双缓冲技术,解决Frame中画面闪烁问题
    126      */ 
    127     private Image offScreenImage = null;
    128      
    129     public void update(Graphics g) {
    130         if(offScreenImage == null)
    131             offScreenImage = this.createImage(Constant.GAME_WIDTH,Constant.GAME_HEIGHT);//这是游戏窗口的宽度和高度
    132          
    133         Graphics gOff = offScreenImage.getGraphics();
    134         paint(gOff);
    135         g.drawImage(offScreenImage, 0, 0, null);
    136     }   
    137     
    138     
    139     public static void main(String[] args) {
    140         MyGameFrame f = new MyGameFrame();
    141         f.launchFrame();
    142     
    143     }
    144 }
    飞机游戏的主窗口
     1 package cn.sxt.game;
     2 
     3 import java.awt.Graphics;
     4 import java.awt.Image;
     5 import java.awt.event.KeyEvent;
     6 
     7 /*
     8  * 飞机类
     9  * @author Brave_WTZ
    10  */
    11 
    12 public class Plane extends GameObject{
    13     
    14     boolean left,up,right,down; 
    15     
    16     boolean live = true;
    17     
    18     public Plane(Image img,double x,double y) {
    19         this.img=img;
    20         this.x=x;
    21         this.y=y;
    22         this.speed=6;
    23         this.width=100;
    24         this.height=100;
    25     }
    26     
    27     public void drawSelf(Graphics g) {
    28         if(live) {
    29             g.drawImage(img,(int)x,(int)y,null);
    30             if(left) {
    31                 x-=speed;
    32             }
    33             if(right) {
    34                 x+=speed;
    35             }
    36             if(up) {
    37                 y-=speed;
    38             }
    39             if(down) {
    40                 y+=speed;
    41             }
    42         }else {
    43             
    44         }
    45     }
    46 
    47 
    48     //按下某个键,启动这个方向
    49     public void addDirection(KeyEvent e) {
    50         switch(e.getKeyCode()) {
    51         case KeyEvent.VK_LEFT:
    52             left=true;
    53             break;
    54         case KeyEvent.VK_UP:
    55             up=true;
    56             break;
    57         case KeyEvent.VK_RIGHT:
    58             right=true;
    59             break;
    60         case KeyEvent.VK_DOWN:
    61             down=true;
    62             break;
    63         }
    64     }
    65     //松开某个键,取消相应的方向
    66     public void minusDirection(KeyEvent e) {
    67         switch(e.getKeyCode()) {
    68         case KeyEvent.VK_LEFT:
    69             left=false;break;
    70         case KeyEvent.VK_UP:
    71             up=false;break;
    72         case KeyEvent.VK_RIGHT:
    73             right=false;break;
    74         case KeyEvent.VK_DOWN:
    75             down=false;break;
    76         }
    77     }
    78 }
    飞机类
     1 package cn.sxt.game;
     2 
     3 import java.awt.Color;
     4 import java.awt.Graphics;
     5 
     6 /*
     7  * 炮弹类
     8  * @author Brave_WTZ
     9  */
    10 
    11 public class Shell extends GameObject{
    12     
    13     double degree;
    14     public Shell(){
    15         x=200;
    16         y=200;
    17         width=7;
    18         height=7;
    19         speed=3;
    20         
    21         degree=Math.random()*Math.PI*2;//定义炮弹类方向
    22     }
    23       
    24     public void draw(Graphics g) {
    25         Color c = g.getColor();//tip:预先将原Graphics颜色加以保留
    26         g.setColor(Color.pink); 
    27         
    28         g.fillOval((int)x,(int)y, width, height);/*填充pink色炮弹*/
    29         
    30         /*炮弹沿任意角度去飞*/
    31         x+=speed*Math.cos(degree);
    32         y+=speed*Math.sin(degree);
    33          
    34         if(x<0||x>Constant.GAME_WIDTH-width) {
    35             degree = Math.PI-degree;
    36 //            System.out.println("嘤嘤嘤");
    37         }
    38         if(y<30||y>Constant.GAME_HEIGHT-height) {
    39             degree = -degree;
    40 //            System.out.println("嘤嘤嘤");
    41         }
    42         
    43         g.setColor(c); 
    44     }
    45 }
    炮弹类
     1 package cn.sxt.game;
     2 
     3 import java.awt.Graphics;
     4 import java.awt.Image;
     5 
     6 /*
     7  * 爆炸类
     8  * @author Brave_WTZ
     9  */
    10 public class Explode {
    11     double x,y;
    12     
    13     static Image[] imgs = new Image[16];
    14     static {
    15         for( int i=0; i<16; i++ ) {
    16             imgs[i] = GameUtil.getImage("images/explode/e"+(i+1)+".gif");
    17             imgs[i].getWidth(null);
    18         }
    19     }
    20     
    21     int count;
    22     
    23     public void draw(Graphics g) {
    24         if(count<=15) {
    25             g.drawImage(imgs[count], (int)x, (int)y, null);
    26             count++;
    27         }
    28     } 
    29     public Explode(double x,double y) {
    30         this.x=x;
    31         this.y=y;
    32     }
    33 }
    爆炸类
     1 package cn.sxt.game;
     2 
     3 import java.awt.Graphics;
     4 import java.awt.Image;
     5 import java.awt.Rectangle;
     6 
     7 /*
     8  * 游戏物体的父类
     9  * @author Brave_WTZ
    10  */ 
    11 public class GameObject {
    12     Image img;
    13     double x,y;
    14     int speed;
    15     int width,height;
    16     
    17     public void drawSelf(Graphics g) {
    18         g.drawImage(img,(int)x,(int)y,null);
    19     } 
    20    
    21     public GameObject(Image img, double x, double y, int speed, int width, int height) {
    22         super();
    23         this.img = img;
    24         this.x = x;
    25         this.y = y;
    26         this.speed = speed; 
    27         this.width = width;
    28         this.height = height; 
    29     } 
    30 
    31     public GameObject(double x, double y) {
    32         super(); 
    33         this.x = x;
    34         this.y = y; 
    35     }
    36     
    37     public GameObject() {  
    38         
    39     }
    40     /*
    41      * 返回物体所在矩形,便于碰撞检测
    42      */
    43     public Rectangle getRect() {
    44         return new Rectangle((int)x,(int)y,width,height);
    45     }
    46     
    47 }
    游戏物体的父类
     1 package cn.sxt.game;
     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      * 返回指定路径文件的图片对象
    16      * 
    17      */ 
    18     public static Image getImage(String path) {
    19         BufferedImage bi = null;
    20         try {
    21             URL u = GameUtil.class.getClassLoader().getResource(path);
    22             bi = ImageIO.read(u);
    23         } catch (IOException e) {
    24             e.printStackTrace();
    25         }
    26         return bi;
    27     }
    28 }
    工具类
    1 package cn.sxt.game;
    2 
    3 public class Constant {
    4 
    5     public static final int GAME_WIDTH = 1024;
    6     public static final int GAME_HEIGHT = 700;
    7 }
    常量类

    看看效果图:

    下面是游戏代码用到的游戏素材:

     

    有些目标看似很遥远,但只要付出足够多的努力,这一切总有可能实现!
  • 相关阅读:
    git版本回退问题记录
    git add的各种情况分类
    代码优化积累【持续更新】
    package.json和package-lock.json的区别
    new Date在IE下面兼容问题
    git fetch和git pull的区别
    Node.Js的热更新服务——supervisor
    springboot 指定启动环境
    java后台解决上传图片翻转90的问题,有demo,经过测试可用
    intellij IDEA 实用快捷键
  • 原文地址:https://www.cnblogs.com/Bravewtz/p/10353918.html
Copyright © 2020-2023  润新知