JAVA课程设计-飞机大战
1.团队名称、团队成员介绍
1.1 团队名称:做个飞机哦
1.2团队成员介绍:
余俊良(组长):编写博客、游戏主界面设计与实现、英雄机与子弹类的实现、场景设计
林祥涛:游戏音效设计、玩家类编码与设计、小Boss类设计、ppt设计
高凯:画uml类图、积分榜设计、游戏道具定义实现、游戏状态设计
2.项目git地址
https://gitee.com/net_201821123052/Planewar.git
3.项目git提交记录截图
4.前期调查及游戏介绍
玩家通过控制飞机发射子弹击中不同的敌机获取积分,击中快速移动的浮标获得奖励(获得双倍子弹奖励、生命值增加)。游戏过程伴随着背景音乐,而且击中敌机或生命耗尽后会产生相应音效。与敌机相撞则扣除生命值1点,直到生命值为0,游戏结束,玩法简单有趣,锻炼反应能力。
5.项目功能架构图、主要功能流程图
6.面向对象设计包图、类图
包图
类图
7.项目运行截图
主界面显示
英雄机
普通敌机
精英机
小boss
切换飞机
双倍子弹模式
排行榜
奖励
游戏结束
8.项目关键代码
8.1鼠标事件
使用鼠标事件监听MouseAdapter对鼠标进行监听,当鼠标移动时获取鼠标的坐标,点击时开启游戏,鼠标移出窗体后游戏暂停,移入则继续。
MouseAdapter m = new MouseAdapter() {
// 鼠标移动事件
public void mouseMoved(MouseEvent e) {// 鼠标坐标获取
if (Running == state) {
hero.moveTo(e.getX(), e.getY());
}
}
// 鼠标点击事件
public void mouseClicked(MouseEvent e) {
if (Start == state) {// 点击开始游戏
state = Running;
} else if (Over == state) {// 游戏结束后点击重新开始
state = Start;
score = 0;// 积分,飞行物重置
hero = new Heroplane();
flyobj = new ArrayList<AbstractFlyingObject>();
bullets = new ArrayList<Bullet>();
}
}
// 鼠标移出事件
public void mouseExited(MouseEvent e) {
if (Running == state) {// 移出窗体,游戏暂停
state = Pause;
}
}
// 鼠标移入事件
public void mouseEntered(MouseEvent e) {// 移回窗体,游戏继续
if (Pause == state) {
state = Running;
}
}
};
8.2双缓冲技术消除闪屏
闪屏的出现是因为在while循环中执行线程时每循环一次便会重绘一次,而update()方法即会先清理掉当前的画面再重新绘制新的画面。可以在内存中重新开辟新空间,作为后台图像,本应该在界面上进行清理与重绘现在内存中先实现,生成新画面,最后显示到屏幕上。
private Image offScreenImage = null;// 利用双缓冲技术消除屏幕闪烁
public void update(Graphics g) {
if (offScreenImage == null) {
offScreenImage = this.createImage(WIDTH, HEIGHT);
}
Graphics gOff = offScreenImage.getGraphics();
paint(gOff);
g.drawImage(offScreenImage, 0, 0, null);
}
8.3飞行物显示
通过根据状态不断重绘飞行物来达到动画效果
Timer timer = new Timer();
int timeGap = 10;// 设定时间隔
timer.schedule(new TimerTask() {
public void run() {
if (state == Running) {
heroBulletEnter();// 英雄子弹的入场
enemyEnter();// 敌机的入场
enemyStep();// 敌机的移动
outBoundDel();// 删除越界(底)的敌机和子弹
enemyCrash();// 英雄机子弹与敌人相撞(子弹和敌机退场)
checkGame();// 检查游戏是否结束(敌机和英雄机相撞)
}
repaint();// 重画
}
}, timeGap, timeGap);// timeGap为每一次到下一次的触发间隔
9.项目代码扫描结果及改正
9.1第一次扫描结果
9.2扫描修正
在所有的覆写方法前增加@Override注释
常量名应当全部大写,单词用下划线隔开
switch块中,每个case都应通过break/default来终止
方法内部单行注释,在被注释语句上方另一行使用//注释,多行注释使用/**/注释
9.3全部修正后结果
10.项目总结
10.1不足
原先计划能够在完成单人模式的基础上增加联网模式,但是在基本完成单人模式后剩余的时间的确不够去实现联网。设计的敌机类型也不够多,道具类型也可以再增加。
10.2展望
在课设完成后利用课余时间增加网络模式,并在网络中进行线上合作与排行