Java编写飞行游戏

来源:互联网 发布:js添加节点并添加内容 编辑:程序博客网 时间:2024/05/16 06:10

一丶窗口,常量,Image构造器

package tk.javazhangwei.util;import java.awt.Frame;import java.awt.Graphics;import java.awt.Image;import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;public class MyFrame  extends Frame {    /**     * 加载窗口     */    public void launchFrame(){        setSize(Constant.GAME_WIDTH, Constant.GAME_HEIGHT);        setLocation(100, 100);        setVisible(true);        new PaintThread().start();  //启动重画线程        addWindowListener(new WindowAdapter() {            @Override            public void windowClosing(WindowEvent e) {                System.exit(0);            }        });    }    /***     *      * 双缓冲技术     */    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);    }    /**     * 定义一个重画窗口的线程类,是一个内部类     * @author dell     *     */    class PaintThread extends Thread {        public void run(){            while(true){                repaint();                try {                    Thread.sleep(40); //1s = 1000ms                } catch (InterruptedException e) {                    e.printStackTrace();                }               }        }    }}
package tk.javazhangwei.util;/** * 游戏项目中用到的常量 * @author dell * */public class Constant {    public static final int GAME_WIDTH = 500;    public static final int GAME_HEIGHT = 500;}
package tk.javazhangwei.util;import java.awt.Image;import java.awt.image.BufferedImage;import java.io.IOException;import java.net.URL;public class GameUtil {    private GameUtil(){}  //工具类最好将构造器私有了。    public static Image getImage(String path){        BufferedImage bi=null;        try {            URL u = GameUtil.class.getClassLoader().getResource(path);            bi = javax.imageio.ImageIO.read(u);        } catch (IOException e) {            e.printStackTrace();        }        return bi;    }}

二丶游戏主窗口

package tk.zhangwei.games;import java.awt.Color;import java.awt.Font;import java.awt.Graphics;import java.awt.Image;import java.awt.event.KeyAdapter;import java.awt.event.KeyEvent;import java.util.ArrayList;import java.util.Date;import tk.javazhangwei.util.Constant;import tk.javazhangwei.util.GameUtil;import tk.javazhangwei.util.MyFrame;/*** * 飞行游戏主窗口 * @author zw * */public class PlaneGameFrame extends MyFrame {    Image bg = GameUtil.getImage("images/bg.jpg");    Plane p = new Plane("images/plane.png", 230, 400);    ArrayList bulletList = new ArrayList();//以后加上泛型    Date startTime;    Date endTime;    Explode bao;    int bulletNumber = 18;//子弹数目设定    public void paint(Graphics g){        g.drawImage(bg, 0, 0, null);        p.draw(g);        //遍历子弹        for(int i=0;i<bulletList.size();i++){            Bullet b = (Bullet)bulletList.get(i);            b.draw(g);            //检测跟飞机的碰撞            boolean peng = b.getRect().intersects(p.getRect());            if(peng){                p.setLive(false);//飞机死掉                if(bao==null){                    endTime = new Date();                    bao = new Explode(p.x,p.y);                }                bao.draw(g);                break;            }        }        if(!p.isLive()){            printGG(g, "GAME OVER!", 50, 110, 200, Color.red);            int gameTime = (int)((endTime.getTime() - startTime.getTime())/1000);//40行结束时间减去游戏开始            printGG(g, "生存时间:"+gameTime+"秒", 20, 150, 250, Color.blue);            switch (gameTime/10) {            case 0:            case 1:                printGG(g, "游戏评分:★ ", 30, 140, 300, Color.blue);                break;            case 2:                printGG(g, "游戏评分:★ ★", 30, 140, 300, Color.blue);                break;            case 3:            case 4:                printGG(g, "游戏评分:★ ★★", 30, 140, 300, Color.blue);                break;            case 5:                printGG(g, "游戏评分:★ ★★★", 30, 140, 300, Color.blue);                break;            default:                printGG(g, "游戏评分:★ ★★★★", 30, 140, 300, Color.blue);                break;            }        }    }    /***     * 封装飞机死后,打印窗口提示信息     * @param g     * @param str     * @param size     */    public void printGG(Graphics g,String str,int size,int x,int y,Color color){        Color c = g.getColor();        Font f = new Font("宋体", Font.BOLD, size);        g.setFont(f);        g.setColor(color);        g.drawString(str, x, y);        g.setColor(c);    }     public static void main(String[] args){        new PlaneGameFrame().launchFrame();    }    public void launchFrame(){        super.launchFrame();//继续使用父类,如果不使用,只会操作键盘监听        //增加键盘监听        addKeyListener(new KeyMonitor());        //生成一堆子弹        for(int i =0;i<bulletNumber;i++){          //生成子弹数目            Bullet b = new Bullet();            bulletList.add(b);        }        startTime = new Date();    }    //定义一个内部类,方便使用外部类的普通属性    class KeyMonitor extends KeyAdapter{        @Override        public void keyPressed(KeyEvent e) {            System.out.println("按下"+e.getKeyCode());            p.add(e);//调用键盘按下事件        }        @Override        public void keyReleased(KeyEvent e) {            System.out.println("释放"+e.getKeyCode());            p.reduce(e);//如果不调用这个方法,当你弹起这个按键,飞机一直会往那个方向飞,不会停止        }    }}

三丶飞机

package tk.zhangwei.games;import java.awt.Graphics;import java.awt.Image;import java.awt.Rectangle;import java.awt.event.KeyEvent;import java.lang.invoke.SwitchPoint;import tk.javazhangwei.util.GameUtil;/*** * 构造飞机方法 * @author zw * */public class Plane extends GameObject {    Image img;    int speed = 6;    private boolean live = true;//默认为true    boolean left,up,right,down;    public void draw(Graphics g){        if(live){            g.drawImage(img, (int)x, (int)y, null);            move();         }    }    /*     * 八个方向的算法     */    public void move(){    //给飞机增加移动属性        if(left){            x -=speed;        }        if(right){            x +=speed;        }        if(up){            y -=speed;        }        if(down){            y +=speed;        }    }    public void add(KeyEvent e){//键盘按下的操作        switch (e.getKeyCode()) {        case 37:            left = true;            break;        case 38:            up = true;            break;        case 39:            right = true;            break;        case 40:            down = true;            break;        default:            break;        }    }    public void reduce(KeyEvent e){//键盘谈起,禁止移动        switch (e.getKeyCode()) {        case 37:            left = false;            break;        case 38:            up = false;            break;        case 39:            right = false;            break;        case 40:            down = false;            break;        default:            break;        }    }    public Plane(String imgpath, double x, double y) {//传入参数,增加图片初始化        this.img = GameUtil.getImage(imgpath);        this.x = x;        this.y = y;        this.width = img.getWidth(null);        this.height = img.getHeight(null);    }    public Plane(){    }    public boolean isLive() {        return live;    }    public void setLive(boolean live) {        this.live = live;    }}

四丶子弹

package tk.zhangwei.games;import java.awt.Color;import java.awt.Graphics;import java.awt.Rectangle;import tk.javazhangwei.util.Constant;/** * 设置子弹 * @author zw * */public class Bullet extends GameObject{    double degree;    public Bullet(){        degree = Math.random()*Math.PI*2;//设置随机角度,在0到360度之间        x = Constant.GAME_WIDTH/2;        y = Constant.GAME_HEIGHT/2;        width = 10;        height = 10;    }    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(y>Constant.GAME_HEIGHT-height||y<30){            degree = -degree;        }        if(x<0||x>Constant.GAME_WIDTH-width){            degree = Math.PI-degree;        }        g.setColor(c);    }}

五丶爆炸效果

package tk.zhangwei.games;import java.awt.Graphics;import java.awt.Image;import tk.javazhangwei.util.GameUtil;/*** * 爆炸 * @author zw * */public class Explode {    double x,y;    static Image[] imgs = new Image[16];    static{        for(int i=0;i<=15;i++ ){            imgs[i] = GameUtil.getImage("explode/e"+(i+1)+".gif");            imgs[i].getWidth(null);        }    }    int count;    public void draw(Graphics g){        if(count<=15){            g.drawImage(imgs[count], (int)x, (int)y, null);            count++;            }    }    public Explode(double x,double y){        this.x = x;        this.y = y;    }}

六丶GameObject

package tk.zhangwei.games;import java.awt.Rectangle;public class GameObject {    double x,y;//子弹初始位置    double degree;    int speed = 3;    int width ;    int height ;    //获取子弹矩形    public Rectangle getRect(){        Rectangle r = new Rectangle((int)x, (int)y, width, height);        return r;    }    public GameObject(double x, double y, double degree, int speed, int width, int height) {        super();        this.x = x;        this.y = y;        this.degree = degree;        this.speed = speed;        this.width = width;        this.height = height;    }    public GameObject(){    }}

七丶运行游戏
111

原创粉丝点击