java飞机小项目总结

--------------------------java飞机小项目总结-----------------------------

游戏一共有7个类

分别是:

       静态属性类

       爆炸类

       游戏物品父类

       游戏图片加载工具类

       游戏主窗口类     

       飞机类

       子弹类



图片需要自己动手去找

 

--------------静态属性类-----------------------

代码如下

package cn.tx.game;

 

public class Constant {

   

    public static  final  intGAME_WIDTH = 900;

    public static  final  intGAME_HEIGHT = 700;

}

 

 

--------------爆炸类-----------------------

代码如下

 

package  cn.tx.game;

import  java.awt.Graphics;

import  java.awt.Image;

 

/*

 * 爆炸类

 */

public class   Explode {

    double x,y;

    static Image[] imgs = new Image[14];

    static {

        for(int i=0;i<14;i++){

            imgs[i] =GameUtil.getImage("images/explode/e"+(i+1)+".jpg");

            imgs[i].getWidth(null);

        }

    }

    

    int count = 1;

     

    public void draw(Graphics g){

        if(count<=14){

            g.drawImage(imgs[count], (int)x,(int)y, null);

            count++;

        }

    }

    

    public Explode(double x,double y){

        this.x = x;

        this.y = y;

    }

}

 

 

 

---------------游戏父类---------------------

 

package  cn.tx.game;

 

import  java.awt.Graphics;

import  java.awt.Image;

import  java.awt.Rectangle;

 

/**

 * 游戏物品的父类

 * @author 李昆鹏

 *

 */

public class GameObject{

     //图片对象名

     Image  img;

   

     //画出图片的位置

     double x,y;

   

     public GameObject() {

        super();

    }

 

    //图片移动的速度

     int  speed;

   

     //高宽

     int  width,height;

     

     public GameObject(Image img, double x, doubley) {

        super();

        this.img = img;

        this.x = x;

        this.y = y;

    }

 

    public GameObject(Image img, double x,double y, int speed, int width, int height) {

        super();

        this.img = img;

        this.x = x;

        this.y = y;

        this.speed = speed;

        this.width = width;

        this.height = height;

    }

   

    //画出图片对象

    public void drawSelf(Graphics g) {

         g.drawImage(img, (int)x, (int)y, null);

     }

   

    //为了做游戏的碰撞检测,每次画完图片返回一个矩形

    public Rectangle getRect() {

        return new  Rectangle((int)x,(int)y,width,height);

    }

   

}

 

 

----------------------图片加载工具类-------------------

 

package  cn.tx.game;

import  java.awt.Image;

import  java.awt.image.BufferedImage;

import  java.io.IOException;

import  java.net.URL;

import  javax.imageio.ImageIO;

 /**

  * 图片加载工具类

  * @author 李昆鹏

  *

  */

public class  GameUtil {

    // 工具类最好将构造器私有化。

    private GameUtil() {

    

    }

    /**

     * 指定路径文件的图片对象

     * @param path

     * @return

     */

 

    public static Image getImage(String path) {

        BufferedImage bi = null;

        try {

            URL u =GameUtil.class.getClassLoader().getResource(path);

            bi = ImageIO.read(u);

        } catch (IOException e) {

            e.printStackTrace();

        }

        return bi;

    }

}

 

 

--------------------游戏主窗口类---------------------

 

package  cn.tx.game;

 

import  java.awt.Color;

import  java.awt.Font;

import  java.awt.Frame;

import  java.awt.Graphics;

import  java.awt.Image;

import  java.awt.event.KeyAdapter;

import  java.awt.event.KeyEvent;

importjava.awt.event.WindowAdapter;

import  java.awt.event.WindowEvent;

import  java.util.Date;

 

/**

 * 飞机游戏的主窗口

 *

 * @author李昆鹏

 *

 */

 

// 第一步需要继承一个JFrame类。它是java.swing下的一个类

