博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java面向对象实践 ——写飞机大战游戏小项目
阅读量:5348 次
发布时间:2019-06-15

本文共 5969 字,大约阅读时间需要 19 分钟。

    飞机大战小游戏是练习面向对象的常用项目,用于练习面向对象编程的方法。在学完Java基础和面向对象基础后,经过一个星期零散时间的学习,跟着视频教程写了个飞机大战小游戏项目!通过这个小游戏项目更深刻了解了面向对象的编程思维,练习了Java面向对象的编程方法。下面简单介绍一下该项目,并贴出源码,源码中添加了大量注释,其中也有个人的一些见解和看法。

    游戏的基本功能已经实现,其中仍不乏一些小的bug,项目还有很多可以改进的细节。考虑以后慢慢改进完善,在这里先对基本项目展示。

 

游戏小项目的项目工程文件:

 

MyGameFrame类(游戏窗口主类)

package cn.ftf.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;import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;import java.util.Date;/** * 飞机游戏的主窗口,项目的主类! * @author 房廷飞 * */public class MyGameFrame extends Frame{  //继承窗口类    Image sky=GameUtil.getImage("images/sky.jpg");  //导入飞机和背景导入飞机和背景    Image planeImg=GameUtil.getImage("images/plane.png");    Plane plane=new Plane(planeImg,250,250);  //新建了一个class飞机类,方便对飞机的细节设置,这里调用即可。体现面向对象的思想!    Shell[] shells = new Shell[20];    //初始化炮弹20个    //新建一个class炮弹类,方便对炮弹的细节设置,这里调用即可!体现面向对象的思想!    Explode bao;  //声明一下爆炸类    //新建一个class爆炸类,方便对爆炸的细节设置,这里调用即可!体现面向对象的思想!    Date startTime=new Date();    //新建一个时间对象,用来获取此时时间    Date endTime;                 //声明一个时间对象    int contime;                  //游戏持续的时间            //paint类不用被调用,自动执行    @Override    public void paint(Graphics g) {  //自动被调用,g相当于一个画笔        g.drawImage(sky, 0, 0, null);        plane.drawSelf(g);  //传画笔,画飞机        for(int i=0;i

 

GameObject类(游戏物体的父类)

package cn.ftf.game;import java.awt.Graphics;import java.awt.Image;import java.awt.Rectangle;//import javax.sound.midi.Receiver;/** * 建一个游戏物体的父类,方便各模块调用 * @author 房廷飞 * */public class GameObject {     Image img;     double x,y;     int speed=20;     int width,height;        //画出自己    public void drawSelf(Graphics g) {        g.drawImage(img,(int)x,(int)y,null);    }    //多建几个构造器,方便以后调用    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 GameObject(Image img, double x, double y) {        super();        this.img = img;        this.x = x;        this.y = y;    }    public GameObject() {        // TODO Auto-generated constructor stub    }    //返回宽度长度等,方便以后碰撞检测    public Rectangle getRect() {        return new Rectangle((int)x,(int)y,width,height);    }}

 

Plane类(飞机对象类)

package cn.ftf.game;import java.awt.Graphics;import java.awt.Image;import java.awt.event.KeyEvent;//写一个飞机类方便以后调用public class Plane extends GameObject{  //继承游戏物体父类    boolean left,right,up,down;        boolean live=true;        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.speed=20;        this.height=img.getHeight(null);        this.width=img.getWidth(null);                    }    //按下某个键,增加相应的方向    public void addDirection(KeyEvent e) {        switch (e.getKeyCode()) {        case KeyEvent.VK_LEFT:            left=true;            break;        case KeyEvent.VK_RIGHT:            right=true;            break;        case KeyEvent.VK_UP:            up=true;            break;        case KeyEvent.VK_DOWN:            down=true;            break;        default:            break;        }    }    public void minusDirection(KeyEvent e) {        switch (e.getKeyCode()) {        case KeyEvent.VK_LEFT:            left=false;            break;        case KeyEvent.VK_RIGHT:            right=false;            break;        case KeyEvent.VK_UP:            up=false;            break;        case KeyEvent.VK_DOWN:            down=false;            break;        default:            break;        }    }}

 

Shell类(炮弹对象类)

package cn.ftf.game;import java.awt.Color;import java.awt.Graphics;/** * 炮弹类 * @author 房廷飞 * */public class Shell extends GameObject{    double degree;        public Shell() {        x=400;        y=40;        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<0||x>Constant.GAME_WIDH-10) {            degree=Math.PI-degree;        }        if(y<30||y>Constant.GAME_HEIGHT-10) {            degree=-degree;        }                g.setColor(c);            }}

 

Explode类(爆炸效果类)

package cn.ftf.game;import java.awt.Graphics;import java.awt.Image; //爆炸类public class Explode {    double x,y;    static Image[] imgs = new Image[7];    static {        for(int i=0;i<7;i++){            imgs[i] = GameUtil.getImage("images/baoImages/"+i+".png");            imgs[i].getWidth(null);        }    }         int count=0;         public void draw(Graphics g){        if(count<=6){                  for(int i=0;i<7;i++)            {                System.out.println("轮播开始!"+count);                g.drawImage(imgs[count], (int)x,(int)y, null);                count++;                }           }    }         public Explode(double x,double y){        this.x = x;        this.y = y;    }}

 

Constant类(常量类)

package cn.ftf.game;//将一些常量放在这里以调用,防止多处修改常量/** * 飞机大战游戏小项目-常量设置中心   * @author 房廷飞 * */public class Constant {    public static final int GAME_WIDH=800;    public static final int GAME_HEIGHT=600;    //public static final int GAME_SLEEP=40;        //画质}

 

 

    以上是该小项目的全部代码,算是对面向对象编程的一个综合实践,下面是游戏运行截图:

 

仅作学习用,先继续往下学习新知识,以后还会解决里面的一些小bug,并进一步优化,届时再做分享!

 

 

2019-03-22    21:37:02     房廷飞        期待明天更好的自己!

转载于:https://www.cnblogs.com/fangtingfei/p/10581144.html

你可能感兴趣的文章
转:LoadRunner中web_custom_request 和 web_submit_data的差别
查看>>
HTC G7直刷MIUI开启A2SD+亲测教程
查看>>
shiro的rememberMe不生效
查看>>
const 不兼容的类型限定符问题
查看>>
OpenCV的配置
查看>>
spring Cache + Redis 开发数据字典以及自定义标签
查看>>
成功连上数据库顿感世界美好许多
查看>>
编程注意2
查看>>
《C++ Primer Plus》第12章 类和动态内存分配 学习笔记
查看>>
javascript中sort()排序方法总结
查看>>
实现聊天界面的代码
查看>>
自己生成一个NDK的浅析
查看>>
Excel数据导入到数据库
查看>>
jQuery最佳实践
查看>>
SELinux FAQ
查看>>
Java中synchronized同步的理解
查看>>
python 数值计算库
查看>>
java 服务重启 js 中被注释代码仍然执行
查看>>
我并不是不闻不问![C#]
查看>>
web前端经典小题
查看>>