// 使用Frame加入双缓冲,改善游戏闪烁问题

public  class MyGameFrame extends Frame {

    // 加载图片对象

    Image backdrop = GameUtil.getImage("images/backdrop.jpg");

    Image plane = GameUtil.getImage("images/plane.png");

 

    // 创建飞机对象

    Plane p = new Plane(plane, 400, 350);

    // 用数组画出多个炮弹

    Shell[] shells = new Shell[50];

    // 声明爆炸对象

    Explode e1;

 

    // 创建游戏开始时间

    Date startTime = new Date();

 

    // 声明游戏结束时间

    Date endTime;

 

    // 游戏持续的时间

    int  period;

 

    // 设置两个坐标

    int  planeX = 250, planeY = 250;

 

    /**

     *paint方法是帮助我们绘制东西的此方法自动被调用 g是代表一支画笔

     */

 

    @Override

    public void paint(Graphics g) {

 

        Color c = g.getColor();

        // 加载图片背景

        g.drawImage(backdrop, 0, 0, null);

        // 画出飞机

        p.drawSelf(g);

        // 画出50个炮弹

        for (inti = 0; i < 50; i++) {

            shells[i].draw(g);

 

            // 飞机和炮弹的碰撞检测方法

            boolean  peng = shells[i].getRect().intersects(p.getRect());

            if (peng) {

                p.live = false;

                // 创建爆炸对象

                if (e1 == null) {

                   e1 = new Explode(p.x, p.y);

                   // 创建游戏结束时间

                   endTime = new Date();

                   // 计算游戏持续时间

                   period = (int) ((endTime.getTime() - startTime.getTime()) / 1000);

                }

                // 计算只打印一次爆炸效果

                e1.draw(g);

 

            }

 

        }

 

        if (!p.live) {

            // 打印游戏持续时间

            g.setColor(Color.red);

            Font f = new Font("宋体", Font.BOLD, 50);

            g.setFont(f);

            g.drawString("时间" + period + "", (int) p.x, (int) p.y);

        }

 

        g.setColor(c);

 

    }

 

    // 内部类的好处就是直接可以使用外部类的属性和方法

    // 这个内部类可以帮助我们反复的重画窗口

    class PaintThread extends  Thread {

 

        @Override

        // 重画方法

        public  void run() {

            while (true) {

                // 测试窗口是否被重画

                // System.out.println("窗口重画");

                // 重画窗口

                repaint();

 

                // 当一个图片一秒跳动20多次时,人的肉眼就看成是动画

                // 所以每次重画后就休眠40毫秒

                try {

                   Thread.sleep(40);

                } catch (InterruptedException e) {

                   e.printStackTrace();

                }

            }

        }

    }

 

    // 创建键盘监听内部类

    class KeyMonitor extends KeyAdapter {

 

        // 按下键的信息

        @Override

        publicvoid keyPressed(KeyEvent e) {

            p.addDirection(e);

        }

 

        // 抬起键的信息

        @Override

        publicvoid keyReleased(KeyEvent e) {

            p.minusDirection(e);

        }

 

    }

 

    /**

     * 初始化窗口

     */

    public  void launchFrame() {

        // 框架的标题

        this.setTitle("李昆鹏的作品");

        // 框架默认的可见度是关闭的,我们现在把它打开

        this.setVisible(true);

        // 设置框架的大小,框架的左上角是xy轴的原点0

        this.setSize(Constant.GAME_WIDTH, Constant.GAME_HEIGHT);

        // 初始化窗口显示的位置

        this.setLocation(300, 50);

 

        // 关闭框架的同时需要执行以下代码才能关闭程序

        this.addWindowListener(new WindowAdapter() {

 

            // alt + ? 快速寻找重写方法

            @Override

            publicvoid windowClosing(WindowEvent e) {

                // ()里面填0代表退出虚拟机

                System.exit(0);

            }

 

        });

 

        // 启动重画窗口的线程

        new PaintThread().start();

        // 给窗口添加键盘监听

        addKeyListener(new KeyMonitor());

 

        // 初始化50个炮弹

        for (inti = 0; i < 50; i++) {

            shells[i] = new Shell();

 

        }

 

    }

 

    // 实现双缓冲代码

    private Image offScreenImage = null;

 

    public  void update(Graphics g) {

        if (offScreenImage == null)

            offScreenImage = this.createImage(Constant.GAME_WIDTH, Constant.GAME_HEIGHT);// 这是游戏窗口的宽度和高度

 

        Graphics gOff = offScreenImage.getGraphics();

        paint(gOff);

        g.drawImage(offScreenImage, 0, 0, null);

    }

 

    /**

     * 测试初始化窗口的方法

     */

 

    public  static  void main(String[] args) {

 

        MyGameFrame f = new MyGameFrame();

        f.launchFrame();

 

    }

 

}

 

 

 

-----------------------飞机类----------------------------

 

package  cn.tx.game;

 

import  java.awt.Graphics;

import  java.awt.Image;

import  java.awt.event.KeyEvent;

 

/**

 * 创建一个飞机类继承游戏父类

 * @author 李昆鹏

 *

 */

public class Planeextends GameObject  {

    //设置飞机存活属性

     boolean live = true;

    //设置移动速度

    int speed = 4;

    //增加四个方向的属性来控制相应移动的方向

    boolean left,up,down,right;

   

    //重写父类的加载图片方法

    @Override

    public void drawSelf(Graphics g) {

     if(live) {

        g.drawImage(img, (int)x, (int)y,null);

 

 

        if(left)

            x -= speed;

       

        if(right)

            x += speed;

       

        if(up)

            y -= speed;

       

        if(down)

            y += speed;

     }

         

     }

     

   

   

    public Plane(Image img, double x, double y){

       

        this.img = img;

        this.x = x;

        this.y = y;

        this.width = 20;

        this.height = 20;

       

    }

   

    //按下某个键增加相应的方向

    public void addDirection(KeyEvent e) {

        switch(e.getKeyCode()) {

        case KeyEvent.VK_UP:

            up = true;

            break;

        case KeyEvent.VK_LEFT:

            left = true;

            break;

        case KeyEvent.VK_DOWN:

            down = true;

            break;

        case KeyEvent.VK_RIGHT:

            right = true;

            break;

        }

    }

       

        //当键盘抬起来取消相应的方向

        public void minusDirection(KeyEvent e) {

            switch(e.getKeyCode()) {

            case KeyEvent.VK_UP:

                up = false;

                break;

            case KeyEvent.VK_LEFT:

                left = false;

                break;

            case KeyEvent.VK_DOWN:

                down = false;

                break;

            case KeyEvent.VK_RIGHT:

                right = false;

                break;

            }

        }

}

 

-----------------------子弹类-------------------------

 

package  cn.tx.game;

 

import  java.awt.Color;

import  java.awt.Graphics;

 

/**

 * 炮弹类

 * @author 李昆鹏

 *

 */

public class Shellextends GameObject {

 

    double degree;

   

    public Shell(){

        x= 200;

        y= 200;

        width = 10;

        height = 10;

        speed =3;

       

        //创建炮弹产出的随机数

        degree = Math.random()*Math.PI*2;

    }

   

    public void draw(Graphics g) {

        Color c = g.getColor();

        g.setColor(Color.YELLOW);

       

        g.fillOval((int)x, (int)y, width,height);

       

        //炮弹沿着任意角度飞

        x += speed*Math.cos(degree);

        y += speed*Math.sin(degree);

       

        //实现炮弹反弹

        if(x < width || x >Constant.GAME_WIDTH - width)

            degree =  Math.PI - degree;

        if(y < 30 || y >Constant.GAME_HEIGHT-height)

            degree =   -degree;

       

       

        g.setColor(c);

    }

}

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值